<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Compliance on lo0 — Blog Técnico</title><link>https://blog.lo0.es/tags/compliance/</link><description>Recent content in Compliance on lo0 — Blog Técnico</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Tue, 02 Jun 2026 04:30:00 +0200</lastBuildDate><atom:link href="https://blog.lo0.es/tags/compliance/index.xml" rel="self" type="application/rss+xml"/><item><title>Runbooks de incident response para inferencia LLM: cada alerta a una acción concreta con Kafka y Keep</title><link>https://blog.lo0.es/posts/runbooks-incident-response-llm-keep-kafka/</link><pubDate>Tue, 02 Jun 2026 04:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/runbooks-incident-response-llm-keep-kafka/</guid><description>&lt;blockquote>
&lt;p>Este post cierra la trilogía de observabilidad que abrieron &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">Observabilidad GPU para inferencia LLM&lt;/a> (qué métricas) y &lt;a href="https://blog.lo0.es/posts/anatomia-metricas-dcgm-vllm-anomalias/">Anatomía de las doce métricas DCGM y cinco vLLM&lt;/a> (qué anomalía documentada por métrica). Aquí cada anomalía recibe su acción concreta y se encaja en la maquinaria de gestión de incidentes que compliance exige.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>Las alertas de &lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">observabilidad GPU&lt;/a> son inútiles sin un procedimiento codificado por cada una; el operador que las interpreta a mano cada vez opera por intuición. La combinación correcta tiene &lt;strong>tres piezas indispensables&lt;/strong>. (1) &lt;strong>Catálogo de runbooks&lt;/strong>: para cada una de las seis alertas críticas (&lt;code>GpuHbmNearOom&lt;/code>, &lt;code>GpuThermalOrPowerThrottle&lt;/code>, &lt;code>GpuXidErrorDetected&lt;/code>, &lt;code>GpuEccDoubleBit&lt;/code>, &lt;code>VllmKvCachePoolNearFull&lt;/code>, &lt;code>VllmTtftP95OutOfSlo&lt;/code>), severity, mitigación inmediata, evidencia que capturar &lt;strong>antes&lt;/strong> de remediar, acción de resolución, criterio de cierre y trigger de postmortem. (2) &lt;strong>Pipeline reproducible&lt;/strong>: Prometheus + DCGM → Alertmanager → &lt;strong>Kafka como event bus&lt;/strong> (topics &lt;code>gpu.alerts.enriched&lt;/code>, &lt;code>incidents.lifecycle&lt;/code>, &lt;code>audit.actions&lt;/code> con retención WORM) → &lt;strong>Keep como workflow engine&lt;/strong> (workflows declarativos YAML versionados en git) → ejecutores Kubernetes jobs / scripts / ChatOps. (3) &lt;strong>Encaje formal en gestión de incidentes&lt;/strong> según el corpus normativo: &lt;strong>ISO/IEC 27035&lt;/strong> fases &lt;code>identify → report → assess → respond → learn&lt;/code>; &lt;strong>ENS&lt;/strong> controles &lt;code>op.exp.7&lt;/code> (gestión de incidentes), &lt;code>op.exp.8&lt;/code> (registro de actividad), &lt;code>op.exp.10&lt;/code> (notificación a usuarios); &lt;strong>NIS2&lt;/strong> art. 23 con notificación temprana &lt;strong>24 h&lt;/strong>, notificación formal &lt;strong>72 h&lt;/strong> e informe final &lt;strong>1 mes&lt;/strong>; &lt;strong>EU AI Act&lt;/strong> art. 73 para incidente grave de un sistema de alto riesgo, plazos &lt;strong>2 a 15 días&lt;/strong> según severity; &lt;strong>ISO/IEC 42001&lt;/strong> cláusula 10 (mejora continua del AIMS). La taxonomía de acción es &lt;strong>mitigación inmediata&lt;/strong> (drain, throttle, scale-down: contiene el daño en segundos) → &lt;strong>diagnóstico&lt;/strong> (captura de evidencia con &lt;code>nvidia-smi -q&lt;/code>, &lt;code>dmesg&lt;/code>, vLLM &lt;code>/metrics&lt;/code> snapshot, traza OTel relacionada; sin esto el postmortem no es defensible) → &lt;strong>resolución&lt;/strong> (restart, reset, RMA, rollback) → &lt;strong>postmortem&lt;/strong> (RCA por 5-whys, plan de prevención, actualización del runbook). Kafka aporta el &lt;strong>audit trail inmutable&lt;/strong> que ENS y EU AI Act exigen — cada acción ejecutada por Keep o por humano se publica como evento en &lt;code>audit.actions&lt;/code> con timestamp, actor, decisión y evidencia, retenido WORM mínimo 6 meses. Keep aporta los &lt;strong>workflows como código&lt;/strong>: este post incluye tres workflows completos (XID con drain + ticket Jira, ECC DBE con paginación inmediata y bloqueo del nodo en scheduler, canary rollback automático por TTFT P95 fuera de SLO). Cuatro anti-patrones cierran el material: alertas sin runbook (la mayoría), runbook sin captura de evidencia previa (perpetúa el incidente porque la causa raíz se pierde), escalada por antigüedad en vez de severity (operador junior gestiona ECC DBE), ausencia de gate humano para acciones destructivas (Keep ejecutando &lt;code>nvidia-smi --gpu-reset&lt;/code> sin confirmación). Aplicable a un cluster genérico de 4×H100 SXM con Kafka y Keep ya desplegados.&lt;/p>
&lt;h2 id="estás-aquí-observe--deploy-incident-response-cierra-el-bucle">Estás aquí: OBSERVE → DEPLOY (incident response cierra el bucle)&lt;/h2>
&lt;div class="diagram" style="max-width:780px;margin:1rem auto;">
&lt;svg viewBox="0 0 780 90" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="incident response: bucle Observe-Deploy">
&lt;style>.box{stroke:#444;stroke-width:1.4;rx:6}.active{fill:#c9a8e9;stroke-width:3}.semiactive{fill:#cfead0;stroke-width:2}.idle{fill:#f4f4f4}.lbl{font:600 12px sans-serif;fill:#222}.arr{stroke:#666;stroke-width:1.4;fill:none;marker-end:url(#rbm)}.cyc{stroke:#888;stroke-width:1.2;fill:none;stroke-dasharray:4 2;marker-end:url(#rbm)}.loop{stroke:#c33;stroke-width:1.8;fill:none;stroke-dasharray:5 3;marker-end:url(#rbmc)}&lt;/style>
&lt;defs>&lt;marker id="rbm" 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;marker id="rbmc" 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="#c33"/>&lt;/marker>&lt;/defs>
&lt;text x="390" y="20" text-anchor="middle" class="lbl">Incident response: cierra el bucle de OBSERVE a DEPLOY (acción)&lt;/text>
&lt;rect x="30" y="35" width="110" height="35" class="box idle"/>&lt;text x="85" y="58" text-anchor="middle" class="lbl">1 · Data&lt;/text>
&lt;rect x="155" y="35" width="110" height="35" class="box idle"/>&lt;text x="210" y="58" text-anchor="middle" class="lbl">2 · Tune&lt;/text>
&lt;rect x="280" y="35" width="110" height="35" class="box idle"/>&lt;text x="335" y="58" text-anchor="middle" class="lbl">3 · Eval&lt;/text>
&lt;rect x="405" y="35" width="110" height="35" class="box semiactive"/>&lt;text x="460" y="58" text-anchor="middle" class="lbl">4 · Deploy&lt;/text>
&lt;rect x="530" y="35" width="110" height="35" class="box active"/>&lt;text x="585" y="58" text-anchor="middle" class="lbl">5 · Observe&lt;/text>
&lt;rect x="655" y="35" width="110" height="35" class="box idle"/>&lt;text x="710" y="58" text-anchor="middle" class="lbl">6 · Retrain&lt;/text>
&lt;path class="arr" d="M140,52 L155,52"/>&lt;path class="arr" d="M265,52 L280,52"/>&lt;path class="arr" d="M390,52 L405,52"/>&lt;path class="arr" d="M515,52 L530,52"/>&lt;path class="arr" d="M640,52 L655,52"/>
&lt;path class="loop" d="M530,40 C500,5 480,5 460,40"/>
&lt;/svg>
&lt;/div>
&lt;h2 id="la-analogía-la-sala-de-control-de-un-reactor-nuclear">La analogía: la sala de control de un reactor nuclear&lt;/h2>
&lt;p>En una sala de control de central nuclear, el operador de turno &lt;strong>nunca decide qué hacer al ver una alarma&lt;/strong>. La decisión está pre-tomada y codificada en un procedimiento escrito (SOP) que cubre cada alarma del panel: si suena la X, abrir libro X, leer los pasos 1-N, ejecutar exactamente, llamar al supervisor en el paso M, escalar al director de planta en el paso N+3. La razón es estricta: las alarmas críticas son raras pero catastróficas si se gestionan mal; un operador improvisando en una emergencia toma decisiones peores que uno aplicando un procedimiento revisado por expertos y validado por simulación.&lt;/p>
&lt;p>El reactor no espera que el operador sea genio. Espera que conozca los procedimientos al pie de la letra y que el sistema de gestión de operaciones le entregue el procedimiento correcto al momento. Si los procedimientos no están escritos, no están versionados, o no están integrados con las alarmas que disparan, la sala de control opera por intuición. La diferencia entre ambas operaciones —procedimentada vs intuitiva— es la diferencia entre una central que opera 30 años sin incidentes y otra que entra en lista negra.&lt;/p>
&lt;p>El incident response de un cluster de inferencia LLM funciona idéntico. Las alertas DCGM y vLLM que los posts anteriores listaron son las alarmas del panel. Cada una necesita su SOP escrito, versionado, integrado con la alerta que la dispara y revisado tras cada incidente. Sin esa codificación, el operador de turno improvisa en mitad de un fallo de ECC DBE a las 4 de la mañana; con ella, ejecuta los nueve pasos del runbook 12 y el incidente se cierra en 20 minutos.&lt;/p>
&lt;h2 id="la-arquitectura-del-incident-pipeline">La arquitectura del incident pipeline&lt;/h2>
&lt;div class="diagram" style="max-width:840px;margin:1.5rem auto;">
&lt;svg viewBox="0 0 840 320" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="pipeline de incident response">
&lt;style>.b{stroke:#333;stroke-width:1.4;rx:6}.src{fill:#dfe9f5;stroke:#356}.am{fill:#eef0d0;stroke:#7a3}.k{fill:#f4e3cf;stroke:#a63}.kp{fill:#ead8f5;stroke:#634}.ex{fill:#d8eecf;stroke:#373}.au{fill:#f6e2e2;stroke:#a33}.title{font:600 13px sans-serif;fill:#222}.h{font:700 12px sans-serif;fill:#222}.l{font:11px sans-serif;fill:#222}.n{font:italic 10px sans-serif;fill:#444}.arr{stroke:#666;stroke-width:1.4;fill:none;marker-end:url(#pim)}.dbl{stroke:#666;stroke-width:1.4;fill:none;stroke-dasharray:4 2;marker-end:url(#pim)}&lt;/style>
&lt;defs>&lt;marker id="pim" 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;text x="420" y="20" text-anchor="middle" class="title">Pipeline: Prometheus → Alertmanager → Kafka → Keep → Ejecutores · audit WORM en paralelo&lt;/text>
&lt;rect x="20" y="45" width="140" height="60" class="b src"/>&lt;text x="90" y="65" text-anchor="middle" class="h">Prometheus&lt;/text>&lt;text x="90" y="82" text-anchor="middle" class="l">DCGM + vLLM&lt;/text>&lt;text x="90" y="98" text-anchor="middle" class="n">scrape 15s&lt;/text>
&lt;rect x="190" y="45" width="140" height="60" class="b am"/>&lt;text x="260" y="65" text-anchor="middle" class="h">Alertmanager&lt;/text>&lt;text x="260" y="82" text-anchor="middle" class="l">PrometheusRule&lt;/text>&lt;text x="260" y="98" text-anchor="middle" class="n">webhook → kafka&lt;/text>
&lt;rect x="360" y="45" width="160" height="60" class="b k"/>&lt;text x="440" y="65" text-anchor="middle" class="h">Kafka&lt;/text>&lt;text x="440" y="82" text-anchor="middle" class="l">gpu.alerts.enriched&lt;/text>&lt;text x="440" y="98" text-anchor="middle" class="n">incidents.lifecycle&lt;/text>
&lt;rect x="550" y="45" width="140" height="60" class="b kp"/>&lt;text x="620" y="65" text-anchor="middle" class="h">Keep&lt;/text>&lt;text x="620" y="82" text-anchor="middle" class="l">workflows YAML&lt;/text>&lt;text x="620" y="98" text-anchor="middle" class="n">git-versioned&lt;/text>
&lt;rect x="720" y="45" width="100" height="60" class="b ex"/>&lt;text x="770" y="65" text-anchor="middle" class="h">Ejecutores&lt;/text>&lt;text x="770" y="82" text-anchor="middle" class="l">kubectl · API&lt;/text>&lt;text x="770" y="98" text-anchor="middle" class="n">ChatOps&lt;/text>
&lt;path class="arr" d="M160,75 L190,75"/>
&lt;path class="arr" d="M330,75 L360,75"/>
&lt;path class="arr" d="M520,75 L550,75"/>
&lt;path class="arr" d="M690,75 L720,75"/>
&lt;rect x="360" y="160" width="160" height="60" class="b au"/>&lt;text x="440" y="180" text-anchor="middle" class="h">audit.actions&lt;/text>&lt;text x="440" y="197" text-anchor="middle" class="l">topic WORM&lt;/text>&lt;text x="440" y="213" text-anchor="middle" class="n">retención 6 meses+&lt;/text>
&lt;path class="dbl" d="M620,105 L520,160"/>
&lt;path class="dbl" d="M770,105 L520,168"/>
&lt;text x="420" y="252" text-anchor="middle" class="n">Cada acción de Keep o humano se publica en audit.actions: WORM exigido por ENS op.exp.8 + EU AI Act art. 12.&lt;/text>
&lt;rect x="20" y="240" width="220" height="60" class="b kp"/>&lt;text x="130" y="260" text-anchor="middle" class="h">Compliance consumers&lt;/text>&lt;text x="130" y="277" text-anchor="middle" class="l">DPO · auditoría ENS · NIS2 reporting&lt;/text>&lt;text x="130" y="293" text-anchor="middle" class="n">consumen audit.actions read-only&lt;/text>
&lt;path class="arr" d="M360,180 L240,260"/>
&lt;rect x="600" y="240" width="220" height="60" class="b ex"/>&lt;text x="710" y="260" text-anchor="middle" class="h">Postmortem tooling&lt;/text>&lt;text x="710" y="277" text-anchor="middle" class="l">Jira · MLflow · Langfuse&lt;/text>&lt;text x="710" y="293" text-anchor="middle" class="n">enriquecidos con timeline&lt;/text>
&lt;path class="arr" d="M520,180 L600,260"/>
&lt;/svg>
&lt;/div>
&lt;p>&lt;strong>Prometheus + DCGM.&lt;/strong> Recolecta las métricas descritas en los dos posts anteriores. PrometheusRules definen las seis alertas críticas con &lt;code>for: &amp;lt;duración&amp;gt;&lt;/code> para evitar ruido.&lt;/p>
&lt;p>&lt;strong>Alertmanager.&lt;/strong> Recibe alertas crudas; deduplica, agrupa por labels (&lt;code>{cluster, node, gpu, model}&lt;/code>), enruta. En vez de enviar directamente a PagerDuty o Slack, &lt;strong>envía a Kafka&lt;/strong> vía webhook receiver — esto convierte la alerta en un evento del bus que múltiples consumidores procesan (Keep para acción, audit topic para compliance, dashboards para visualización).&lt;/p>
&lt;p>&lt;strong>Kafka como event bus.&lt;/strong> Tres topics canónicos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>gpu.alerts.enriched&lt;/code>&lt;/strong> — alertas con contexto añadido (tenant, modelo, versión, owner del namespace, severity efectiva). Retención: 7 días, replication factor 3.&lt;/li>
&lt;li>&lt;strong>&lt;code>incidents.lifecycle&lt;/code>&lt;/strong> — eventos del ciclo del incidente: &lt;code>incident.opened&lt;/code>, &lt;code>incident.acknowledged&lt;/code>, &lt;code>action.proposed&lt;/code>, &lt;code>action.executed&lt;/code>, &lt;code>incident.escalated&lt;/code>, &lt;code>incident.resolved&lt;/code>, &lt;code>postmortem.attached&lt;/code>. Retención: 90 días.&lt;/li>
&lt;li>&lt;strong>&lt;code>audit.actions&lt;/code>&lt;/strong> — registro inmutable de cada acción ejecutada (por Keep automáticamente o por humano confirmando). Retención: &lt;strong>6 meses mínimo con compaction off + tiered storage&lt;/strong>, almacenamiento WORM. Es el topic que ENS &lt;code>op.exp.8&lt;/code>, EU AI Act art. 12 y NIS2 obligan a conservar.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Keep como workflow engine.&lt;/strong> Consume de &lt;code>gpu.alerts.enriched&lt;/code>, dispara workflows YAML versionados en git, ejecuta acciones (llamadas HTTP, kubectl jobs, mensajes Slack, tickets Jira) y publica el resultado en &lt;code>incidents.lifecycle&lt;/code> + &lt;code>audit.actions&lt;/code>. La elección de Keep sobre Alertmanager solo (o sobre PagerDuty solo) es deliberada: Keep separa &lt;strong>declaración del runbook&lt;/strong> (YAML legible y revisable) de &lt;strong>distribución de notificación&lt;/strong> (PagerDuty). El runbook es código versionado; las notificaciones son detalles operativos.&lt;/p>
&lt;p>&lt;strong>Ejecutores.&lt;/strong> Lo que de verdad mueve el cluster:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kubernetes jobs&lt;/strong>: &lt;code>kubectl drain&lt;/code>, &lt;code>kubectl cordon&lt;/code>, &lt;code>kubectl rollout undo&lt;/code>.&lt;/li>
&lt;li>&lt;strong>NVIDIA API&lt;/strong>: &lt;code>nvidia-smi --gpu-reset&lt;/code>, &lt;code>dcgmi diag -r &amp;lt;level&amp;gt;&lt;/code>.&lt;/li>
&lt;li>&lt;strong>ChatOps&lt;/strong>: confirmaciones humanas a través de Slack interactive messages antes de ejecutar acción destructiva.&lt;/li>
&lt;li>&lt;strong>Tooling externo&lt;/strong>: ticket Jira, notificación PagerDuty, llamada a CMDB.&lt;/li>
&lt;/ul>
&lt;h2 id="las-seis-alertas-críticas-y-sus-runbooks">Las seis alertas críticas y sus runbooks&lt;/h2>
&lt;p>Para cada alerta: severity, mitigación inmediata (segundos), evidencia que capturar &lt;strong>antes de remediar&lt;/strong>, acción de resolución, criterios de cierre, trigger de postmortem.&lt;/p>
&lt;h3 id="rb-01--gpuhbmnearoom--hbm--92--sostenido">RB-01 · &lt;code>GpuHbmNearOom&lt;/code> — HBM &amp;gt; 92 % sostenido&lt;/h3>
&lt;p>&lt;strong>Severity&lt;/strong>: WARNING. Riesgo OOM en la siguiente asignación de PagedAttention.&lt;/p>
&lt;p>&lt;strong>Mitigación inmediata.&lt;/strong> Reducir admission temporalmente bajando &lt;code>max_num_seqs&lt;/code> del motor afectado vía hot reload (si el motor lo soporta) o restart escalonado de réplicas. Disparar scale-out adicional vía KEDA si hay nodos GPU libres. No es necesario drenar el nodo.&lt;/p>
&lt;p>&lt;strong>Evidencia a capturar.&lt;/strong>&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">nvidia-smi --query-gpu&lt;span class="o">=&lt;/span>index,memory.used,memory.free,memory.total --format&lt;span class="o">=&lt;/span>csv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi -q -d ROW_REMAPPER &lt;span class="p">|&lt;/span> grep -i pending
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://vllm-pod:8000/metrics &lt;span class="p">|&lt;/span> grep -E &lt;span class="s2">&amp;#34;gpu_cache_usage|num_requests&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl logs &amp;lt;pod&amp;gt; --tail&lt;span class="o">=&lt;/span>&lt;span class="m">200&lt;/span> &lt;span class="p">|&lt;/span> grep -i &lt;span class="s2">&amp;#34;preempt\|swap&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Guardar snapshot en &lt;code>audit.actions&lt;/code> con timestamp y &lt;code>incident_id&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Resolución.&lt;/strong> Si la causa es pico de tráfico: dejar al autoscaler escalar a régimen estable, monitorizar 30 min. Si la causa es regresión de modelo (canary v2 consume más KV cache que v1): rollback del canary (ver RB-06). Si es leak (la métrica crece sin que el tráfico crezca): restart del pod con captura de heap dump.&lt;/p>
&lt;p>&lt;strong>Cierre.&lt;/strong> &lt;code>gpu_cache_usage_perc &amp;lt; 80 %&lt;/code> sostenido durante 15 min Y &lt;code>num_requests_waiting == 0&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Postmortem.&lt;/strong> No obligatorio salvo si el incidente duró &amp;gt; 30 min o tuvo impacto en SLO.&lt;/p>
&lt;h3 id="rb-02--gputhermalorpowerthrottle--bit--0-ni-idle-en-clock_throttle_reasons">RB-02 · &lt;code>GpuThermalOrPowerThrottle&lt;/code> — bit ≠ 0 ni Idle en CLOCK_THROTTLE_REASONS&lt;/h3>
&lt;p>&lt;strong>Severity&lt;/strong>: WARNING (térmico) o CRITICAL (HW Power Brake sostenido, riesgo PDU).&lt;/p>
&lt;p>&lt;strong>Mitigación inmediata.&lt;/strong> Identificar el bit (decodificar bitmap). Si es &lt;strong>&lt;code>0x40 HW_THERMAL&lt;/code>&lt;/strong> o &lt;strong>&lt;code>0x20 SW_THERMAL&lt;/code>&lt;/strong>: drenar workload del nodo a otras réplicas si la temperatura no baja en 2 min, evitar nuevos pods en ese nodo (&lt;code>kubectl cordon&lt;/code>). Si es &lt;strong>&lt;code>0x80 HW_POWER_BRAKE&lt;/code>&lt;/strong>: alerta a infraestructura de DC inmediatamente (probable PDU sobrecomprometida — caso Dell KB 000220508 / Lenovo HT514380), reducir TDP de las GPUs del rack vía &lt;code>nvidia-smi -pl&lt;/code> a un valor menor para liberar carga sobre el breaker.&lt;/p>
&lt;p>&lt;strong>Evidencia.&lt;/strong>&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">nvidia-smi --query-gpu&lt;span class="o">=&lt;/span>index,temperature.gpu,temperature.memory,power.draw,clocks_throttle_reasons.active --format&lt;span class="o">=&lt;/span>csv
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ipmitool sdr &lt;span class="p">|&lt;/span> grep -i &lt;span class="s2">&amp;#34;fan\|temp\|inlet&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Datos de PDU si están instrumentadas (modbus / SNMP)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Resolución.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Térmico&lt;/strong>: revisar flujo de aire del rack, verificar rear-door HX, T_inlet, ventiladores DGX. Issue de infra, no de motor.&lt;/li>
&lt;li>&lt;strong>Power Brake&lt;/strong>: revisar dimensionado de PDU rama, breaker, distribución 415 VAC. Probable redistribución de carga a otra rama o limitación temporal de TDP.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cierre.&lt;/strong> &lt;code>CLOCK_THROTTLE_REASONS == 0x1&lt;/code> (solo Idle) o &lt;code>0x0&lt;/code> durante 30 min con carga normal.&lt;/p>
&lt;p>&lt;strong>Postmortem.&lt;/strong> Obligatorio si fue HW Power Brake — implica infraestructura eléctrica del DC.&lt;/p>
&lt;h3 id="rb-03--gpuxiderrordetected--increasedcgm_fi_dev_xid_errors5m--0">RB-03 · &lt;code>GpuXidErrorDetected&lt;/code> — &lt;code>increase(DCGM_FI_DEV_XID_ERRORS[5m]) &amp;gt; 0&lt;/code>&lt;/h3>
&lt;p>&lt;strong>Severity&lt;/strong>: CRITICAL.&lt;/p>
&lt;p>&lt;strong>Mitigación inmediata.&lt;/strong> &lt;code>kubectl cordon&lt;/code> del nodo (sin más nuevos pods). Si el XID es 31/48/79/94/95 (hardware o cascada): drenar los pods existentes del nodo. Si el XID es 13/43 (posible software): mantener pods pero bloquear nuevos, capturar trace y workload activo.&lt;/p>
&lt;p>&lt;strong>Evidencia.&lt;/strong>&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="c1"># El XID concreto del dmesg&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dmesg &lt;span class="p">|&lt;/span> grep -i xid &lt;span class="p">|&lt;/span> tail -30
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi -q -d ERROR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi -q -d PCIE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Estado de las páginas retiradas&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi -q -d ROW_REMAPPER
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Workload que estaba ejecutándose&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl get pods -o wide &lt;span class="p">|&lt;/span> grep &amp;lt;node&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl logs &amp;lt;pod&amp;gt; --previous --tail&lt;span class="o">=&lt;/span>&lt;span class="m">500&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Resolución.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>XID 13/43&lt;/strong> (software exception / channel verif): si recurre solo con un modelo concreto, es bug del workload — issue al equipo de modelos. Si es transitorio, reiniciar el pod basta.&lt;/li>
&lt;li>&lt;strong>XID 31&lt;/strong> (MMU fault): suele ser cascada de un XID 48 previo. Reset de la GPU (&lt;code>nvidia-smi --gpu-reset -i &amp;lt;index&amp;gt;&lt;/code>) o reboot del nodo si reset no resuelve.&lt;/li>
&lt;li>&lt;strong>XID 48 / 95&lt;/strong> (DBE / uncontained ECC): ver RB-04. El nodo entra en cuarentena.&lt;/li>
&lt;li>&lt;strong>XID 79&lt;/strong> (fallen off the bus): reboot del nodo. Si recurre tras reboot, abrir RMA de la GPU. ByteDance reporta 43 % de coocurrencia con errores PCIe — verificar también el slot y el cable.&lt;/li>
&lt;li>&lt;strong>XID 94 / 145 / 149&lt;/strong>: catalogados en el Xid Catalog de NVIDIA con procedimiento específico.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cierre.&lt;/strong> Smoke test del nodo pasado (&lt;code>dcgmi diag -r 3&lt;/code>), 24 h sin nuevos XIDs, vuelta al pool.&lt;/p>
&lt;p>&lt;strong>Postmortem.&lt;/strong> &lt;strong>Obligatorio&lt;/strong>. Incluir XID concreto, distribución de XIDs en el cluster, MTBE actualizado.&lt;/p>
&lt;h3 id="rb-04--gpueccdoublebit--dcgm_fi_dev_ecc_dbe_vol_total--0">RB-04 · &lt;code>GpuEccDoubleBit&lt;/code> — &lt;code>DCGM_FI_DEV_ECC_DBE_VOL_TOTAL &amp;gt; 0&lt;/code>&lt;/h3>
&lt;p>&lt;strong>Severity&lt;/strong>: CRITICAL — corrupción de datos en curso.&lt;/p>
&lt;p>&lt;strong>Mitigación inmediata.&lt;/strong> &lt;strong>Drenar el nodo inmediatamente sin esperar evidencia adicional&lt;/strong>. Páginas guardia (PagerDuty / OpsGenie) ON-CALL primario. Marcar el nodo &lt;code>unschedulable&lt;/code> y &lt;code>failed&lt;/code>. El XID 48 tiene &lt;strong>100 % probabilidad de matar el job en curso&lt;/strong> según el dataset de &lt;em>Story of Two GPUs&lt;/em>; cualquier inferencia ya está comprometida.&lt;/p>
&lt;p>&lt;strong>Evidencia (en paralelo a la mitigación).&lt;/strong>&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">nvidia-smi -q -d ECC
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi -q -d ROW_REMAPPER &lt;span class="c1"># Pending: Yes esperado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dmesg &lt;span class="p">|&lt;/span> grep -E &lt;span class="s2">&amp;#34;Xid.*48|DBE|double-bit&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> tail -50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Captura completa del estado de la GPU&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dcgmi diag -r &lt;span class="m">4&lt;/span> -i &amp;lt;gpu_index&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Resolución.&lt;/strong> Reset completo de la GPU (&lt;code>nvidia-smi --gpu-reset&lt;/code>) o reboot del nodo si reset no completa. El reset activa el row remap. Tras el reboot:&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">nvidia-smi -q -d ROW_REMAPPER &lt;span class="c1"># Pending: No esperado&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">nvidia-smi -q -d ECC &lt;span class="c1"># contadores volátiles a 0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Si &lt;code>RETIRED_DBE &amp;gt; 8&lt;/code> páginas tras el remap: planificar &lt;strong>reemplazo de GPU&lt;/strong> en próxima ventana — la degradación del silicio es progresiva. Documentado &lt;em>~19 horas de downtime&lt;/em> típico en el caso real publicado.&lt;/p>
&lt;p>&lt;strong>Cierre.&lt;/strong> Nodo en pool tras 48 h sin nuevos DBE.&lt;/p>
&lt;p>&lt;strong>Postmortem.&lt;/strong> &lt;strong>Obligatorio&lt;/strong>. Si el incidente afectó a una request con datos personales / clasificados, evaluar notificación a DPO bajo GDPR art. 33 (no es necesariamente brecha, pero hay que evaluarlo).&lt;/p>
&lt;h3 id="rb-05--vllmkvcachepoolnearfull--gpu_cache_usage_perc--95--sostenido-3-min">RB-05 · &lt;code>VllmKvCachePoolNearFull&lt;/code> — &lt;code>gpu_cache_usage_perc &amp;gt; 95 %&lt;/code> sostenido 3 min&lt;/h3>
&lt;p>&lt;strong>Severity&lt;/strong>: WARNING (riesgo de preempt-on-OOM, no de OOM real).&lt;/p>
&lt;p>&lt;strong>Mitigación inmediata.&lt;/strong> Activar scale-out del autoscaler bajando el umbral de KEDA temporalmente (de 0.85 a 0.75) durante 30 min. Si está en modo &lt;code>recompute&lt;/code>, los preempts elevan TTFT pero no rompen requests; aceptable a corto plazo. Si está en modo &lt;code>swap&lt;/code>, latencia se va al techo — preferible cortar tráfico nuevo (devolver 503 desde el &lt;a href="https://blog.lo0.es/posts/router-inferencia-llm-gateway-l7/">router&lt;/a>) durante 5 min.&lt;/p>
&lt;p>&lt;strong>Evidencia.&lt;/strong>&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 http://vllm-pod:8000/metrics &lt;span class="p">|&lt;/span> grep -E &lt;span class="s2">&amp;#34;gpu_cache|num_requests|num_preemptions&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl get hpa vllm-llama70b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl logs &amp;lt;pod&amp;gt; --tail&lt;span class="o">=&lt;/span>&lt;span class="m">200&lt;/span> &lt;span class="p">|&lt;/span> grep -i preempt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Resolución.&lt;/strong> Si recurre regularmente: capacity planning revisado, posiblemente reducir &lt;code>max_num_seqs&lt;/code> o subir réplicas estables. Ver &lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">Capacity planning&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Cierre.&lt;/strong> Pool &amp;lt; 85 % sostenido 30 min, sin preempts en último 15 min.&lt;/p>
&lt;p>&lt;strong>Postmortem.&lt;/strong> No obligatorio salvo recurrencia &amp;gt; 3 veces / semana.&lt;/p>
&lt;h3 id="rb-06--vllmttftp95outofslo--ttft-p95--15-s-durante-5-min">RB-06 · &lt;code>VllmTtftP95OutOfSlo&lt;/code> — TTFT P95 &amp;gt; 1.5 s durante 5 min&lt;/h3>
&lt;p>&lt;strong>Severity&lt;/strong>: CRITICAL (violación de SLO contractual).&lt;/p>
&lt;p>&lt;strong>Mitigación inmediata.&lt;/strong> Diagnóstico rápido del régimen (en orden de probabilidad):&lt;/p>
&lt;ol>
&lt;li>Si hay canary v2 activo y el ratio &lt;code>ttft_p95(v2)/ttft_p95(v1) &amp;gt; 1.30&lt;/code>: &lt;strong>rollback automático&lt;/strong> del canary vía Argo Rollouts (&lt;code>argo rollouts abort vllm-llama70b&lt;/code>).&lt;/li>
&lt;li>Si &lt;code>num_requests_waiting &amp;gt; 5&lt;/code>: scale-out vía KEDA.&lt;/li>
&lt;li>Si &lt;code>DRAM_ACTIVE &amp;gt; 90 %&lt;/code> + &lt;code>gpu_cache_usage_perc &amp;gt; 90 %&lt;/code>: cuello en HBM, palanca de quantization o reducción de contexto.&lt;/li>
&lt;li>Si &lt;code>CLOCK_THROTTLE_REASONS != 0&lt;/code>: ver RB-02.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Evidencia.&lt;/strong>&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="c1"># Snapshot del histograma&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://vllm-pod:8000/metrics &lt;span class="p">|&lt;/span> grep time_to_first_token
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Distribución por versión si hay canary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Estado DCGM del momento&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">curl http://dcgm-exporter:9400/metrics &lt;span class="p">|&lt;/span> grep -E &lt;span class="s2">&amp;#34;PIPE_TENSOR|DRAM_ACTIVE|THROTTLE&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Tráfico activo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">kubectl top pods -n inference
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Resolución.&lt;/strong> Depende del diagnóstico. Casos típicos:&lt;/p>
&lt;ul>
&lt;li>Canary regresión → rollback completo (ver &lt;a href="https://blog.lo0.es/posts/canary-blue-green-shadow-modelos-llm/">Canary&lt;/a>).&lt;/li>
&lt;li>Saturación de capacidad → escalar réplicas o aceptar 503 temporal con &lt;code>Retry-After&lt;/code>.&lt;/li>
&lt;li>Prefill bound → activar/calibrar chunked prefill o disaggregated serving (ver &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">Disaggregated serving&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cierre.&lt;/strong> TTFT P95 dentro de SLO sostenido 30 min.&lt;/p>
&lt;p>&lt;strong>Postmortem.&lt;/strong> &lt;strong>Obligatorio&lt;/strong>. Documentar causa raíz y palanca aplicada; actualizar runbook.&lt;/p>
&lt;h2 id="workflows-keep-yaml--tres-ejemplos-completos">Workflows Keep YAML — tres ejemplos completos&lt;/h2>
&lt;p>Los runbooks son útiles solo si están &lt;strong>codificados&lt;/strong> en el workflow engine. Keep permite declararlos en YAML versionados en git.&lt;/p>
&lt;h3 id="workflow-1--xid-detectedyaml">Workflow 1 — &lt;code>xid-detected.yaml&lt;/code>&lt;/h3>
&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">workflow&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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">xid-detected-drain&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;XID error detected — cordon node and capture evidence&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">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;RB-03 implementation&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">triggers&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alert&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">filters&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">key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alertname&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">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GpuXidErrorDetected&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">steps&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">capture-evidence&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">bash&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">with&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">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> set -e
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> NODE=&amp;#34;{{ alert.labels.node }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> GPU=&amp;#34;{{ alert.labels.gpu }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> INC_ID=&amp;#34;{{ alert.fingerprint }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> mkdir -p /var/evidence/$INC_ID
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> kubectl debug node/$NODE -it --image=nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04 -- \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> bash -c &amp;#34;nvidia-smi -q -d ERROR,PCIE,ROW_REMAPPER &amp;gt; /host/var/evidence/$INC_ID/smi.txt&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> kubectl describe node $NODE &amp;gt; /var/evidence/$INC_ID/node.txt&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cordon-node&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kubernetes&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">with&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">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cordon&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.labels.node }}&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">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.labels.severity == &amp;#39;critical&amp;#39; }}&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">actions&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">open-jira-ticket&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">jira&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.jira-prod }}&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">with&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">project&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GPUOPS&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">issuetype&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Incident&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;RB-03: XID {{ alert.annotations.xid_code }} on {{ alert.labels.node }}/{{ alert.labels.gpu }}&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">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Severity: {{ alert.labels.severity }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> XID: {{ alert.annotations.xid_code }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Evidence: /var/evidence/{{ alert.fingerprint }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Runbook: https://runbooks.example.local/RB-03&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">notify-slack&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">slack&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.slack-gpu-incidents }}&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">with&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">message&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> :warning: *RB-03 triggered*
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Node: `{{ alert.labels.node }}` GPU: `{{ alert.labels.gpu }}`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> XID: `{{ alert.annotations.xid_code }}`
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;lt;{{ jira.url }}|Jira ticket&amp;gt;&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">emit-audit&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kafka&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.kafka-audit }}&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">with&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">topic&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">audit.actions&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">message&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">incident_id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.fingerprint }}&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">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;cordon_node&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">actor&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;keep-workflow&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">workflow_id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;xid-detected-drain&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">target&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.labels.node }}&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">timestamp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ now }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="workflow-2--ecc-dbeyaml--paginación-inmediata">Workflow 2 — &lt;code>ecc-dbe.yaml&lt;/code> — paginación inmediata&lt;/h3>
&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">workflow&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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ecc-dbe-critical&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ECC double-bit — page on-call and quarantine node&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">triggers&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alert&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">filters&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">key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alertname&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">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">GpuEccDoubleBit&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">steps&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cordon-immediately&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kubernetes&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">with&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">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cordon&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.labels.node }}&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">drain-workload&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kubernetes&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">with&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">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">drain&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.labels.node }}&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">options&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">ignore-daemonsets&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">delete-emptydir-data&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">grace-period&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">120&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">page-oncall&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">pagerduty&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.pagerduty-critical }}&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">with&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">service_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ env.PD_SERVICE_KEY }}&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">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">critical&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">summary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;RB-04 ECC DBE on {{ alert.labels.node }}/{{ alert.labels.gpu }} — node drained&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">emit-lifecycle&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kafka&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.kafka-incidents }}&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">with&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">topic&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">incidents.lifecycle&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">message&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">incident_id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.fingerprint }}&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">event&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">incident.opened&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">severity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">critical&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">runbook&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">RB-04&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">requires_postmortem&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">notify-dpo&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">email&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">with&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">to&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dpo@example.local&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">subject&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ECC DBE en GPU productiva — evaluación necesaria&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">body&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Incidente RB-04 ECC DBE detectado en {{ alert.labels.node }}.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Modelo afectado: {{ alert.labels.model }}.
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> Por favor evaluar si hubo procesamiento de datos personales/clasificados
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> durante la ventana de error y necesidad de notificación GDPR art. 33.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="workflow-3--canary-rollbackyaml--ttft-p95-fuera-de-slo">Workflow 3 — &lt;code>canary-rollback.yaml&lt;/code> — TTFT P95 fuera de SLO&lt;/h3>
&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">workflow&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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">canary-rollback-ttft&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Rollback canary when TTFT P95 ratio v2/v1 &amp;gt; 1.30&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">triggers&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alert&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">filters&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">key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">alertname&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">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">VllmTtftP95OutOfSlo&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">key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">canary_active&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">value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;true&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">steps&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">check-ratio&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">prometheus&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.prom-prod }}&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">with&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">query&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> histogram_quantile(0.95, sum by(le)(rate(vllm:time_to_first_token_seconds_bucket{version=&amp;#34;v2&amp;#34;}[5m])))
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> /
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> histogram_quantile(0.95, sum by(le)(rate(vllm:time_to_first_token_seconds_bucket{version=&amp;#34;v1&amp;#34;}[5m])))&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">condition&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">result &amp;gt; 1.30&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">actions&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">argo-rollback&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kubernetes&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">with&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">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">exec&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">command&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="l">kubectl&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="l">argo&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="l">rollouts&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="l">abort&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="s2">&amp;#34;{{ alert.labels.rollout }}&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="kc">n&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="s2">&amp;#34;{{ alert.labels.namespace }}&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">notify-and-audit&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">provider&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">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kafka&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">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ providers.kafka-audit }}&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">with&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">topic&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">audit.actions&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">message&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">incident_id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ alert.fingerprint }}&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">action&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">canary_rollback&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">ratio&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ steps.check-ratio.result }}&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">actor&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">keep-workflow&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">timestamp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ now }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Cada workflow se guarda en &lt;code>repos/keep-workflows/&lt;/code> versionado en git, revisado por pull request, validado por CI (&lt;code>keep workflow validate&lt;/code>). El runbook escrito vive como &lt;code>docs/runbooks/RB-XX.md&lt;/code> enlazado desde el workflow YAML — los dos siempre evolucionan juntos.&lt;/p>
&lt;h2 id="el-schema-canónico-de-eventos-kafka">El schema canónico de eventos Kafka&lt;/h2>
&lt;p>Para que los topics sean consumibles por compliance, postmortem tooling y dashboards sin que cada consumer tenga que adivinar el shape, se fija schema con Avro / Protobuf.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;IncidentLifecycleEvent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;record&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;fields&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;incident_id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;event&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;enum&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;symbols&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;incident.opened&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;incident.acknowledged&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;action.proposed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;action.executed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;action.failed&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;incident.escalated&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;incident.resolved&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;postmortem.attached&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]}},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;timestamp&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;logicalType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;timestamp-millis&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;actor&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;severity&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;enum&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;symbols&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;low&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;warning&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;critical&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;runbook&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;null&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;alert_name&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;labels&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;map&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;values&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;annotations&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;map&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;values&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;evidence_uri&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;null&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;requires_postmortem&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;boolean&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">false&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Para &lt;code>audit.actions&lt;/code> (WORM), un schema separado más exigente con campos no-modificables:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;AuditAction&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;record&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;fields&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;incident_id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;action&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;actor&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;actor_type&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;enum&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;symbols&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;human&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;workflow&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;scheduler&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;workflow_id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;null&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;target&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;command&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;null&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;enum&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;symbols&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;success&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;failure&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;partial&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;timestamp&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;logicalType&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;timestamp-millis&amp;#34;&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;evidence_uri&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;null&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;approver&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;null&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="nt">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>El topic se configura con &lt;code>cleanup.policy=delete&lt;/code>, &lt;code>retention.ms=15552000000&lt;/code> (6 meses) y &lt;code>min.insync.replicas=2&lt;/code> con &lt;code>acks=all&lt;/code> para garantizar durabilidad. Para retención más larga sin coste de Kafka, &lt;strong>tiered storage&lt;/strong> a Ceph RGW o S3-compatible — el log nuevo en hot tier, el viejo en cold tier transparente al consumer.&lt;/p>
&lt;h2 id="encaje-formal-en-gestión-de-incidentes">Encaje formal en gestión de incidentes&lt;/h2>
&lt;p>Los runbooks no son una práctica de SRE aislada — encajan en cuatro marcos normativos que las plataformas LLM productivas tocan a diario.&lt;/p>
&lt;h3 id="isoiec-27035--gestión-de-incidentes-de-seguridad-de-la-información">ISO/IEC 27035 — gestión de incidentes de seguridad de la información&lt;/h3>
&lt;p>Define el ciclo formal en cinco fases: &lt;strong>plan &amp;amp; prepare&lt;/strong> → &lt;strong>detect &amp;amp; report&lt;/strong> → &lt;strong>assess &amp;amp; decide&lt;/strong> → &lt;strong>respond&lt;/strong> → &lt;strong>lessons learned&lt;/strong>. Cada fase tiene salidas exigibles documentalmente. La traducción al stack:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Plan &amp;amp; prepare&lt;/strong>: los runbooks RB-01 a RB-06 + los workflows Keep son parte del &lt;em>Information Security Incident Management Plan&lt;/em>. Versionados en git, revisados anualmente.&lt;/li>
&lt;li>&lt;strong>Detect &amp;amp; report&lt;/strong>: las alertas Prometheus que entran a Kafka son la materialización.&lt;/li>
&lt;li>&lt;strong>Assess &amp;amp; decide&lt;/strong>: la severity en &lt;code>gpu.alerts.enriched&lt;/code> + la lógica del workflow Keep.&lt;/li>
&lt;li>&lt;strong>Respond&lt;/strong>: ejecución de los &lt;code>steps&lt;/code> + &lt;code>actions&lt;/code> del workflow.&lt;/li>
&lt;li>&lt;strong>Lessons learned&lt;/strong>: postmortem obligatorio para los runbooks que lo marcan; salida documentada en el repo de postmortems + actualización del runbook.&lt;/li>
&lt;/ul>
&lt;h3 id="ens-esquema-nacional-de-seguridad--controles-opexp">ENS (Esquema Nacional de Seguridad) — controles op.exp&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>&lt;code>op.exp.7&lt;/code> Gestión de incidentes&lt;/strong>: el catálogo de runbooks + el pipeline Keep / Kafka materializan la &amp;ldquo;respuesta organizada y procedimentada&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>&lt;code>op.exp.8&lt;/code> Registro de actividad&lt;/strong>: el topic &lt;code>audit.actions&lt;/code> con retención WORM 6 meses (mínimo nivel ALTO).&lt;/li>
&lt;li>&lt;strong>&lt;code>op.exp.9&lt;/code> Registro de la gestión de incidentes&lt;/strong>: el topic &lt;code>incidents.lifecycle&lt;/code> con el ciclo completo de cada incidente.&lt;/li>
&lt;li>&lt;strong>&lt;code>op.exp.10&lt;/code> Protección de los registros de actividad&lt;/strong>: WORM + cifrado en reposo + control de acceso (consumers compliance solo-lectura).&lt;/li>
&lt;/ul>
&lt;h3 id="nis2--notificación-a-autoridad-competente">NIS2 — notificación a autoridad competente&lt;/h3>
&lt;p>Para entidades esenciales / importantes, el art. 23 fija tres plazos a partir del &lt;em>significant impact&lt;/em> detectado:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>24 horas&lt;/strong>: notificación temprana (&amp;ldquo;early warning&amp;rdquo;) al CSIRT nacional (INCIBE-CERT en España).&lt;/li>
&lt;li>&lt;strong>72 horas&lt;/strong>: notificación formal con assessment inicial.&lt;/li>
&lt;li>&lt;strong>1 mes&lt;/strong>: informe final con causa raíz, impacto, medidas correctivas.&lt;/li>
&lt;/ul>
&lt;p>Los datos para esos informes salen directamente de &lt;code>incidents.lifecycle&lt;/code> + &lt;code>audit.actions&lt;/code> con un consumer que genera el dossier en el formato requerido. Sin el pipeline auditable, los plazos NIS2 son inalcanzables.&lt;/p>
&lt;h3 id="eu-ai-act--art-73-serious-incident-reporting">EU AI Act — art. 73 (serious incident reporting)&lt;/h3>
&lt;p>Aplicable a sistemas de alto riesgo. Plazos:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>2 días&lt;/strong>: para incidentes que provoquen fallecimiento o daño irreversible a personas o infraestructuras críticas.&lt;/li>
&lt;li>&lt;strong>10 días&lt;/strong>: para incidentes que produzcan disrupción seria de infraestructura crítica.&lt;/li>
&lt;li>&lt;strong>15 días&lt;/strong>: para el resto de &amp;ldquo;serious incidents&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;p>La definición de &amp;ldquo;serious incident&amp;rdquo; incluye fallos sistemáticos del modelo, brecha de fundamental rights, daño material o medioambiental. Los runbooks deben marcar qué alertas pueden derivar en serious incident (típicamente cualquier cosa que afecte la salida del modelo en un contexto de alto riesgo) y disparar un sub-workflow específico de evaluación legal.&lt;/p>
&lt;h3 id="isoiec-42001--aims-cláusula-10-mejora-continua">ISO/IEC 42001 — AIMS cláusula 10 mejora continua&lt;/h3>
&lt;p>El postmortem obligatorio post-incidente alimenta la cláusula 10. La actualización del runbook tras cada incidente que descubre un patrón nuevo es la &amp;ldquo;acción correctiva con verificación de eficacia&amp;rdquo; que la norma exige. Ver &lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">ISO 42001 AIMS&lt;/a>.&lt;/p>
&lt;h2 id="cuatro-anti-patrones">Cuatro anti-patrones&lt;/h2>
&lt;p>&lt;strong>Anti-patrón 1 — alertas sin runbook.&lt;/strong> La alerta dispara, el operador junior de guardia mira el dashboard, busca en Confluence, no encuentra nada actualizado, llama al senior por Slack, espera 20 minutos. En ese tiempo el incidente ha crecido. Regla: &lt;strong>ninguna alerta entra a producción sin runbook publicado y workflow Keep aprobado&lt;/strong>. CI valida que cada &lt;code>PrometheusRule&lt;/code> con severity ≥ warning tiene su &lt;code>keep workflow&lt;/code> correspondiente.&lt;/p>
&lt;p>&lt;strong>Anti-patrón 2 — runbook sin captura de evidencia previa.&lt;/strong> El workflow ejecuta &lt;code>nvidia-smi --gpu-reset&lt;/code> en cuanto llega el XID, perdiendo el estado que habría diagnosticado la causa raíz. El siguiente XID idéntico exige rehacer el diagnóstico desde cero. Regla: &lt;strong>&lt;code>steps&lt;/code> antes de &lt;code>actions&lt;/code>&lt;/strong>; toda evidencia se captura primero, las acciones destructivas después.&lt;/p>
&lt;p>&lt;strong>Anti-patrón 3 — escalada por antigüedad en vez de severity.&lt;/strong> El operador junior de guardia gestiona un ECC DBE porque &amp;ldquo;le toca&amp;rdquo;. Le falta contexto para entender row remap, retired pages o el riesgo de corrupción de datos. Regla: &lt;strong>paginación por severity, no por rotación&lt;/strong>: RB-04 y RB-03 dispararon ON-CALL primario senior con escalada automática a infra/hardware si no acuse en 10 min.&lt;/p>
&lt;p>&lt;strong>Anti-patrón 4 — ausencia de gate humano para acciones destructivas.&lt;/strong> El workflow ejecuta &lt;code>kubectl drain&lt;/code> automáticamente sobre cualquier alerta marcada como CRITICAL. En la primera falsa alarma (un transitorio que se autoresolvió en 30 s), Keep drenó un nodo productivo durante hora pico. Regla: &lt;strong>acciones destructivas (drain, reset, RMA, rollback completo) exigen confirmación humana&lt;/strong> vía Slack interactive message, con timeout configurable. Excepción justificada: ECC DBE confirmado por &amp;gt; 1 medición — el riesgo de corrupción supera el de falsa alarma.&lt;/p>
&lt;h2 id="aplicado-a-hardware-on-premise-típico">Aplicado a hardware on-premise típico&lt;/h2>
&lt;p>Para un cluster genérico de &lt;strong>4 nodos × 4×H100 SXM 80 GB&lt;/strong> con &lt;strong>Kafka y Keep ya desplegados&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Kafka&lt;/strong>: cluster de 3 brokers en nodos no-GPU del cluster K8s; topics &lt;code>gpu.alerts.enriched&lt;/code>, &lt;code>incidents.lifecycle&lt;/code>, &lt;code>audit.actions&lt;/code> configurados con replication factor 3, min.insync.replicas 2. Audit con tiered storage a Ceph RGW para retención &amp;gt; 6 meses sin coste brutal.&lt;/li>
&lt;li>&lt;strong>Keep&lt;/strong>: 2 réplicas del operator + 1 réplica del worker en un namespace &lt;code>keep&lt;/code>; conectado a Prometheus (provider read), Kafka (provider read + write), Slack, PagerDuty, Jira, Kubernetes (provider con SA específico con permisos &lt;code>get/list/patch nodes&lt;/code>, &lt;code>create jobs&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Workflows&lt;/strong>: ~25-40 YAML en el repo &lt;code>infra/keep-workflows/&lt;/code>, sincronizado con el cluster vía Flux o Argo CD. Validados por CI (&lt;code>keep workflow validate&lt;/code>) en cada PR.&lt;/li>
&lt;li>&lt;strong>Volumen de eventos&lt;/strong>: para 16 GPUs en operación normal con alertas debounced, ~50-200 eventos/día en &lt;code>gpu.alerts.enriched&lt;/code>. En incidente típico, picos de 500-2000 eventos/día.&lt;/li>
&lt;li>&lt;strong>Compliance consumers&lt;/strong>: un consumer python en namespace &lt;code>compliance&lt;/code> que genera reportes NIS2 / ENS / EU AI Act semanalmente, leyendo &lt;code>audit.actions&lt;/code> y &lt;code>incidents.lifecycle&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h2 id="lo-que-no-hemos-cubierto-próximos-posts">Lo que no hemos cubierto (próximos posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Playbooks de postmortem&lt;/strong> — la mecánica de RCA con 5-whys, Ishikawa adaptado a LLM, integración con MLflow tracking de re-training si el postmortem produce dataset enriquecido.&lt;/li>
&lt;li>&lt;strong>Chaos engineering para LLM&lt;/strong> — inyección controlada de XID errors, ECC simulados, latencia HBM artificial para validar runbooks &lt;strong>antes&lt;/strong> del incidente real.&lt;/li>
&lt;li>&lt;strong>Multi-cluster incident coordination&lt;/strong> — cómo coordinar Keep entre clusters geográficos cuando un incidente afecta a múltiples regiones.&lt;/li>
&lt;li>&lt;strong>Integración con CMDB y procurement&lt;/strong> — el ciclo &lt;code>RMA → ticket → ServiceNow → reposición de hardware&lt;/code> automatizado vía workflow.&lt;/li>
&lt;li>&lt;strong>Forense LLM&lt;/strong> — extracción de la traza OTel completa de una request afectada por un incidente, redacted PII, conservación en evidence vault.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-metricas-dcgm-vllm-anomalias/">Anatomía de las doce métricas DCGM y cinco vLLM&lt;/a> — la anomalía documentada por métrica que estos runbooks resuelven.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/observabilidad-gpu-dcgm-llm/">Observabilidad GPU para inferencia LLM&lt;/a> — la lista compacta y las seis alertas críticas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> — la traza OTel que se captura como evidencia.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/canary-blue-green-shadow-modelos-llm/">Canary, blue-green y shadow&lt;/a> — el mecanismo de rollback que RB-06 invoca.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/autoscaling-llm-kubernetes-keda/">Autoscaling LLM en Kubernetes&lt;/a> — la palanca de escalado que RB-01 y RB-05 invocan.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/capacity-planning-inferencia-llm-on-premise/">Capacity planning&lt;/a> — el head-room presupuestado para absorber incidentes sin SLO break.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">ISO/IEC 42001 AIMS para LLM on-premise&lt;/a> — la cláusula 10 que estos postmortems materializan.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/controles-tecnicos-ens-42001-eu-ai-act/">Controles técnicos ENS × 42001 × EU AI Act&lt;/a> — el mapeo de controles que estos runbooks satisfacen.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/eu-ai-act-mapeo-arquitectura-llm-on-premise/">EU AI Act: mapeo a arquitectura LLM&lt;/a> — el art. 73 de incidentes graves que activa el sub-workflow legal.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">Cinco niveles de madurez&lt;/a> — los runbooks codificados son requisito del nivel 3-4.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>ISO/IEC 27035-1:2023 — &lt;em>Information security incident management — Principles and process&lt;/em>.&lt;/li>
&lt;li>ISO/IEC 27035-2:2023 — &lt;em>Information security incident management — Guidelines to plan and prepare for incident response&lt;/em>.&lt;/li>
&lt;li>ENS — &lt;em>Real Decreto 311/2022&lt;/em>, Anexo II controles &lt;code>op.exp.7&lt;/code> a &lt;code>op.exp.10&lt;/code>.&lt;/li>
&lt;li>Directiva NIS2 (UE 2022/2555) — art. 23 (notificación de incidentes significativos).&lt;/li>
&lt;li>Reglamento EU AI Act (UE 2024/1689) — art. 73 (reporting of serious incidents).&lt;/li>
&lt;li>ISO/IEC 42001:2023 — &lt;em>AI management system — cláusula 10 (mejora continua)&lt;/em>.&lt;/li>
&lt;li>Keep project — &lt;code>keephq.dev&lt;/code> y &lt;code>github.com/keephq/keep&lt;/code> (documentación de workflows YAML, providers).&lt;/li>
&lt;li>Apache Kafka — &lt;em>Tiered Storage&lt;/em> y &lt;code>cleanup.policy&lt;/code> (docs.confluent.io / kafka.apache.org).&lt;/li>
&lt;li>Confluent — &lt;em>Schema Registry&lt;/em> y best practices para eventos lifecycle.&lt;/li>
&lt;li>NVIDIA — &lt;em>Xid Errors Documentation&lt;/em> y procedimientos de remediación.&lt;/li>
&lt;li>Google SRE Book — &lt;em>Effective Troubleshooting&lt;/em> y &lt;em>Postmortem Culture&lt;/em>.&lt;/li>
&lt;li>Atlassian — &lt;em>Incident Management Handbook&lt;/em> (referencia para severity matrices).&lt;/li>
&lt;/ul></description></item><item><title>ISO/IEC 42001: el manual de operaciones del sistema de IA — cómo encaja el AIMS sobre la plataforma LLM on-premise descrita en el blog</title><link>https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/</link><pubDate>Mon, 01 Jun 2026 06:00:00 +0200</pubDate><guid>https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/</guid><description>&lt;blockquote>
&lt;p>Este post cierra una asimetría que el blog acumulaba: hemos descrito en detalle la &lt;strong>plataforma técnica&lt;/strong> (&lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">siete capas del stack&lt;/a>, &lt;a href="https://blog.lo0.es/posts/siete-fases-despliegue-plataforma-llm-on-premise/">siete fases del despliegue&lt;/a>, &lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">cinco niveles de madurez&lt;/a>), el &lt;strong>pipeline operativo&lt;/strong> (&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">seis etapas LLMOps&lt;/a>), las &lt;strong>piezas data&lt;/strong> (&lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">curación de corpus&lt;/a>, &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">versionado&lt;/a>), las &lt;strong>piezas eval / safety&lt;/strong> (&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">evals&lt;/a>, &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a>, &lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a>) y las &lt;strong>piezas observe&lt;/strong> (&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">tracing OTel GenAI&lt;/a>). Lo que no había aparecido es la capa de &lt;strong>gobierno&lt;/strong> que un cliente regulado pide encima de todo eso. ISO/IEC 42001 es esa capa.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>ISO/IEC 42001:2023 es la primera norma internacional certificable que define cómo se gestiona un sistema de IA. No es una norma técnica (no dice &amp;ldquo;usa este motor de inferencia&amp;rdquo; ni &amp;ldquo;este threshold de safety&amp;rdquo;): es una norma de &lt;strong>gestión&lt;/strong>, prima de ISO 27001 e ISO 9001. Hereda de ambas la estructura Annex SL —siete cláusulas obligatorias que recorren contexto, liderazgo, planificación, soporte, operación, evaluación de desempeño y mejora— y añade un Annex A con &lt;strong>38 controles específicos de IA&lt;/strong> en 9 secciones: políticas, organización interna, recursos, impact assessment, ciclo de vida, datos, información a partes interesadas, uso, terceros. La tesis del post es que la arquitectura técnica descrita en este blog cubre &lt;strong>directamente entre el 60% y el 80% de los controles A&lt;/strong> sin trabajo adicional —el pipeline LLMOps materializa A.6, el versionado y curación materializan A.7, los guardrails y evals materializan A.9, el tracing OTel materializa A.8—; el resto es disciplina de gobierno que no aparece en el código (política de IA escrita, impact assessments por sistema, registro de stakeholders, decisiones de roles entre provider/producer/customer, documentación obligatoria), y es precisamente lo que diferencia una certificación real de un cumplimiento performativo. El post mapea control a control la correspondencia, cruza con EU AI Act (siete artículos directamente alineados con 42001: 9, 10, 11, 12, 13, 14, 17), con NIS2 (asset register, incident notification, supply chain) y con ENS (RD 311/2022, categorías Básico/Medio/Alto), lista los siete documentos obligatorios mínimos que un auditor pide, presenta el caso del chatbot multi-tenant del blog como checklist 42001 vivo, y cierra con las cinco trampas habituales (confundir 42001 con cumplimiento EU AI Act, sobre-documentar sin medir, ignorar A.5 hasta el audit, asumir que 27001 cubre la parte AI, pensar que la certificación es un proyecto puntual y no un sistema vivo).&lt;/p>
&lt;h2 id="la-analogía-el-manual-de-operaciones-del-avión">La analogía: el manual de operaciones del avión&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 como manual de operaciones del avión auditado por 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">Sistema de IA&lt;/text>
&lt;text x="100" y="62" text-anchor="middle" class="is">plataforma LLM on-premise&lt;/text>
&lt;text x="100" y="76" text-anchor="middle" class="is">(el avión)&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">Operaciones técnicas&lt;/text>
&lt;text x="310" y="58" text-anchor="middle" class="is">pipeline LLMOps + guardrails +&lt;/text>
&lt;text x="310" y="72" text-anchor="middle" class="is">tracing + retrain (los vuelos)&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">Manual de operaciones&lt;/text>
&lt;text x="530" y="58" text-anchor="middle" class="is">políticas + 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">organismo certificador&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">Las 7 cláusulas Annex SL — el índice obligatorio del manual&lt;/text>
&lt;text x="410" y="172" text-anchor="middle" class="is">4 Contexto · 5 Liderazgo · 6 Planificación · 7 Soporte · 8 Operación · 9 Evaluación · 10 Mejora&lt;/text>
&lt;text x="410" y="190" text-anchor="middle" class="is">Heredadas de Annex SL — mismo esqueleto que ISO 27001 y 9001, lo que permite integrar sistemas de gestión&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">Los 38 controles Annex A — los procedimientos AI-específicos del manual&lt;/text>
&lt;text x="410" y="272" text-anchor="middle" class="is">A.2 Políticas · A.3 Org · A.4 Recursos · A.5 Impact · A.6 Ciclo de vida · A.7 Datos · A.8 Info partes · A.9 Uso · A.10 Terceros&lt;/text>
&lt;text x="410" y="290" text-anchor="middle" class="is">Lo que distingue 42001 de 27001/9001: cada control nace de un riesgo AI-específico (sesgo, opacidad, deriva, suministro de datos)&lt;/text>
&lt;text x="410" y="340" text-anchor="middle" class="in">El avión vuela con los pilotos; el manual lo audita la autoridad. Si el manual está incompleto, el avión no certifica aunque vuele perfecto.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>Un avión moderno —un A350, un Boeing 787, un dron certificado para reparto urbano— no vuela porque tenga buenos motores. Vuela porque la organización que lo opera tiene un &lt;strong>Manual de Operaciones&lt;/strong> aprobado por la autoridad aeronáutica (EASA en Europa, FAA en EEUU, AESA en España como delegada). El manual no contiene los planos del motor —eso lo certifica el fabricante—; contiene los procedimientos: quién es el comandante en cada vuelo, qué checklist se ejecuta antes de cada despegue, qué inspecciones periódicas se hacen a las 100, 500 y 2.000 horas de vuelo, qué proveedores externos están autorizados a tocar qué componentes, qué se documenta tras cada incidente, qué hacer cuando aparece una alerta nueva en el panel. La autoridad no se sienta en cada vuelo: lee el manual, audita aleatoriamente la trazabilidad de los vuelos pasados contra el manual, y si todo cuadra, mantiene la certificación.&lt;/p>
&lt;p>Un sistema de IA en producción —el chatbot multi-tenant del &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a>, un copiloto para abogados, un sistema de scoring crediticio— es exactamente lo mismo. Vuela porque el modelo es bueno, el pipeline LLMOps está bien montado, los guardrails atrapan los casos malos. Pero &lt;strong>certifica&lt;/strong> porque la organización que lo opera tiene un AIMS (AI Management System) descrito en un manual auditable. ISO/IEC 42001 es ese manual: su índice obligatorio (Annex SL, siete cláusulas) y su catálogo de controles específicos de IA (Annex A, 38 controles). El auditor no se sienta junto al ingeniero MLOps: lee la política de IA, revisa los impact assessments de los últimos sistemas desplegados, comprueba que el retrain de incidentes está documentado, verifica los contratos con terceros, audita una muestra de trazas en Langfuse cruzadas con &lt;code>dataset_hash&lt;/code> y &lt;code>prompt_id&lt;/code>. Y si todo cuadra, certifica.&lt;/p>
&lt;p>La analogía importa porque acota la pregunta correcta: &lt;strong>42001 no certifica el modelo ni el código&lt;/strong>. Certifica la &lt;strong>forma de operar&lt;/strong> del sistema completo. Un equipo puede tener el mejor stack OSS del mundo y suspender la auditoría porque no tiene una política de IA escrita ni una decisión documentada sobre qué rol (provider vs producer vs customer) ocupa frente a sus clientes. Y viceversa: un equipo con un modelo modesto pero con disciplina de manual de operaciones puede certificar sin acrobacias.&lt;/p>
&lt;h2 id="isoiec-42001-en-15-segundos">ISO/IEC 42001 en 15 segundos&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Publicación&lt;/strong>: diciembre de 2023, ISO/IEC JTC 1/SC 42 (el subcomité ISO/IEC de AI).&lt;/li>
&lt;li>&lt;strong>Estado en 2026&lt;/strong>: norma vigente, certificable por organismos acreditados (BSI, AENOR, TÜV, Bureau Veritas, A-LIGN, Schellman). Aún no reconocida formalmente como norma armonizada del EU AI Act, pero proporciona la base de gestión sobre la que apoyarse.&lt;/li>
&lt;li>&lt;strong>Compatibilidad&lt;/strong>: comparte la estructura Annex SL con ISO 9001 (calidad), 27001 (seguridad de la información), 27701 (privacidad), 22301 (continuidad), 20000-1 (servicios IT). Las organizaciones con sistemas de gestión integrados (IMS) la añaden con un esfuerzo del 20-40% del que costaría implantarla desde cero.&lt;/li>
&lt;li>&lt;strong>Aplicabilidad&lt;/strong>: cualquier organización que &lt;strong>desarrolle, provea, despliegue o use&lt;/strong> sistemas de IA. No se limita a desarrolladores: una empresa que consume un LLM hospedado y lo integra en un producto propio está dentro del alcance.&lt;/li>
&lt;li>&lt;strong>Certificación&lt;/strong>: ciclo de 3 años con auditoría inicial (Stage 1: review documental + Stage 2: auditoría in-situ) y auditorías de seguimiento anuales. Coste típico: 15.000-60.000 € la inicial según tamaño; 6.000-20.000 € por seguimiento anual.&lt;/li>
&lt;/ul>
&lt;p>Lo que &lt;strong>no&lt;/strong> hace 42001:&lt;/p>
&lt;ul>
&lt;li>No dice qué modelos usar ni qué thresholds aplicar.&lt;/li>
&lt;li>No certifica el modelo individual (eso lo hacen evaluaciones específicas tipo NIST AI RMF profile o EU AI Act technical documentation).&lt;/li>
&lt;li>No sustituye al EU AI Act ni al RGPD: es complementaria. Implantarla bien &lt;strong>facilita&lt;/strong> el cumplimiento legal pero no lo garantiza.&lt;/li>
&lt;li>No es una norma técnica de explicabilidad ni de robustez (esas son ISO/IEC 25059, 24029, 23894 y otras de la familia SC 42).&lt;/li>
&lt;/ul>
&lt;h2 id="distinción-con-marcos-vecinos">Distinción con marcos vecinos&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Marco&lt;/th>
&lt;th>Naturaleza&lt;/th>
&lt;th>Ámbito&lt;/th>
&lt;th>Certificable&lt;/th>
&lt;th>Solapamiento con 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>Norma de gestión&lt;/td>
&lt;td>AIMS para cualquier sistema IA&lt;/td>
&lt;td>Sí&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>Reglamento legal vinculante&lt;/td>
&lt;td>Sistemas IA en UE, riesgo-categorizado&lt;/td>
&lt;td>No (es ley)&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>Directiva ciberseguridad&lt;/td>
&lt;td>Entidades esenciales/importantes&lt;/td>
&lt;td>Vía Esquema Nacional&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>Reglamento español de seguridad&lt;/td>
&lt;td>Sector público y sus proveedores&lt;/td>
&lt;td>Sí (categorías B/M/A)&lt;/td>
&lt;td>Trazabilidad, gestión incidentes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 27001&lt;/strong>&lt;/td>
&lt;td>Norma de gestión&lt;/td>
&lt;td>Seguridad de información&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>Estructura Annex SL + Annex A solapan&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 27701&lt;/strong>&lt;/td>
&lt;td>Norma de gestión&lt;/td>
&lt;td>Privacidad (extiende 27001)&lt;/td>
&lt;td>Sí&lt;/td>
&lt;td>PII en datos de entrenamiento&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NIST AI RMF 1.0&lt;/strong>&lt;/td>
&lt;td>Marco voluntario&lt;/td>
&lt;td>Risk management AI&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Conceptualmente alineado, no idéntico&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 23894&lt;/strong>&lt;/td>
&lt;td>Norma técnica&lt;/td>
&lt;td>Risk management AI&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Insumo de A.5 (impact assessment)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 5259&lt;/strong>&lt;/td>
&lt;td>Familia&lt;/td>
&lt;td>Data quality for AI&lt;/td>
&lt;td>No&lt;/td>
&lt;td>Insumo de A.7 (data)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Tres distinciones que importan operativamente&lt;/strong> y que son fuente de confusión recurrente con clientes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ISO 42001 ≠ EU AI Act compliance&lt;/strong>. Tener la certificación 42001 facilita demostrar artículos 9-17 del Reglamento europeo, pero el Reglamento exige más cosas que 42001 no cubre directamente (CE marking de sistemas de alto riesgo, registro en la base de datos europea, declaración de conformidad, post-market monitoring específico). Implantar 42001 primero y luego completar los huecos del AI Act es la ruta estándar.&lt;/li>
&lt;li>&lt;strong>ISO 27001 no es suficiente&lt;/strong>. 27001 cubre confidencialidad, integridad y disponibilidad de la información. Falta el lado AI: sesgo, opacidad, deriva del modelo, calidad del corpus de entrenamiento, evaluación humana, impacto sobre afectados. 42001 es complemento, no sustituto. Las organizaciones con 27001 ya implantado tienen ventaja porque comparten la mitad de la documentación.&lt;/li>
&lt;li>&lt;strong>NIS2 ≠ AI safety&lt;/strong>. NIS2 obliga a registrar activos críticos, notificar incidentes en 24 h, gestionar la cadena de suministro digital. Los sistemas de IA pueden estar dentro del alcance NIS2 si forman parte del activo crítico (un LLM que sirve atención al cliente en una entidad financiera lo está), pero NIS2 no audita la calidad del modelo. 42001 sí.&lt;/li>
&lt;/ol>
&lt;h2 id="las-siete-cláusulas-annex-sl-el-índice-obligatorio">Las siete cláusulas (Annex SL): el índice obligatorio&lt;/h2>
&lt;p>Las siete cláusulas de la cláusula 4 a la 10 son &lt;strong>comunes a todas las normas de gestión modernas&lt;/strong> (Annex SL, también llamado &amp;ldquo;High Level Structure&amp;rdquo;). Esto significa que una organización con ISO 9001 o 27001 ya implantada reconoce la estructura. Las cláusulas 1-3 son introductorias (alcance, referencias normativas, términos).&lt;/p>
&lt;h3 id="cláusula-4--contexto-de-la-organización">Cláusula 4 — Contexto de la organización&lt;/h3>
&lt;p>Identificar el &lt;strong>contexto externo&lt;/strong> (regulación aplicable, expectativas de los clientes, riesgos sociales) y el &lt;strong>contexto interno&lt;/strong> (estrategia, cultura, capacidades). Identificar las &lt;strong>partes interesadas&lt;/strong> y sus expectativas: clientes, reguladores, afectados, empleados, proveedores. Definir el &lt;strong>alcance del AIMS&lt;/strong>: qué sistemas de IA están dentro y cuáles fuera.&lt;/p>
&lt;p>El gap habitual: organizaciones que dicen &amp;ldquo;todos nuestros sistemas IA están en el alcance&amp;rdquo; sin haberlos enumerado. El auditor pide la lista. Sin lista, no hay alcance.&lt;/p>
&lt;h3 id="cláusula-5--liderazgo">Cláusula 5 — Liderazgo&lt;/h3>
&lt;p>La dirección &lt;strong>debe&lt;/strong> aprobar y publicar una &lt;strong>política de IA&lt;/strong> (AI policy), asignar &lt;strong>roles y responsabilidades&lt;/strong> (típicamente AI lead, AI risk owner, data officer), y demostrar compromiso con recursos, comunicación y supervisión. La política es documento auditable y debe ser proporcionada al personal y partes interesadas.&lt;/p>
&lt;p>El gap habitual: política de IA genérica copiada de internet, sin medibles ni objetivos concretos. El auditor pide cómo se mide su cumplimiento. Sin métricas, la política es teatro.&lt;/p>
&lt;h3 id="cláusula-6--planificación">Cláusula 6 — Planificación&lt;/h3>
&lt;p>Identificar &lt;strong>riesgos y oportunidades&lt;/strong> del AIMS (no del modelo individual). Definir &lt;strong>objetivos de IA&lt;/strong> medibles, con plazos y responsables. Planificar los cambios al AIMS.&lt;/p>
&lt;p>El gap habitual: confundir riesgos del AIMS (¿qué pasa si no documentamos correctamente?) con riesgos del modelo (¿qué pasa si el modelo sesga?). El primero va aquí; el segundo va a A.5.&lt;/p>
&lt;h3 id="cláusula-7--soporte">Cláusula 7 — Soporte&lt;/h3>
&lt;p>&lt;strong>Recursos&lt;/strong> humanos, técnicos, financieros, infraestructura. &lt;strong>Competencia&lt;/strong> del personal (formación documentada). &lt;strong>Conciencia&lt;/strong> del personal sobre la política. &lt;strong>Comunicación&lt;/strong> interna y externa. &lt;strong>Información documentada&lt;/strong> (la columna vertebral del SI: política, procedimientos, registros, evidencias).&lt;/p>
&lt;p>El gap habitual: documentación dispersa en confluence/notion/drive sin control de versiones ni aprobaciones registradas. El auditor pide el último cambio: ¿quién lo aprobó? ¿cuándo? ¿con qué justificación?&lt;/p>
&lt;h3 id="cláusula-8--operación">Cláusula 8 — Operación&lt;/h3>
&lt;p>La cláusula más operativa. Exige:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Planificación y control operacional&lt;/strong>: cómo se gestiona el ciclo de vida del sistema de IA día a día. → Cubierto en el blog por &lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">pipeline LLMOps de seis etapas&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Impact assessment&lt;/strong> (vinculado a A.5).&lt;/li>
&lt;li>&lt;strong>Gestión del ciclo de vida del sistema de IA&lt;/strong> (vinculado a A.6).&lt;/li>
&lt;li>&lt;strong>Datos para sistemas de IA&lt;/strong> (vinculado a A.7).&lt;/li>
&lt;/ul>
&lt;p>Es la cláusula que &lt;strong>se materializa&lt;/strong> en los controles A.5, A.6, A.7. Por sí sola no añade requisitos nuevos: enlaza con el Annex A.&lt;/p>
&lt;h3 id="cláusula-9--evaluación-del-desempeño">Cláusula 9 — Evaluación del desempeño&lt;/h3>
&lt;p>&lt;strong>Monitoreo, medición, análisis, evaluación&lt;/strong>. &lt;strong>Auditorías internas&lt;/strong> (planificadas, con criterios, alcance, frecuencia, registro de resultados). &lt;strong>Revisión por la dirección&lt;/strong> (típicamente trimestral o semestral, con agenda obligatoria: inputs, evidencia, decisiones, acciones).&lt;/p>
&lt;p>El gap habitual: hay tracing OTel + Langfuse + Grafana y datos de sobra, pero no hay &lt;strong>agenda formal de revisión por la dirección&lt;/strong> con minuta documentada. El auditor pide la minuta. Sin minuta, no hay revisión.&lt;/p>
&lt;h3 id="cláusula-10--mejora">Cláusula 10 — Mejora&lt;/h3>
&lt;p>&lt;strong>No conformidad y acción correctiva&lt;/strong>: cuando algo falla, se registra, se analiza causa raíz, se acuerda corrección, se verifica eficacia. &lt;strong>Mejora continua&lt;/strong>: el sistema evoluciona deliberadamente.&lt;/p>
&lt;p>El gap habitual: tickets de Jira con post-mortems técnicos pero sin registro formal de &amp;ldquo;no conformidad ISO&amp;rdquo; que cierra con verificación de eficacia. Son dos artefactos distintos aunque puedan integrarse.&lt;/p>
&lt;h2 id="los-38-controles-del-annex-a-el-catálogo-ai-específico">Los 38 controles del Annex A: el catálogo AI-específico&lt;/h2>
&lt;p>A diferencia del Annex SL (común), el Annex A es la firma AI-específica de la 42001. Los 38 controles se organizan en 9 secciones (A.2 a A.10; A.1 es la introducción) que cubren los riesgos AI-específicos: opacidad, sesgo, deriva, calidad del corpus, impacto sobre afectados, dependencia de terceros. Cada control tiene &lt;strong>objetivo&lt;/strong> (qué se quiere conseguir) y &lt;strong>guidance de implementación&lt;/strong> en el Annex B.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Sección&lt;/th>
&lt;th>Foco&lt;/th>
&lt;th># controles&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>A.2&lt;/td>
&lt;td>Políticas relacionadas con IA&lt;/td>
&lt;td>2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.3&lt;/td>
&lt;td>Organización interna&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.4&lt;/td>
&lt;td>Recursos para sistemas IA&lt;/td>
&lt;td>6&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.5&lt;/td>
&lt;td>Evaluación de impactos&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.6&lt;/td>
&lt;td>Ciclo de vida del sistema IA&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.7&lt;/td>
&lt;td>Datos para sistemas IA&lt;/td>
&lt;td>5&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.8&lt;/td>
&lt;td>Información para partes interesadas&lt;/td>
&lt;td>4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.9&lt;/td>
&lt;td>Uso de sistemas IA&lt;/td>
&lt;td>3&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>A.10&lt;/td>
&lt;td>Terceros y relaciones con clientes&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>Lo que sigue es el mapeo control por sección al material que ya hemos cubierto en el blog. La intención editorial es enseñar &lt;strong>qué huecos quedan&lt;/strong> después de tener implementada la arquitectura técnica, para que el camino a certificación no empiece desde cero.&lt;/p>
&lt;h2 id="mapeo-cruzado-38-controles--posts-del-blog">Mapeo cruzado: 38 controles ↔ posts del blog&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="Mapeo de los controles ISO 42001 Annex A sobre la arquitectura LLM on-premise del blog">
&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">Annex A de ISO 42001 mapeado sobre la arquitectura LLM on-premise del blog&lt;/text>
&lt;text x="410" y="55" text-anchor="middle" class="ms">verde = cubierto por código/arquitectura · amarillo = parcial · rojo = hueco de gobierno&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 Políticas (2)&lt;/text>
&lt;text x="50" y="116" class="ms">A.2.2 Política de IA · A.2.3 Alineamiento con políticas existentes&lt;/text>
&lt;text x="500" y="100" class="ml">Estado: PARCIAL&lt;/text>
&lt;text x="500" y="116" class="ms">Disciplina editorial del blog enseña el ángulo; falta política escrita formal por organización.&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 Organización interna (3)&lt;/text>
&lt;text x="50" y="176" class="ms">A.3.2 Roles y responsabilidades · A.3.3 Reporting incidentes · A.3.4 Stakeholders&lt;/text>
&lt;text x="500" y="160" class="ml">Estado: HUECO&lt;/text>
&lt;text x="500" y="176" class="ms">No técnico. Requiere decisión organizativa: AI lead, risk owner, comité IA.&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 Recursos (6)&lt;/text>
&lt;text x="50" y="236" class="ms">Data, tooling, system, human, financial resources + documentación&lt;/text>
&lt;text x="500" y="220" class="ml">Estado: CUBIERTO&lt;/text>
&lt;text x="500" y="236" class="ms">Siete fases despliegue + cinco niveles madurez + siete capas + catálogo OSS.&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 · documentación · alineamiento con riesgos · individuos · sociedad&lt;/text>
&lt;text x="500" y="270" class="ml">Estado: PARCIAL&lt;/text>
&lt;text x="500" y="286" class="ms">ISO/IEC 23894 da el método; falta procedimiento formal de impact assessment por sistema.&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 Ciclo de vida (4)&lt;/text>
&lt;text x="50" y="336" class="ms">Objetivos · diseño · verificación validación · operación monitoreo · documentación&lt;/text>
&lt;text x="500" y="320" class="ml">Estado: CUBIERTO&lt;/text>
&lt;text x="500" y="336" class="ms">Pipeline 6 etapas + anatomía request + fine-tuning continuo + 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 Datos (5)&lt;/text>
&lt;text x="50" y="386" class="ms">Calidad · adquisición · provenance · preparación · privacidad&lt;/text>
&lt;text x="500" y="370" class="ml">Estado: CUBIERTO&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 Información partes (4)&lt;/text>
&lt;text x="50" y="436" class="ms">Documentación system · información sobre uso · comunicación incidentes · external reporting&lt;/text>
&lt;text x="500" y="420" class="ml">Estado: CUBIERTO&lt;/text>
&lt;text x="500" y="436" class="ms">Tracing OTel GenAI + Langfuse + lineage chunk→trace + spans guardrail.&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 Uso (3)&lt;/text>
&lt;text x="50" y="484" class="ms">Procesos uso responsable · objetivos uso · uso adecuado&lt;/text>
&lt;text x="500" y="470" class="ml">Estado: CUBIERTO&lt;/text>
&lt;text x="500" y="484" class="ms">Guardrails + evals + LLM Guard + retrain incident-driven.&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 Terceros (4)&lt;/text>
&lt;text x="50" y="534" class="ms">Allocation responsabilidades · supplier · customer · third-party&lt;/text>
&lt;text x="500" y="520" class="ml">Estado: CUBIERTO&lt;/text>
&lt;text x="500" y="534" class="ms">OSS vs hyperscalers + catálogo OSS + soberanía + lock-in analysis.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;h3 id="a2--políticas-de-ia-2-controles-parcial">A.2 — Políticas de IA (2 controles): PARCIAL&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.2.2 AI policy&lt;/strong>: la organización debe tener una política de IA documentada, aprobada por dirección, revisada periódicamente, comunicada y disponible. Cubre principios, alcance, compromisos.&lt;/li>
&lt;li>&lt;strong>A.2.3 Alignment with other policies&lt;/strong>: la política de IA no es huérfana — se alinea con políticas existentes de seguridad, privacidad, calidad, ética.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Hueco&lt;/strong>: no es asunto del código. La política de IA es un documento que la dirección de la organización aprueba y firma. El blog enseña la postura editorial neutra y técnica (sin hype, soberanía, OSS por defecto en ENS/NIS2) pero esto no es la política IA de una organización concreta. Cada cliente debe redactarla y firmarla.&lt;/p>
&lt;p>&lt;strong>Plantilla mínima&lt;/strong>: 1-2 páginas con: principios (transparencia, supervisión humana, fairness, responsabilidad, sostenibilidad), alcance (qué sistemas), compromisos medibles (revisión anual, evaluación de impacto antes de despliegue, formación al equipo), gobierno (quién aprueba qué).&lt;/p>
&lt;h3 id="a3--organización-interna-3-controles-hueco">A.3 — Organización interna (3 controles): HUECO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.3.2 AI roles and responsibilities&lt;/strong>: roles definidos, no solapados, comunicados. Típicamente: AI lead, AI risk owner, data steward, AI ethics officer (puede ser uno solo en organizaciones pequeñas).&lt;/li>
&lt;li>&lt;strong>A.3.3 Reporting of AI incidents/concerns&lt;/strong>: canal para que cualquier persona (interna o externa) reporte un problema con un sistema IA, con seguimiento documentado.&lt;/li>
&lt;li>&lt;strong>A.3.4 Identification of stakeholders&lt;/strong>: lista mantenida de stakeholders (clientes, afectados, reguladores, partners) y sus expectativas.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Hueco&lt;/strong>: tampoco técnico. Decisión organizativa. La forma habitual de cubrirlo es nombrar un AI lead (puede ser el CIO, CTO o un rol nuevo dependiendo del tamaño), reusar el canal de reporting de seguridad (típicamente ya existe por 27001) extendiéndolo a IA, y mantener un registro vivo de stakeholders.&lt;/p>
&lt;h3 id="a4--recursos-6-controles-cubierto">A.4 — Recursos (6 controles): CUBIERTO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.4.2 Documented information&lt;/strong>: documentación del AIMS.&lt;/li>
&lt;li>&lt;strong>A.4.3 Data resources&lt;/strong>: identificación y gestión de los datos disponibles para entrenamiento, evaluación, operación.&lt;/li>
&lt;li>&lt;strong>A.4.4 Tooling resources&lt;/strong>: herramientas de desarrollo, validación, monitoreo.&lt;/li>
&lt;li>&lt;strong>A.4.5 System resources&lt;/strong>: hardware, infraestructura, cómputo.&lt;/li>
&lt;li>&lt;strong>A.4.6 Human resources&lt;/strong>: personal con competencia.&lt;/li>
&lt;li>&lt;strong>A.4.7 Financial resources&lt;/strong>: presupuesto.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cubierto por el blog&lt;/strong> en los tres posts arquitectónicos:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">Anatomía del stack: siete capas&lt;/a> — A.4.5 system resources, A.4.4 tooling.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/siete-fases-despliegue-plataforma-llm-on-premise/">Siete fases del despliegue&lt;/a> — A.4.5 + A.4.7 (presupuesto implícito).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">Cinco niveles de madurez&lt;/a> — A.4.5 + A.4.6 (madurez del equipo).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">Catálogo OSS de herramientas&lt;/a> — A.4.4 tooling.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> — A.4.3 data resources.&lt;/li>
&lt;/ul>
&lt;h3 id="a5--impact-assessment-5-controles-parcial">A.5 — Impact assessment (5 controles): PARCIAL&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.5.2 AI impact assessment process&lt;/strong>: procedimiento documentado de evaluación de impacto.&lt;/li>
&lt;li>&lt;strong>A.5.3 Documentation of AI impact assessments&lt;/strong>: registros de las evaluaciones hechas.&lt;/li>
&lt;li>&lt;strong>A.5.4 Alignment with AI risk treatment&lt;/strong>: las decisiones del impact assessment alimentan el tratamiento de riesgos.&lt;/li>
&lt;li>&lt;strong>A.5.5 Impacts on individuals&lt;/strong>: dimensiones específicas sobre personas afectadas (derechos, discriminación, privacidad).&lt;/li>
&lt;li>&lt;strong>A.5.6 Societal impacts&lt;/strong>: dimensiones sobre la sociedad (información, derechos sociales).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Parcial&lt;/strong>: el método existe en la familia ISO/IEC SC 42 — &lt;strong>ISO/IEC 23894:2023&lt;/strong> es la norma técnica de risk management para IA y NIST AI RMF 1.0 es el equivalente americano de uso libre. Pero la organización debe &lt;strong>escribir su procedimiento&lt;/strong> y &lt;strong>ejecutarlo por sistema antes del despliegue&lt;/strong>. No es código, es disciplina.&lt;/p>
&lt;p>&lt;strong>Plantilla mínima&lt;/strong> del impact assessment (3-5 páginas por sistema):&lt;/p>
&lt;ol>
&lt;li>Descripción del sistema (qué hace, a quién sirve, modelo y stack subyacentes).&lt;/li>
&lt;li>Stakeholders identificados.&lt;/li>
&lt;li>Impactos potenciales (intencionados + no intencionados) en personas, grupos y sociedad.&lt;/li>
&lt;li>Métricas de fairness y robustez aplicadas, con umbrales y resultados.&lt;/li>
&lt;li>Mitigaciones aplicadas (guardrails, evals, supervisión humana, rate limiting).&lt;/li>
&lt;li>Riesgos residuales aceptados, con justificación firmada.&lt;/li>
&lt;li>Cadencia de revisión (típicamente anual o ante cambio sustancial).&lt;/li>
&lt;/ol>
&lt;h3 id="a6--ciclo-de-vida-del-sistema-ia-4-controles-cubierto">A.6 — Ciclo de vida del sistema IA (4 controles): CUBIERTO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.6.2.2 Objectives for responsible development of AI&lt;/strong>: objetivos de desarrollo responsable definidos por sistema.&lt;/li>
&lt;li>&lt;strong>A.6.2.3 Processes for responsible AI design and development&lt;/strong>: procedimientos de diseño y desarrollo.&lt;/li>
&lt;li>&lt;strong>A.6.2.4 AI system requirements and specifications&lt;/strong>: especificación formal del sistema.&lt;/li>
&lt;li>&lt;strong>A.6.2.5 Verification and validation&lt;/strong>: V&amp;amp;V antes y durante operación.&lt;/li>
&lt;li>&lt;strong>A.6.2.6 Deployment&lt;/strong>: procedimientos de despliegue.&lt;/li>
&lt;li>&lt;strong>A.6.2.7 Operation and monitoring&lt;/strong>: operación y monitoreo continuo.&lt;/li>
&lt;li>&lt;strong>A.6.2.8 Documentation&lt;/strong>: documentación del ciclo de vida.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cubierto por el blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">Pipeline LLMOps de seis etapas&lt;/a> — el mapa maestro completo del ciclo de vida.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM&lt;/a> — la versión forense de cómo se ejecuta en producción.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">Fine-tuning continuo en producción&lt;/a> — la disciplina A.6.2.3 + A.6.2.5 + A.6.2.6 + A.6.2.7 en operativa real.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> — A.6.2.5 verification and validation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain&lt;/a> — A.6.2.7 operación + iteración continua.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/alignment-moderno-dpo-kto-orpo-simpo/">Alignment moderno: DPO, KTO, ORPO, SimPO&lt;/a> — A.6.2.3 design responsable.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mlops-llms-panorama-2026/">MLOps panorama 2026&lt;/a> — el panorama de herramientas.&lt;/li>
&lt;/ul>
&lt;h3 id="a7--datos-para-sistemas-ia-5-controles-cubierto">A.7 — Datos para sistemas IA (5 controles): CUBIERTO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.7.2 Data for development and enhancement of AI&lt;/strong>: política y procedimientos de gestión de datos para desarrollo y mejora.&lt;/li>
&lt;li>&lt;strong>A.7.3 Acquisition of data&lt;/strong>: procedimientos de adquisición (origen, autorización, calidad).&lt;/li>
&lt;li>&lt;strong>A.7.4 Quality of data for AI systems&lt;/strong>: criterios de calidad medibles.&lt;/li>
&lt;li>&lt;strong>A.7.5 Data provenance&lt;/strong>: lineage del dato.&lt;/li>
&lt;li>&lt;strong>A.7.6 Data preparation&lt;/strong>: procedimientos de preparación (chunking, anonimización, etiquetado).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cubierto por el blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">RAG corpus curation: el bibliotecario activo&lt;/a> — A.7.4 + A.7.5 + A.7.6 al detalle (cinco capas: schema, dedup, PII, anti-contaminación, lineage).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning: DVC y lakeFS&lt;/a> — A.7.2 + A.7.5 (los cuatro artefactos data versionados con lineage).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/rag-reranker-hybrid-retrieval-fundamentos/">Reranker y hybrid retrieval&lt;/a> — A.7.6 preparación + filtrado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a> — A.7.6 anonimización en runtime con Vault.&lt;/li>
&lt;/ul>
&lt;h3 id="a8--información-para-partes-interesadas-4-controles-cubierto">A.8 — Información para partes interesadas (4 controles): CUBIERTO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.8.2 System documentation and information for users&lt;/strong>: documentación técnica disponible.&lt;/li>
&lt;li>&lt;strong>A.8.3 External reporting&lt;/strong>: capacidad de reportar a autoridades cuando aplique.&lt;/li>
&lt;li>&lt;strong>A.8.4 Communication of incidents to users&lt;/strong>: notificación a usuarios cuando hay incidente.&lt;/li>
&lt;li>&lt;strong>A.8.5 Information for interested parties&lt;/strong>: información para otros stakeholders.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cubierto por el blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> — A.8.2 trazabilidad por request, A.8.3 capacidad de extraer reporting forense.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">Prompt versioning con Langfuse y MLflow&lt;/a> — A.8.2 versionado documentado.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — A.8.4 spans &lt;code>gen_ai.guardrail.*&lt;/code> como base para notificación de incidentes.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a> — A.8.4 incident events para retrain.&lt;/li>
&lt;/ul>
&lt;h3 id="a9--uso-de-sistemas-ia-3-controles-cubierto">A.9 — Uso de sistemas IA (3 controles): CUBIERTO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.9.2 Processes for responsible use of AI&lt;/strong>: procedimientos de uso responsable.&lt;/li>
&lt;li>&lt;strong>A.9.3 Objectives for responsible use of AI&lt;/strong>: objetivos.&lt;/li>
&lt;li>&lt;strong>A.9.4 Intended use of AI systems&lt;/strong>: documentación del uso previsto.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cubierto por el blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — A.9.2 + A.9.3 (las cuatro líneas de defensa).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a> — A.9.2 detalle operativo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> — A.9.3 medición de objetivos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain&lt;/a> — A.9.2 closed loop.&lt;/li>
&lt;/ul>
&lt;h3 id="a10--terceros-y-relaciones-con-clientes-4-controles-cubierto">A.10 — Terceros y relaciones con clientes (4 controles): CUBIERTO&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A.10.2 Allocation of responsibilities&lt;/strong>: distribución de responsabilidades entre roles AI.&lt;/li>
&lt;li>&lt;strong>A.10.3 Suppliers&lt;/strong>: procedimientos para proveedores AI.&lt;/li>
&lt;li>&lt;strong>A.10.4 Customers&lt;/strong>: procedimientos hacia clientes.&lt;/li>
&lt;li>&lt;strong>A.10.5 Third parties&lt;/strong>: procedimientos para terceros.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Cubierto por el blog&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">El catálogo paralelo: OSS vs hyperscalers&lt;/a> — A.10.3 evaluación de proveedores con análisis de lock-in y soberanía contractual.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">El catálogo OSS para LLMOps&lt;/a> — A.10.5 inventario de terceros (componentes OSS con licencias y gobierno).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM&lt;/a> — A.10.2 + A.10.4 en el caso multi-tenant.&lt;/li>
&lt;/ul>
&lt;h2 id="los-roles-definidos-por-la-norma">Los roles definidos por la norma&lt;/h2>
&lt;p>ISO/IEC 22989:2022 (vocabulario IA, complementaria a 42001) define seis roles. Cada organización debe decidir cuáles ocupa y documentarlo:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Rol&lt;/th>
&lt;th>Definición&lt;/th>
&lt;th>Responsabilidad principal&lt;/th>
&lt;th>Ejemplo&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>AI provider&lt;/strong>&lt;/td>
&lt;td>Organización que provee el sistema IA a otros&lt;/td>
&lt;td>Hace que el sistema esté disponible&lt;/td>
&lt;td>OpenAI provee GPT-5 vía API&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI producer&lt;/strong>&lt;/td>
&lt;td>Organización que desarrolla el sistema IA&lt;/td>
&lt;td>Diseño, desarrollo, validación&lt;/td>
&lt;td>Meta produce Llama 4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI customer&lt;/strong>&lt;/td>
&lt;td>Organización que adquiere el sistema IA&lt;/td>
&lt;td>Selección, integración, supervisión&lt;/td>
&lt;td>Una consultora que integra un LLM en un producto propio&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI partner&lt;/strong>&lt;/td>
&lt;td>Organización que colabora con otra rol AI&lt;/td>
&lt;td>Compartido&lt;/td>
&lt;td>Un fabricante de hardware GPU&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>AI subject&lt;/strong>&lt;/td>
&lt;td>Persona/grupo afectado por el sistema&lt;/td>
&lt;td>Receptora del impacto&lt;/td>
&lt;td>El usuario final del chatbot&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Relevant authority&lt;/strong>&lt;/td>
&lt;td>Regulador con jurisdicción&lt;/td>
&lt;td>Supervisión externa&lt;/td>
&lt;td>AEPD, CNMC, autoridades EU AI Act&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Una organización puede ocupar &lt;strong>varios roles a la vez&lt;/strong>, lo cual cambia los controles aplicables. Un patrón habitual en consultoría es: producer + customer + provider hacia el cliente final. Las responsabilidades A.10 se modulan según los roles.&lt;/p>
&lt;p>&lt;strong>Ejemplo de mapeo de roles&lt;/strong> del chatbot multi-tenant del post forense:&lt;/p>
&lt;ul>
&lt;li>Fabricante del modelo base (Llama 4): &lt;strong>AI producer&lt;/strong> del modelo base.&lt;/li>
&lt;li>Operador del stack OSS (consultora): &lt;strong>AI producer&lt;/strong> del adapter LoRA + &lt;strong>AI provider&lt;/strong> del chatbot a sus clientes + &lt;strong>AI customer&lt;/strong> del modelo base de Meta.&lt;/li>
&lt;li>Cliente final (aseguradora): &lt;strong>AI customer&lt;/strong> del chatbot + &lt;strong>AI provider&lt;/strong> del servicio de atención al cliente.&lt;/li>
&lt;li>Asegurado: &lt;strong>AI subject&lt;/strong>.&lt;/li>
&lt;li>AEPD + autoridad EU AI Act: &lt;strong>relevant authority&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>Cada caja del cuadro genera obligaciones distintas. La consultora, por ser producer del adapter, debe documentar A.6 (ciclo de vida) y A.7 (datos) del adapter. Por ser provider del chatbot, debe documentar A.10.4 (customers). Por ser customer del modelo base, debe documentar A.10.3 (suppliers) y validar que Meta cumple su parte.&lt;/p>
&lt;h2 id="niveles-de-impacto-y-proporcionalidad">Niveles de impacto y proporcionalidad&lt;/h2>
&lt;p>42001 no obliga el mismo rigor a todos los sistemas. La cláusula 6.1.2 y el control A.5 introducen el concepto de &lt;strong>impacto&lt;/strong> como modulador. La norma no define categorías taxativas (a diferencia del EU AI Act, que sí define &amp;ldquo;prohibido / alto riesgo / riesgo limitado / mínimo&amp;rdquo;), pero recomienda usar niveles según severidad y probabilidad.&lt;/p>
&lt;p>La práctica industrial 2026 alinea los niveles 42001 con las categorías del EU AI Act:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Nivel 42001&lt;/th>
&lt;th>EU AI Act&lt;/th>
&lt;th>Ejemplos&lt;/th>
&lt;th>Profundidad de controles&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Alto&lt;/strong>&lt;/td>
&lt;td>Alto riesgo (Anexo III)&lt;/td>
&lt;td>Scoring crediticio, RRHH, salud, infraestructura crítica&lt;/td>
&lt;td>Impact assessment exhaustivo, supervisión humana obligatoria, monitoreo continuo, evals adversariales, registro detallado, revisión por dirección semestral&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Medio&lt;/strong>&lt;/td>
&lt;td>Riesgo limitado&lt;/td>
&lt;td>Chatbots customer service no automatizan decisiones, asistentes de productividad&lt;/td>
&lt;td>Impact assessment estándar, guardrails completos, revisión anual&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Bajo&lt;/strong>&lt;/td>
&lt;td>Riesgo mínimo&lt;/td>
&lt;td>Filtros de spam, recomendaciones de contenido no personalizado&lt;/td>
&lt;td>Impact assessment ligero, controles básicos&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Esta proporcionalidad es &lt;strong>clave operativa&lt;/strong>: implantar 42001 al máximo rigor para un sistema de bajo riesgo es desperdicio; relajarla en uno de alto riesgo es incumplimiento.&lt;/p>
&lt;h2 id="los-siete-documentos-mínimos-del-aims">Los siete documentos mínimos del AIMS&lt;/h2>
&lt;p>Un auditor en Stage 1 (revisión documental) pide entre siete y diez documentos. Los siete imprescindibles:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Política de IA&lt;/strong> (cláusula 5.2 + A.2.2). 1-2 páginas. Aprobada por dirección, fechada, versionada.&lt;/li>
&lt;li>&lt;strong>Alcance del AIMS&lt;/strong> (cláusula 4.3). Lista de sistemas IA dentro del alcance, criterios de inclusión.&lt;/li>
&lt;li>&lt;strong>Registro de stakeholders&lt;/strong> (cláusula 4.2 + A.3.4). Lista mantenida con expectativas.&lt;/li>
&lt;li>&lt;strong>Registro de riesgos AIMS&lt;/strong> (cláusula 6.1). Riesgos del sistema de gestión, no de cada modelo.&lt;/li>
&lt;li>&lt;strong>Procedimiento de impact assessment&lt;/strong> (A.5.2) + &lt;strong>registros de assessments ejecutados&lt;/strong> (A.5.3). Procedimiento + uno o varios assessments hechos.&lt;/li>
&lt;li>&lt;strong>Procedimiento de ciclo de vida de IA&lt;/strong> (A.6.2) — puede ser literalmente &amp;ldquo;consultar el pipeline LLMOps de seis etapas&amp;rdquo; con referencias a runbooks técnicos.&lt;/li>
&lt;li>&lt;strong>Procedimiento de gestión de datos&lt;/strong> (A.7.2) — incluye adquisición, calidad, provenance, preparación, anonimización.&lt;/li>
&lt;/ol>
&lt;p>Documentos adicionales habituales:&lt;/p>
&lt;ol start="8">
&lt;li>&lt;strong>Política de uso responsable&lt;/strong> (A.9.2) con tipos de uso permitidos/no permitidos.&lt;/li>
&lt;li>&lt;strong>Procedimiento de gestión de terceros AI&lt;/strong> (A.10.3, A.10.5) con criterios de evaluación de proveedores AI.&lt;/li>
&lt;li>&lt;strong>Plan de auditorías internas&lt;/strong> + &lt;strong>agenda de revisión por dirección&lt;/strong> (cláusulas 9.2 + 9.3).&lt;/li>
&lt;/ol>
&lt;p>Para una organización con &lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">stack OSS&lt;/a> maduro, los documentos 6 y 7 son &lt;strong>referencias&lt;/strong> a artefactos técnicos ya existentes (runbooks de pipeline, configuraciones de DVC, política de PII en LLM Guard). El esfuerzo documental real está en los documentos 1, 2, 3, 4, 5.&lt;/p>
&lt;h2 id="caso-aplicado-el-chatbot-multi-tenant-del-blog--checklist-42001">Caso aplicado: el chatbot multi-tenant del blog → checklist 42001&lt;/h2>
&lt;p>Tomamos el sistema descrito en el &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a> —chatbot multi-tenant de atención al cliente para aseguradoras sobre stack OSS on-premise— y lo recorremos como auditor 42001 haría.&lt;/p>
&lt;p>&lt;strong>Cláusula 4 — Contexto&lt;/strong>. El alcance del AIMS incluye el chatbot, no incluye el sistema interno de RRHH (otra IA distinta). Stakeholders identificados: aseguradoras cliente, asegurados afectados, AEPD, autoridad EU AI Act (cuando entre en vigor 2 ago 2026), proveedor Meta (modelo base), proveedor de hardware NVIDIA. → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cláusula 5 — Liderazgo&lt;/strong>. Política de IA firmada por CEO, vigente. Roles asignados: AI lead (CTO), AI risk owner (CISO), data steward (Head of Data), AI ethics committee trimestral. → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cláusula 6 — Planificación&lt;/strong>. Registro de riesgos AIMS: documentación incompleta, churn del equipo, dependencia de proveedor único de GPU, cambio regulatorio EU AI Act. Objetivos AIMS para 2026: certificación 42001 antes Q4, cumplimiento EU AI Act high-risk antes 2 ago. → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cláusula 7 — Soporte&lt;/strong>. Recursos: cluster &lt;a href="https://blog.lo0.es/posts/disaggregated-serving-prefill-decode/">4×H100 SXM&lt;/a> + &lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">siete capas del stack&lt;/a>. Competencia: 2 MLE + 2 SRE + 1 AI ethics part-time, todos con formación documentada. Comunicación: política de IA en intranet + handbook. → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cláusula 8 — Operación&lt;/strong>. Procedimientos operativos = &lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">pipeline LLMOps de seis etapas&lt;/a>. Impact assessment ejecutado antes del despliegue + revisión anual + revisión ante cambio sustancial (definido: cambio de modelo base, cambio de adapter mayor, expansión a nuevo tenant). → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cláusula 9 — Evaluación&lt;/strong>. Monitoring: &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Langfuse + Tempo + VictoriaMetrics + Grafana&lt;/a>. Métricas obligatorias en dashboard: F1 por categoría guardrail sobre tráfico real, drift estadístico, faithfulness RAG, tasa de refused. Auditoría interna trimestral con criterios escritos. Revisión por dirección semestral con minuta firmada. → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Cláusula 10 — Mejora&lt;/strong>. Tickets de incident-driven retrain mapeados como no-conformidades cuando severity ≥ HIGH. Análisis causa raíz documentado. Eficacia verificada en el siguiente eval gate. → &lt;strong>Documentado&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Annex A — Por sección&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>A.2 (Políticas): política de IA + política de uso responsable. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.3 (Organización): roles asignados, canal de reporting, registro de stakeholders. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.4 (Recursos): &lt;a href="https://blog.lo0.es/posts/siete-fases-despliegue-plataforma-llm-on-premise/">siete fases despliegue&lt;/a> + &lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">catálogo OSS&lt;/a> + plan de formación + presupuesto anual. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.5 (Impact): procedimiento + assessments por sistema + métricas de fairness aplicadas. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.6 (Ciclo de vida): &lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">pipeline LLMOps&lt;/a> + &lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">fine-tuning continuo&lt;/a> + &lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">retrain&lt;/a>. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.7 (Datos): &lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">data versioning&lt;/a> + &lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">RAG corpus curation&lt;/a> + &lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard Vault&lt;/a> + Presidio. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.8 (Información partes): &lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">tracing OTel&lt;/a> + Langfuse + spans &lt;code>gen_ai.guardrail.*&lt;/code> + notificación a tenants en SLA. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.9 (Uso): &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a> + &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">evals&lt;/a> + política de uso responsable. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;li>A.10 (Terceros): &lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">OSS vs hyperscalers&lt;/a> con análisis de lock-in + contrato Meta para modelo base + contratos con tenants. → &lt;strong>Documentado&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>Resultado del recorrido: &lt;strong>certificable&lt;/strong>. Los huecos típicos (A.2.2 política escrita, A.3 roles, A.5 procedimiento de impact assessment) están cubiertos como documentos formales. Las cláusulas operativas (8, 9, 10) se apoyan en la arquitectura técnica del blog. La distancia entre &amp;ldquo;tener la arquitectura&amp;rdquo; y &amp;ldquo;tener certificación&amp;rdquo; se mide en disciplina documental, no en código.&lt;/p>
&lt;h2 id="mapeo-cruzado-con-eu-ai-act-nis2-y-ens">Mapeo cruzado con EU AI Act, NIS2 y ENS&lt;/h2>
&lt;h3 id="eu-ai-act-reg-20241689--siete-artículos-directamente-alineados">EU AI Act (Reg. 2024/1689) — siete artículos directamente alineados&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Artículo EU AI Act&lt;/th>
&lt;th>Tema&lt;/th>
&lt;th>Control 42001 alineado&lt;/th>
&lt;th>Aplicable a&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 + cláusula 6&lt;/td>
&lt;td>Sistemas alto riesgo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 10&lt;/td>
&lt;td>Data and data governance&lt;/td>
&lt;td>A.7 (todos)&lt;/td>
&lt;td>Sistemas alto riesgo&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>Sistemas alto riesgo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 12&lt;/td>
&lt;td>Record-keeping (logs)&lt;/td>
&lt;td>A.8.2 + tracing OTel&lt;/td>
&lt;td>Sistemas alto riesgo&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>Sistemas alto riesgo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 14&lt;/td>
&lt;td>Human oversight&lt;/td>
&lt;td>A.9.2 + supervisión documentada&lt;/td>
&lt;td>Sistemas alto riesgo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Art. 17&lt;/td>
&lt;td>Quality management system&lt;/td>
&lt;td>Cláusulas 4-10&lt;/td>
&lt;td>Proveedores alto riesgo&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Las &lt;strong>obligaciones principales para sistemas de alto riesgo&lt;/strong> entran en aplicación el &lt;strong>2 de agosto de 2026&lt;/strong>. Implantar 42001 ahora construye la base de gestión que ese deadline exige.&lt;/p>
&lt;p>Qué falta para cumplimiento EU AI Act que &lt;strong>no&lt;/strong> cubre 42001:&lt;/p>
&lt;ul>
&lt;li>Conformidad CE de los sistemas de alto riesgo (declaración de conformidad, marcado, registro en EU database).&lt;/li>
&lt;li>Post-market monitoring específico exigido por el Art. 72.&lt;/li>
&lt;li>Reporting de incidentes graves a autoridades en plazos legales (no sólo a usuarios).&lt;/li>
&lt;li>Obligaciones de transparencia a usuarios para sistemas de riesgo limitado (Art. 50): chatbots, deepfakes, contenido generado.&lt;/li>
&lt;li>Prohibiciones del Art. 5 (social scoring, manipulación, biometría en tiempo real con excepciones).&lt;/li>
&lt;/ul>
&lt;h3 id="nis2-dir-20222555--tres-pilares-con-solapamiento">NIS2 (Dir. 2022/2555) — tres pilares con solapamiento&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Asset register&lt;/strong> (Art. 21.2.f): los sistemas IA en alcance NIS2 deben estar en el inventario de activos. → Solapa con A.4 + cláusula 4.3 (alcance).&lt;/li>
&lt;li>&lt;strong>Incident notification&lt;/strong> (Art. 23): incidentes significativos se notifican en 24 h (alerta inicial) + 72 h (informe detallado). → Solapa con A.3.3 (reporting) + cláusula 10 (improvement).&lt;/li>
&lt;li>&lt;strong>Supply chain security&lt;/strong> (Art. 21.2.d): evaluación de seguridad de la cadena de suministro digital. → Solapa con A.10.3 (suppliers).&lt;/li>
&lt;/ul>
&lt;p>Para entidades NIS2 esenciales que &lt;strong>además&lt;/strong> usan sistemas IA, 42001 cubre la parte AI-específica que NIS2 exige inferencialmente pero no detalla.&lt;/p>
&lt;h3 id="ens-rd-3112022">ENS (RD 311/2022)&lt;/h3>
&lt;p>El Esquema Nacional de Seguridad español ya contempla expresamente IA en su anexo II (controles ENS). Categorías Básico/Medio/Alto se alinean con niveles de impacto 42001. Los controles ENS de &lt;strong>trazabilidad&lt;/strong> (op.exp.8), &lt;strong>registro de actividad&lt;/strong> (op.exp.10) y &lt;strong>gestión de incidentes&lt;/strong> (op.exp.7) se cubren con los mismos artefactos técnicos que A.8 y A.5 de 42001. Una organización certificada en ENS Categoría Alta con sistemas IA está a un esfuerzo razonable de añadir 42001.&lt;/p>
&lt;h2 id="las-cinco-trampas-habituales-de-la-certificación">Las cinco trampas habituales de la certificación&lt;/h2>
&lt;p>&lt;strong>Trampa 1 — Confundir 42001 con cumplimiento EU AI Act.&lt;/strong> Pasar la auditoría 42001 no implica conformidad con el Reglamento europeo. Son universos distintos con solapamiento del 60-70%. La trampa se descubre cuando el cliente pide CE marking del sistema de alto riesgo y la organización presenta sólo el certificado 42001.&lt;/p>
&lt;p>&lt;strong>Trampa 2 — Sobre-documentar.&lt;/strong> Manuales de 200 páginas con procedimientos copiados de plantillas, sin medibles ni evidencias de aplicación. El auditor pide la última ejecución del procedimiento — si no hay registros, los procedimientos son ornamento. La regla práctica: prefiere documentos cortos referenciando artefactos técnicos vivos a documentos largos auto-contenidos.&lt;/p>
&lt;p>&lt;strong>Trampa 3 — Sub-medir.&lt;/strong> Definir objetivos AIMS sin métricas operativas. &amp;ldquo;Mejorar la calidad del modelo&amp;rdquo; es objetivo nulo; &amp;ldquo;F1 por categoría guardrail ≥ 0,85 sobre tráfico real, medido semanalmente, revisado trimestralmente en management review&amp;rdquo; es objetivo auditable. El blog ha insistido en esto en cada post de &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">evals&lt;/a>, &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a> y &lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">retrain&lt;/a>.&lt;/p>
&lt;p>&lt;strong>Trampa 4 — Ignorar A.5 hasta el día del audit.&lt;/strong> El impact assessment es el control más infravalorado y el primero que pide el auditor. Sin assessments por sistema ejecutados antes del despliegue, no hay forma de demostrar A.5. La trampa se descubre cuando ya no hay tiempo de hacer assessments retrospectivos creíbles.&lt;/p>
&lt;p>&lt;strong>Trampa 5 — Asumir que 27001 cubre lo AI.&lt;/strong> Las organizaciones con 27001 ya implantado a veces piensan que &amp;ldquo;tenemos la mitad hecha&amp;rdquo;. Es verdad para Annex SL (estructura) y para A.5/A.6/A.7 de 27001 (no de 42001) en lo que se refiere a infosec. Es falso para A.5 de 42001 (impact assessment), A.7 de 42001 (data quality AI-específica), A.9 (uso responsable) y A.10.4 (customers AI). Hay que añadir, no asumir.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-próximos-posts">Lo que no hemos cubierto (próximos posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Plantillas concretas&lt;/strong> de los siete documentos obligatorios, con ejemplos de redacción y métricas. Material para un post tipo &amp;ldquo;Manual del AIMS en 7 documentos&amp;rdquo; con frame de referencia.&lt;/li>
&lt;li>&lt;strong>Mapeo detallado a EU AI Act por artículo&lt;/strong> con la checklist de evidencias técnicas que se pueden derivar del stack OSS del blog. Especialmente Arts 11 (technical documentation), 14 (human oversight) y 72 (post-market monitoring).&lt;/li>
&lt;li>&lt;strong>Caso ENS Categoría Alta + 42001&lt;/strong> combinados: qué controles ENS se cubren con qué artefactos del AIMS, evitando duplicidades.&lt;/li>
&lt;li>&lt;strong>Comparativa NIST AI RMF 1.0 vs 42001&lt;/strong>: muchos clientes internacionales piden ambos. Cómo se reciclan los mismos artefactos para satisfacer los dos frameworks.&lt;/li>
&lt;li>&lt;strong>42001 para agentes LLM y MCP&lt;/strong>: dimensiones nuevas que emergen cuando el sistema IA es agéntico (excessive agency, tool use, autonomía graduada). El post de &lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">guardrails&lt;/a> introdujo la línea 3 (tool GR); 42001 tiene huecos abiertos en este terreno y la SC 42 trabaja en addendums.&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&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="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">El pipeline LLMOps de seis etapas&lt;/a> — el procedimiento operativo que materializa A.6 ciclo de vida sin trabajo adicional.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM en producción&lt;/a> — el caso forense recorrido como checklist 42001 en la sección &amp;ldquo;caso aplicado&amp;rdquo; de este post.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">Siete capas del stack de inferencia LLM on-premise&lt;/a> y &lt;a href="https://blog.lo0.es/posts/siete-fases-despliegue-plataforma-llm-on-premise/">siete fases del despliegue&lt;/a> — material directo para A.4 recursos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/cinco-niveles-madurez-plataforma-llm-on-premise/">Cinco niveles de madurez de la plataforma&lt;/a> — cómo justificar la proporcionalidad de los controles según el nivel de madurez existente.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> y &lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">RAG corpus curation&lt;/a> — A.7 datos cubierto al detalle.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> — A.8 información a partes interesadas a través de trazabilidad estandarizada.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> y &lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a> — A.9 uso responsable.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> y &lt;a href="https://blog.lo0.es/posts/llm-as-judge-fundamentos/">LLM-as-judge&lt;/a> — A.6.2.5 verification and validation.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain: cerrar el bucle feedback → dataset → adapter&lt;/a> — cláusula 10 mejora continua + bucle incident-driven que alimenta no-conformidades formales.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">El catálogo paralelo: OSS vs hyperscalers&lt;/a> — A.10.3 evaluación de proveedores con análisis estructural de lock-in y soberanía contractual; insumo directo del registro de proveedores AI.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">El catálogo OSS para LLMOps&lt;/a> — A.10.5 inventario de terceros OSS con licencia, gobierno y madurez documentados.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/mlops-llms-panorama-2026/">MLOps específico para LLMs en 2026: panorama&lt;/a> — contexto operativo en el que el AIMS opera y se audita.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/eu-ai-act-mapeo-arquitectura-llm-on-premise/">EU AI Act: el expediente técnico artículo por artículo&lt;/a> — el post hermano sobre el Reglamento UE 2024/1689; baja del sistema de gestión a las obligaciones legales directamente aplicables, con plazos, sanciones y mapeo control-a-artículo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/controles-tecnicos-ens-42001-eu-ai-act/">Controles técnicos: el mapeo cruzado ENS × ISO 42001 × EU AI Act&lt;/a> — el tercer post de la trilogía de gobernanza; baja al detalle de los 25 controles técnicos comunes a los tres marcos con la tabla maestra de cumplimiento triple y el etiquetado de evidencia.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/runbooks-incident-response-llm-keep-kafka/">Runbooks de incident response para LLM con Keep + Kafka&lt;/a> — la materialización operativa de la cláusula 10 (mejora continua) y la traza WORM que A.8.2 exige: cada incidente abre no-conformidad, dispara postmortem, actualiza el runbook y queda registrado en &lt;code>audit.actions&lt;/code> Kafka.&lt;/li>
&lt;/ul></description></item><item><title>EU AI Act: el expediente técnico artículo por artículo sobre la arquitectura LLM on-premise del blog</title><link>https://blog.lo0.es/posts/eu-ai-act-mapeo-arquitectura-llm-on-premise/</link><pubDate>Mon, 01 Jun 2026 05:30:00 +0200</pubDate><guid>https://blog.lo0.es/posts/eu-ai-act-mapeo-arquitectura-llm-on-premise/</guid><description>&lt;blockquote>
&lt;p>Post hermano del &lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">mapeo a ISO/IEC 42001&lt;/a>. Aquel descomponía el sistema de gestión de IA — la norma certificable. Éste descompone el &lt;strong>reglamento legal vinculante&lt;/strong> que aplica sin certificación: el EU AI Act es ley directa en los 27 Estados miembros, sin transposición, con sanciones explícitas hasta 35 millones de euros o el 7% del volumen mundial. Las obligaciones principales para sistemas de alto riesgo entran en vigor el &lt;strong>2 de agosto de 2026&lt;/strong>; cada artículo aplica desde su fecha, no desde la fecha de certificación de la organización.&lt;/p>
&lt;/blockquote>
&lt;h2 id="tldr">TL;DR&lt;/h2>
&lt;p>El Reglamento UE 2024/1689 (EU AI Act, &amp;ldquo;Reglamento Europeo de Inteligencia Artificial&amp;rdquo;) publicado en el Diario Oficial el 12 de julio de 2024 establece obligaciones por &lt;strong>niveles de riesgo&lt;/strong> (prohibido, alto, limitado, mínimo) y por &lt;strong>rol&lt;/strong> (provider, deployer, importer, distributor, authorised representative). Las obligaciones para sistemas de &lt;strong>alto riesgo&lt;/strong> (Anexo III: biometría, infraestructura crítica, educación, empleo, servicios esenciales públicos y privados, law enforcement, migración, justicia, procesos democráticos) entran en vigor el &lt;strong>2 de agosto de 2026&lt;/strong> y son la categoría que aplica a la mayoría de proyectos LLM en empresa media-grande. Este post mapea &lt;strong>artículo por artículo&lt;/strong> las obligaciones relevantes para un sistema LLM de alto riesgo desplegado on-premise: cada artículo enuncia su exigencia, identifica qué post del blog ya describe la pieza técnica que la materializa, y cierra con un &lt;strong>checklist auditable&lt;/strong> que un proveedor presenta a una autoridad de supervisión nacional. El expediente técnico del &lt;strong>Anexo IV&lt;/strong> se reconstruye apuntando sus nueve apartados obligatorios a los runbooks técnicos correspondientes. Se cubren además: la &lt;strong>clasificación del Art. 6&lt;/strong> y cómo decidir si un sistema cae como alto riesgo, las &lt;strong>prohibiciones del Art. 5&lt;/strong> (qué se excluye por construcción), las obligaciones &lt;strong>GPAI&lt;/strong> del Art. 53 que afectan a quien construye sobre modelos base (Llama, Mistral, DeepSeek, Qwen) en lugar de modelos propios, el calendario completo de fechas de aplicación (5 ago 2024 entrada en vigor, 2 feb 2025 prohibiciones, 2 ago 2025 GPAI, 2 ago 2026 alto riesgo Anexo III, 2 ago 2027 alto riesgo Anexo I y GPAI sistémico), el cuadro de &lt;strong>sanciones del Art. 99&lt;/strong> (hasta 35 M€ o 7% del volumen mundial para violaciones de Art. 5, 15 M€ o 3% para alto riesgo, 7,5 M€ o 1% para información incorrecta) y las cinco trampas frecuentes del cumplimiento. La tesis editorial: la arquitectura técnica descrita en el blog cubre directamente entre el 70% y el 85% de las exigencias técnicas del Reglamento; el resto es disciplina documental y procedimental (FRIA, CE marking, declaración de conformidad firmada, registro en EU database, reporting de incidentes en plazos legales) que se construye sobre artefactos técnicos ya existentes pero que tiene su propio circuito.&lt;/p>
&lt;h2 id="la-analogía-el-expediente-de-homologación-de-un-vehículo-nuevo">La analogía: el expediente de homologación de un vehículo nuevo&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 como expediente de homologación de vehículo">
&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">Sistema IA alto riesgo&lt;/text>
&lt;text x="100" y="58" text-anchor="middle" class="hs">scoring, biometría, RRHH,&lt;/text>
&lt;text x="100" y="72" text-anchor="middle" class="hs">salud, justicia (el coche nuevo)&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">Expediente Anexo IV&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 (el dossier WVTA)&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 o autoeval.&lt;/text>
&lt;text x="520" y="72" text-anchor="middle" class="hs">(homologación de tipo)&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">declaración conformidad&lt;/text>
&lt;text x="720" y="72" text-anchor="middle" class="hs">(sello E homologación)&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">Los 9 apartados del expediente Anexo IV (qué tiene que contener el dossier)&lt;/text>
&lt;text x="410" y="172" text-anchor="middle" class="hs">1 Descripción general · 2 Diseño y desarrollo · 3 Capacidades y limitaciones · 4 Datos · 5 Monitoreo · 6 Plan QMS · 7 FRIA&lt;/text>
&lt;text x="410" y="190" text-anchor="middle" class="hs">8 Registro logs · 9 Declaración conformidad — todo firmado por el provider y disponible para autoridades 10 años&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">El vehículo se sigue después de vender: revisiones, llamadas a revisión por fallos, registro accidentes graves&lt;/text>
&lt;text x="410" y="290" text-anchor="middle" class="hs">Plazos legales: 15 días (general), 10 días (muerte), 2 días (infra crítica o infracción amplia)&lt;/text>
&lt;text x="410" y="340" text-anchor="middle" class="hn">El vehículo sale de fábrica con dossier; recibe el sello E; viaja con libro de mantenimiento; los accidentes se reportan al ministerio.&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>Un fabricante de vehículos no puede vender un coche nuevo en la UE sin pasar &lt;strong>WVTA&lt;/strong> (Whole Vehicle Type Approval). El proceso es público y estandarizado: el fabricante prepara un &lt;strong>expediente técnico&lt;/strong> con docenas de capítulos (frenos, emisiones, seguridad activa y pasiva, iluminación, ruido, peso, dimensiones, materiales reciclables, dispositivos de ayuda al conductor), lo presenta a una &lt;strong>autoridad de homologación&lt;/strong> o a un &lt;strong>servicio técnico notificado&lt;/strong>, éste audita el dossier y, si todo cuadra, emite la &lt;strong>homologación de tipo&lt;/strong>. El fabricante entonces estampa la &lt;strong>etiqueta E&lt;/strong> (E1 Alemania, E9 España, etc.) y la &lt;strong>placa CE/UNECE&lt;/strong> en cada vehículo de ese tipo producido en serie. Cada vehículo lleva además un &lt;strong>libro de mantenimiento&lt;/strong> con revisiones obligatorias, y los accidentes graves o defectos sistémicos se reportan al &lt;strong>ministerio competente&lt;/strong>, que puede ordenar llamadas a revisión.&lt;/p>
&lt;p>El EU AI Act adapta exactamente este modelo industrial al software de IA de alto riesgo. El &lt;strong>provider&lt;/strong> prepara el &lt;strong>expediente del Anexo IV&lt;/strong> (nueve apartados obligatorios) con la documentación técnica completa del sistema, ejecuta un &lt;strong>conformity assessment&lt;/strong> (con autoeval para la mayoría de casos del Anexo III, con notified body para los del Anexo I más sensibles), firma la &lt;strong>declaración de conformidad UE&lt;/strong>, &lt;strong>registra el sistema en la base de datos europea&lt;/strong>, y aplica el &lt;strong>CE marking&lt;/strong> al sistema cuando se pone en mercado. A partir de ahí, debe mantener un &lt;strong>post-market monitoring system&lt;/strong> vivo y &lt;strong>reportar los incidentes graves&lt;/strong> a las autoridades de vigilancia del mercado de cada Estado miembro en plazos legales que van de &lt;strong>2 a 15 días&lt;/strong> según severidad. Si no cumple, las sanciones llegan a &lt;strong>35 millones de euros o el 7% del volumen mundial&lt;/strong> según artículo violado.&lt;/p>
&lt;p>La analogía importa porque acota expectativas: este no es un trabajo de compliance puntual ni un sello que se compra. Es un proceso de &lt;strong>homologación industrial&lt;/strong>, con cadencias, evidencias, firmas y responsabilidades penales. Y la mayor parte de las evidencias técnicas que pide el expediente &lt;strong>ya existen&lt;/strong> en cualquier sistema serio descrito en este blog: lineage de datos, tracing OTel, evals continuos, guardrails, retrain incident-driven, política de uso responsable. Lo que falta es ensamblarlas en el formato legal correcto.&lt;/p>
&lt;h2 id="encaje-con-iso-42001-nis2-y-ens">Encaje con ISO 42001, NIS2 y ENS&lt;/h2>
&lt;p>Antes de bajar a los artículos, recordamos la posición editorial del &lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">post sobre ISO 42001&lt;/a>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Pieza&lt;/th>
&lt;th>Naturaleza&lt;/th>
&lt;th>Quién la opera&lt;/th>
&lt;th>Cobertura&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>EU AI Act&lt;/strong>&lt;/td>
&lt;td>Ley directa UE&lt;/td>
&lt;td>Provider + deployer + autoridades de vigilancia nacionales&lt;/td>
&lt;td>Sistemas IA en mercado UE, segmentados por riesgo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ISO/IEC 42001&lt;/strong>&lt;/td>
&lt;td>Norma de gestión certificable&lt;/td>
&lt;td>Organización + organismo certificador&lt;/td>
&lt;td>AIMS, gobierno organizacional&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>NIS2&lt;/strong>&lt;/td>
&lt;td>Directiva ciber transpuesta&lt;/td>
&lt;td>Entidades esenciales/importantes&lt;/td>
&lt;td>Asset register, incident notification, supply chain&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>ENS&lt;/strong> (RD 311/2022)&lt;/td>
&lt;td>Reglamento español de seguridad&lt;/td>
&lt;td>Sector público + sus proveedores&lt;/td>
&lt;td>Categorías B/M/A, certificable&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Implantar 42001 facilita demostrar artículos 9-17 del EU AI Act, pero &lt;strong>no equivale a cumplimiento legal&lt;/strong>. El cuadro de obligaciones legales y la cadena de responsabilidad penal vienen del Reglamento, no de la norma. Una organización certificada en 42001 que despliega un sistema de alto riesgo sin CE marking, sin registro en EU database, sin declaración de conformidad firmada y sin FRIA documentada, &lt;strong>incumple el Reglamento aun teniendo el certificado en la pared&lt;/strong>.&lt;/p>
&lt;h2 id="las-cuatro-categorías-de-riesgo-y-la-clasificación-del-art-6">Las cuatro categorías de riesgo y la clasificación del Art. 6&lt;/h2>
&lt;p>El Reglamento clasifica los sistemas en cuatro niveles de riesgo. La elección de categoría es &lt;strong>del provider&lt;/strong> y debe documentarse en el expediente, con justificación técnica y legal.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Categoría&lt;/th>
&lt;th>Artículo&lt;/th>
&lt;th>Ejemplos&lt;/th>
&lt;th>Consecuencia&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Prohibido&lt;/strong>&lt;/td>
&lt;td>Art. 5&lt;/td>
&lt;td>Social scoring, manipulación, biometría tiempo real con excepciones, scraping facial indiscriminado&lt;/td>
&lt;td>No puede operar en UE bajo ninguna circunstancia&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Alto riesgo&lt;/strong>&lt;/td>
&lt;td>Art. 6 + Anexo I + Anexo III&lt;/td>
&lt;td>Scoring crediticio, RRHH, educación, infraestructura crítica, biometría no en tiempo real, justicia, migración, salud&lt;/td>
&lt;td>Cumple Arts. 9-17, expediente Anexo IV, CE marking, registro EU DB&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Riesgo limitado&lt;/strong>&lt;/td>
&lt;td>Art. 50&lt;/td>
&lt;td>Chatbots con humanos como usuarios, deepfakes, contenido sintético&lt;/td>
&lt;td>Obligaciones de transparencia hacia el usuario&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Riesgo mínimo&lt;/strong>&lt;/td>
&lt;td>Resto&lt;/td>
&lt;td>Filtros de spam, NPC de videojuegos, sugerencias de contenido&lt;/td>
&lt;td>Sin obligaciones específicas; recomendado código de conducta voluntario&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>El test del Art. 6&lt;/strong> para decidir si un sistema es de alto riesgo:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>¿Está en el Anexo I?&lt;/strong> (productos regulados por legislación de armonización del listado: maquinaria, ascensores, juguetes, dispositivos médicos, etc.). Si el sistema IA es &lt;strong>componente de seguridad&lt;/strong> de un producto del Anexo I, es alto riesgo.&lt;/li>
&lt;li>&lt;strong>¿Está en el Anexo III?&lt;/strong> (ocho áreas: biometría, infraestructura crítica, educación, empleo, servicios esenciales públicos/privados, law enforcement, migración/asilo, justicia/procesos democráticos). Si el sistema cae en alguna de esas áreas, es alto riesgo, &lt;strong>excepto si&lt;/strong> se invoca la excepción del Art. 6.3 (sistemas con tarea procedimental limitada, mejora de actividades humanas previas, detección de patrones de decisión sin influir en la decisión final, tareas preparatorias).&lt;/li>
&lt;/ol>
&lt;p>La excepción del Art. 6.3 requiere &lt;strong>documentación formal&lt;/strong> que justifique por qué no aplica. Es decir, ni siquiera quedar fuera es gratis: hay que demostrar por qué.&lt;/p>
&lt;p>&lt;strong>Para los sistemas LLM típicos&lt;/strong> del blog:&lt;/p>
&lt;ul>
&lt;li>Chatbot de soporte al cliente para banca / seguros / salud: probablemente alto riesgo si automatiza decisiones contractuales sobre el cliente, &lt;strong>riesgo limitado&lt;/strong> si solo informa.&lt;/li>
&lt;li>Asistente interno para RRHH (criba de currículos): &lt;strong>alto riesgo&lt;/strong> (Anexo III, área empleo).&lt;/li>
&lt;li>Asistente médico (apoyo a diagnóstico): &lt;strong>alto riesgo&lt;/strong> (Anexo III, área servicios sanitarios).&lt;/li>
&lt;li>Sistema de detección de fraude: &lt;strong>alto riesgo&lt;/strong> (Anexo III, área servicios financieros si afecta acceso a crédito).&lt;/li>
&lt;li>Copiloto de código para desarrolladores: &lt;strong>riesgo mínimo&lt;/strong> (no afecta a derechos fundamentales de terceros).&lt;/li>
&lt;li>LLM as a service interno sin uso productivo: &lt;strong>riesgo mínimo&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>La decisión de categoría no es opinión: se documenta y se justifica en el expediente.&lt;/p>
&lt;h2 id="calendario-de-aplicación">Calendario de aplicación&lt;/h2>
&lt;p>Las obligaciones entran escalonadas. Las fechas son inflexibles:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Fecha&lt;/th>
&lt;th>Aplica&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>1 ago 2024&lt;/strong>&lt;/td>
&lt;td>Reglamento entra en vigor&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 feb 2025&lt;/strong>&lt;/td>
&lt;td>Prohibiciones del Art. 5 + obligaciones AI literacy del Art. 4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 ago 2025&lt;/strong>&lt;/td>
&lt;td>GPAI obligations (Art. 53) + gobernanza + sanciones generales + autoridades nacionales designadas&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 ago 2026&lt;/strong>&lt;/td>
&lt;td>&lt;strong>Obligaciones principales alto riesgo del Anexo III + Art. 50 transparencia a usuarios&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2 ago 2027&lt;/strong>&lt;/td>
&lt;td>Alto riesgo del Anexo I (componentes de productos regulados) + GPAI con riesgo sistémico&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El &lt;strong>2 de agosto de 2026&lt;/strong> es la fecha que importa a la mayoría de proyectos LLM empresariales. Estamos en junio 2026: queda menos de dos meses.&lt;/p>
&lt;h2 id="mapeo-artículo-por-artículo">Mapeo artículo por artículo&lt;/h2>
&lt;p>Las siguientes secciones siguen la estructura del Reglamento. Para cada artículo se enuncia la exigencia, se identifica el artefacto técnico del blog que la cubre y se cierra con un &lt;strong>checklist auditable&lt;/strong>.&lt;/p>
&lt;h3 id="art-5--prácticas-prohibidas-vigente-desde-2-feb-2025">Art. 5 — Prácticas prohibidas (vigente desde 2 feb 2025)&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Prohíbe colocar en el mercado / poner en servicio / usar sistemas IA que:&lt;/p>
&lt;ul>
&lt;li>Manipulen el comportamiento mediante técnicas subliminales o engañosas que distorsionen la toma de decisiones.&lt;/li>
&lt;li>Exploten vulnerabilidades por edad, discapacidad o situación socioeconómica.&lt;/li>
&lt;li>Implementen &lt;strong>social scoring&lt;/strong> por parte de autoridades públicas.&lt;/li>
&lt;li>Hagan &lt;strong>policía predictiva individual&lt;/strong> basada en perfilado.&lt;/li>
&lt;li>Hagan &lt;strong>scraping indiscriminado facial&lt;/strong> para construir bases de datos de reconocimiento facial.&lt;/li>
&lt;li>Inferencia de emociones en lugares de trabajo o educación, salvo razones médicas/seguridad.&lt;/li>
&lt;li>Categorización biométrica que infiera atributos sensibles (raza, opinión política, orientación sexual, etc.).&lt;/li>
&lt;li>&lt;strong>Biometría de identificación en tiempo real en espacios públicos&lt;/strong> por law enforcement, con excepciones estrictas (terrorismo, secuestro, personas desaparecidas) con autorización judicial previa.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> Ninguna pieza del blog facilita estas prácticas; el catálogo OSS descrito está orientado a tareas legítimas. Pero el provider debe documentar explícitamente &lt;strong>por qué el sistema no cae en estas prohibiciones&lt;/strong>. No es asumible.&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Análisis de prohibiciones documentado por sistema, con declaración escrita de no aplicabilidad.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Si el sistema usa biometría facial o análisis de emociones: análisis legal específico con dictamen.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Revisión legal anual o ante cambio de funcionalidad.&lt;/li>
&lt;/ul>
&lt;h3 id="art-6--clasificación-de-sistemas-de-alto-riesgo">Art. 6 — Clasificación de sistemas de alto riesgo&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Definir si el sistema es de alto riesgo por estar en Anexo I (componente de seguridad de producto regulado) o Anexo III (8 áreas). Si está en Anexo III, evaluar excepción Art. 6.3 si aplica.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> El &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a> y el &lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">pipeline de seis etapas&lt;/a> describen sistemas que típicamente son &lt;strong>alto riesgo&lt;/strong> (chatbot multi-tenant que afecta a decisiones de servicio al cliente regulado).&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Análisis Art. 6 firmado por responsable legal de la organización.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Si se invoca Art. 6.3: documentación formal de la excepción.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Re-evaluación si la funcionalidad cambia (ej. el asistente pasa de informar a tomar decisiones).&lt;/li>
&lt;/ul>
&lt;h3 id="art-9--sistema-de-gestión-de-riesgos">Art. 9 — Sistema de gestión de riesgos&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Sistema iterativo, planificado y ejecutado durante todo el ciclo de vida. Identificar riesgos previsibles, estimar riesgos en uso normal y previsible mal uso, evaluar riesgos emergentes en post-market monitoring, adoptar medidas de mitigación, comunicar riesgos residuales. Las pruebas de eficacia se hacen &lt;strong>en condiciones realistas&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">Pipeline LLMOps de seis etapas&lt;/a> — el ciclo de vida iterativo.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> — pruebas en condiciones realistas con golden sets.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — medidas de mitigación operativas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain: cerrar el bucle&lt;/a> — gestión de riesgos emergentes 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"> Documento de gestión de riesgos por sistema, con identificación, mitigación, riesgos residuales aceptados y firmados.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de revisión periódica (mínimo anual o ante cambio sustancial).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Vinculación con el bucle de mejora documentado.&lt;/li>
&lt;/ul>
&lt;h3 id="art-10--datos-y-gobernanza-de-datos">Art. 10 — Datos y gobernanza de datos&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Datasets de entrenamiento, validación y testing relevantes, representativos, lo más libres de errores y completos posible, considerando características del propósito previsto. Documentar:&lt;/p>
&lt;ul>
&lt;li>Recogida y selección de datos.&lt;/li>
&lt;li>Procesamiento y anotación.&lt;/li>
&lt;li>Sesgos identificados con probabilidad de afectar derechos fundamentales o causar discriminación; medidas para prevenirlos.&lt;/li>
&lt;li>Identificación de lagunas en datos y cómo se aborda.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> — los cuatro artefactos data + lineage end-to-end.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">RAG corpus curation: el bibliotecario activo&lt;/a> — cinco capas: schema, dedup, PII, anti-contaminación, lineage.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard: Vault y Anonymize&lt;/a> — anonimización runtime con restitución.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Documento de gobernanza de datos por dataset (training / RAG corpus / golden eval / enriched retrain).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Análisis de sesgos por categoría protegida con métricas (parity ratio, equalized odds, calibration).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de PII / anonimización / pseudonimización con F1 medido.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Justificación de representatividad para el contexto previsto.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Lineage chunk→trace verificable.&lt;/li>
&lt;/ul>
&lt;h3 id="art-11--anexo-iv--documentación-técnica">Art. 11 + Anexo IV — Documentación técnica&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Expediente técnico con los nueve apartados del Anexo IV, redactado &lt;strong>antes de poner el sistema en el mercado&lt;/strong>, mantenido durante operación, disponible para autoridades &lt;strong>diez años&lt;/strong> tras la última operación. Los nueve apartados:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Descripción general del sistema&lt;/strong>: nombre, versión, propósito, integrador, hardware previsto, instrucciones de uso.&lt;/li>
&lt;li>&lt;strong>Descripción detallada del diseño y desarrollo&lt;/strong>: arquitectura, modelos base, métodos de entrenamiento, decisiones de diseño con justificación.&lt;/li>
&lt;li>&lt;strong>Información sobre monitoreo, funcionamiento y control&lt;/strong>: capacidades, limitaciones, precisión esperada, comportamiento en uso normal y mal uso previsible.&lt;/li>
&lt;li>&lt;strong>Información sobre datos&lt;/strong>: datasets usados, fuentes, métodos de preparación, sesgos abordados.&lt;/li>
&lt;li>&lt;strong>Descripción del sistema de monitoreo y métricas&lt;/strong>: trazas, logs, dashboards.&lt;/li>
&lt;li>&lt;strong>Descripción del QMS&lt;/strong> y procedimientos del Art. 17.&lt;/li>
&lt;li>&lt;strong>FRIA si aplica&lt;/strong> (Fundamental Rights Impact Assessment, Art. 27).&lt;/li>
&lt;li>&lt;strong>Logs automáticamente generados&lt;/strong> que el sistema almacena (Art. 12).&lt;/li>
&lt;li>&lt;strong>Declaración de conformidad UE&lt;/strong> del Art. 47 incluida.&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> Sirve como &lt;strong>insumo directo&lt;/strong> para cada apartado:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Apartado Anexo IV&lt;/th>
&lt;th>Insumo técnico del blog&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1. Descripción general&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/posts/siete-capas-stack-inferencia-llm-on-premise/">Anatomía del stack: 7 capas&lt;/a> + &lt;a href="https://blog.lo0.es/posts/siete-fases-despliegue-plataforma-llm-on-premise/">siete fases despliegue&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2. Diseño y desarrollo&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">Pipeline LLMOps 6 etapas&lt;/a> + &lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">fine-tuning continuo&lt;/a> + &lt;a href="https://blog.lo0.es/posts/alignment-moderno-dpo-kto-orpo-simpo/">alignment moderno&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3. Capacidades y limitaciones&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals&lt;/a> + &lt;a href="https://blog.lo0.es/posts/llm-as-judge-fundamentos/">LLM-as-judge&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4. Datos&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning&lt;/a> + &lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">RAG corpus curation&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5. Monitoreo&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OTel GenAI&lt;/a> + &lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">prompt versioning&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>6. QMS&lt;/td>
&lt;td>Procedimientos derivados de &lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">ISO 42001&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>7. FRIA&lt;/td>
&lt;td>Hueco — ver Art. 27 abajo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8. Logs&lt;/td>
&lt;td>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing OTel&lt;/a> + retención y políticas&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9. Declaración conformidad&lt;/td>
&lt;td>Hueco documental — ver Art. 47 abajo&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"> Expediente Anexo IV completo, versionado, fechado, firmado.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Acceso retención 10 años garantizado (storage inmutable / WORM).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de actualización ante cambio sustancial.&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>Qué exige.&lt;/strong> El sistema de alto riesgo debe ser técnicamente capaz de generar &lt;strong>logs automáticos&lt;/strong> durante su operación. Estos logs deben permitir:&lt;/p>
&lt;ul>
&lt;li>Trazar el funcionamiento del sistema a lo largo del tiempo.&lt;/li>
&lt;li>Facilitar el post-market monitoring (Art. 72).&lt;/li>
&lt;li>Permitir investigación de incidentes graves (Art. 73).&lt;/li>
&lt;li>Soportar auditorías.&lt;/li>
&lt;/ul>
&lt;p>El provider debe &lt;strong>conservar los logs&lt;/strong> durante al menos seis meses (o más si lo exigen leyes nacionales o el QMS). Para sistemas biométricos de identificación remota, requisitos específicos adicionales.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> — el sustrato canónico. Cada request emite un span con &lt;code>trace_id&lt;/code>, atributos &lt;code>gen_ai.*&lt;/code>, costes, latencias, decisiones de guardrail.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/prompt-versioning-langfuse-mlflow/">Prompt versioning&lt;/a> — &lt;code>prompt_id&lt;/code> + &lt;code>version&lt;/code> viajan como atributos.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — atributos &lt;code>gen_ai.guardrail.*&lt;/code> registran cada decisión.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard&lt;/a> — spans por scanner con &lt;code>risk_score&lt;/code> y &lt;code>action&lt;/code>.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning&lt;/a> — &lt;code>dataset_hash&lt;/code> y &lt;code>model_version&lt;/code> propagados.&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) operativos en producción.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Retención mínima 6 meses (sugerido 24-36 meses para regulación financiera).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Almacenamiento WORM / inmutable.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> PII en logs &lt;strong>redactada&lt;/strong> (vía LLM Guard Vault o equivalente) — los logs no son excepción de RGPD.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de consulta forense con permisos auditados.&lt;/li>
&lt;/ul>
&lt;h3 id="art-13--transparencia-a-los-deployers">Art. 13 — Transparencia a los deployers&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> El provider entrega al deployer &lt;strong>instrucciones de uso&lt;/strong> claras, completas y accesibles, en lenguaje comprensible, con:&lt;/p>
&lt;ul>
&lt;li>Identidad del provider.&lt;/li>
&lt;li>Características, capacidades, limitaciones (precisión por categoría, especificaciones técnicas).&lt;/li>
&lt;li>Cambios previstos al sistema y sus métricas.&lt;/li>
&lt;li>Medidas de supervisión humana (Art. 14).&lt;/li>
&lt;li>Recursos computacionales y hardware previstos.&lt;/li>
&lt;li>Cuándo aplica, expectativa de vida del sistema y de mantenimiento.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">Catálogo OSS para LLMOps&lt;/a> — qué componentes y con qué función.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">OSS vs hyperscalers&lt;/a> — análisis del lock-in y dependencias documentadas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía petición LLM&lt;/a> — capacidades y limitaciones forenses.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Manual del usuario en lenguaje no técnico para deployer + manual técnico detallado.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Métricas de precisión por categoría con thresholds.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de cambio con notificación previa.&lt;/li>
&lt;/ul>
&lt;h3 id="art-14--supervisión-humana">Art. 14 — Supervisión humana&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Sistema diseñado para permitir supervisión humana &lt;strong>efectiva&lt;/strong> durante el periodo de uso, con interfaces y procedimientos que faciliten:&lt;/p>
&lt;ul>
&lt;li>Comprender capacidades y limitaciones.&lt;/li>
&lt;li>Detectar disfunciones (automation bias awareness).&lt;/li>
&lt;li>Decidir no usar la salida del sistema, anularla, revertirla.&lt;/li>
&lt;li>Para biometría de identificación remota: verificación humana antes de actuar, al menos dos personas.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety&lt;/a> — Línea 3 (Tool GR) con human-in-the-loop para acciones destructivas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals&lt;/a> — métricas en dashboard humano accesibles.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing OTel&lt;/a> — Langfuse con sessions humanas auditables.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Interfaz de supervisión documentada con casos de uso.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Capacidad de override / abort sin restricciones técnicas.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Formación documentada al personal de supervisión.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Métricas de &lt;strong>efectividad&lt;/strong> de la supervisión (override rate, false-negative rate de la supervisión).&lt;/li>
&lt;/ul>
&lt;h3 id="art-15--precisión-robustez-y-ciberseguridad">Art. 15 — Precisión, robustez y ciberseguridad&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Sistemas de alto riesgo se diseñan y desarrollan para alcanzar un nivel apropiado de precisión, robustez y ciberseguridad, y para funcionar consistentemente durante todo su ciclo de vida. Las &lt;strong>métricas relevantes de precisión&lt;/strong> se declaran en las instrucciones de uso. Resistencia a:&lt;/p>
&lt;ul>
&lt;li>Errores, fallos, inconsistencias dentro del entorno de uso.&lt;/li>
&lt;li>Sesgos de retroalimentación durante operación (feedback loops).&lt;/li>
&lt;li>Ataques que intenten explotar vulnerabilidades del sistema (data poisoning, model poisoning, model evasion, confidentiality attacks).&lt;/li>
&lt;li>Medidas técnicas y organizativas para detectar, responder, resolver vulnerabilidades.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/quantization-fundamentos-inferencia/">Quantization fundamentos&lt;/a> — precisión vs eficiencia con métricas reportadas.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/continuous-batching-fundamentos/">Continuous batching&lt;/a> + &lt;a href="https://blog.lo0.es/posts/kv-cache-fundamentos/">KV cache&lt;/a> — robustez operativa.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails: línea 1 input + línea 2 retrieval&lt;/a> — defensa frente a prompt injection y data poisoning vía RAG.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard: PromptGuard 2 + scanners injection&lt;/a> — mitigación adversarial directa.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: jailbreak resistance + adversarial&lt;/a> — métricas de robustez evaluadas en CI.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Métricas de precisión declaradas: F1 por categoría, accuracy, calibración, faithfulness RAG, hallucination rate.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Plan de robustez frente a adversarial inputs (suite Garak / Promptfoo redteam / PyRIT ejecutada periódicamente).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Plan ciberseguridad: gestión vulnerabilidades, patching del stack (vLLM, sus deps, cuda), secrets rotation.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Análisis de feedback loops potenciales con monitoreo de drift.&lt;/li>
&lt;/ul>
&lt;h3 id="art-17--sistema-de-gestión-de-calidad-qms">Art. 17 — Sistema de gestión de calidad (QMS)&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> El provider tiene un QMS escrito, sistemático y proporcionado, que cubra (sin limitarse a):&lt;/p>
&lt;ul>
&lt;li>Estrategia de cumplimiento regulatorio.&lt;/li>
&lt;li>Diseño, verificación, control de calidad del sistema.&lt;/li>
&lt;li>Procedimientos de testeo, validación.&lt;/li>
&lt;li>Gestión de datos.&lt;/li>
&lt;li>Sistema de gestión de riesgos (Art. 9).&lt;/li>
&lt;li>Post-market monitoring (Art. 72).&lt;/li>
&lt;li>Reporting de incidentes (Art. 73).&lt;/li>
&lt;li>Comunicación con autoridades, deployers, otros stakeholders.&lt;/li>
&lt;li>Registros: documentación, mantenimiento de logs.&lt;/li>
&lt;li>Gestión de recursos.&lt;/li>
&lt;li>Accountability: responsabilidades de management.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> El QMS no es código pero se apoya en código.&lt;/p>
&lt;ul>
&lt;li>ISO/IEC 42001 implantada (post anterior) &lt;strong>cubre prácticamente todo el contenido del Art. 17&lt;/strong>.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">Pipeline LLMOps 6 etapas&lt;/a> como procedimiento operativo de referencia.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Manual del QMS escrito, fechado, firmado, versionado.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Plan anual de auditorías internas con criterios y registros.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Agenda de revisión por dirección con minutas firmadas.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Si hay 42001 implantada: mapping QMS-42001 documentado.&lt;/li>
&lt;/ul>
&lt;h3 id="art-26--obligaciones-de-los-deployers">Art. 26 — Obligaciones de los deployers&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Quien &lt;strong>despliega&lt;/strong> el sistema (lo usa en su nombre, no necesariamente el desarrollador) tiene obligaciones propias:&lt;/p>
&lt;ul>
&lt;li>Usar el sistema conforme a las instrucciones (Art. 13).&lt;/li>
&lt;li>Asignar supervisión humana competente y formada (Art. 14).&lt;/li>
&lt;li>Asegurar que los datos de entrada que controla son apropiados.&lt;/li>
&lt;li>Monitorear el funcionamiento y notificar al provider si detecta problemas o incidentes graves.&lt;/li>
&lt;li>Mantener logs &lt;strong>bajo su control&lt;/strong> durante al menos 6 meses.&lt;/li>
&lt;li>&lt;strong>Informar a las personas afectadas&lt;/strong> cuando el sistema se use sobre ellas para tomar decisiones (en el contexto laboral, además, consultar a sus representantes).&lt;/li>
&lt;li>Para algunos casos del Anexo III: completar un &lt;strong>FRIA&lt;/strong> (Art. 27).&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> En el caso del &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">chatbot multi-tenant&lt;/a>, el deployer es la &lt;strong>aseguradora cliente&lt;/strong>. Esta debe:&lt;/p>
&lt;ul>
&lt;li>Aceptar las instrucciones del provider (la consultora) y firmar términos.&lt;/li>
&lt;li>Configurar supervisión humana en su lado.&lt;/li>
&lt;li>Notificar al provider cuando detecta drift o queja seria.&lt;/li>
&lt;li>Conservar logs propios además de los del provider.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist (para el deployer).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Contrato con provider con SLAs, responsabilidades, plan de salida.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Programa de formación a personal supervisor.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de notificación de incidentes hacia provider.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Política de información a afectados (en ámbito laboral, notificación a representantes).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> FRIA si aplica.&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>Qué exige.&lt;/strong> Aplicable a &lt;strong>deployers&lt;/strong> que sean cuerpos públicos o entidades privadas que provean servicios públicos, o que usen sistemas para evaluar credit score / life insurance. Antes del primer uso, el deployer hace un FRIA documentando:&lt;/p>
&lt;ul>
&lt;li>Descripción del uso previsto.&lt;/li>
&lt;li>Periodo y frecuencia de uso.&lt;/li>
&lt;li>Categorías de personas afectadas.&lt;/li>
&lt;li>Riesgos específicos de daño identificados.&lt;/li>
&lt;li>Medidas de supervisión humana.&lt;/li>
&lt;li>Medidas de mitigación si los riesgos se materializan.&lt;/li>
&lt;/ul>
&lt;p>El FRIA se notifica a la autoridad de vigilancia del mercado. Cambios sustanciales obligan a actualizar.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> El FRIA es un &lt;strong>documento de gobierno&lt;/strong>, no un artefacto técnico. El blog no lo cubre directamente. Pero el insumo técnico es:&lt;/p>
&lt;ul>
&lt;li>Los análisis de impacto del &lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">post sobre ISO 42001 — sección A.5&lt;/a> son el punto de partida natural.&lt;/li>
&lt;li>Las métricas del &lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">post sobre evals&lt;/a> sobre fairness por categoría y groundedness alimentan la sección de riesgos del FRIA.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento FRIA documentado, alineado con AIIA ISO 42005 (publicada como complemento).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> FRIA ejecutado por sistema antes del primer uso.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Notificación a autoridad de vigilancia del mercado.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Revisión periódica + ante cambio sustancial.&lt;/li>
&lt;/ul>
&lt;h3 id="art-47--declaración-ue-de-conformidad">Art. 47 — Declaración UE de conformidad&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> El provider redacta una declaración de conformidad &lt;strong>escrita&lt;/strong> por sistema de alto riesgo, indicando:&lt;/p>
&lt;ul>
&lt;li>Identificación del sistema y provider.&lt;/li>
&lt;li>Declaración de que cumple los Arts. 8-15 + Art. 17.&lt;/li>
&lt;li>Referencia a normas armonizadas y especificaciones comunes aplicadas.&lt;/li>
&lt;li>Si aplica, notified body y certificado.&lt;/li>
&lt;li>Lugar y fecha, firma y nombre del firmante autorizado.&lt;/li>
&lt;/ul>
&lt;p>Debe estar disponible para autoridades &lt;strong>diez años&lt;/strong>. Se mantiene actualizada.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> Documento legal puro. Plantilla del Anexo V.&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Declaración de conformidad firmada por persona autorizada antes de mercado.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Idiomas: al menos UE oficial donde se ponga el sistema en mercado.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de re-firma ante cambio sustancial.&lt;/li>
&lt;/ul>
&lt;h3 id="art-48--marcado-ce">Art. 48 — Marcado CE&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Sistema de alto riesgo lleva el marcado CE de manera visible, legible e indeleble. Para sistemas digitales sin parte física, el marcado se incluye en la documentación / interfaz. Si participó un notified body, su número va a continuación.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> El marcado CE en un sistema software se materializa típicamente en:&lt;/p>
&lt;ul>
&lt;li>Página de información del producto / &amp;ldquo;Acerca de&amp;rdquo;.&lt;/li>
&lt;li>Documentación oficial del producto entregada al deployer.&lt;/li>
&lt;li>Metadata del API exposed (header HTTP custom, 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 en interfaz del producto o documentación oficial.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Número notified body adjunto si aplicó.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de actualización ante cambio sustancial.&lt;/li>
&lt;/ul>
&lt;h3 id="art-49--registro-en-la-base-de-datos-europea">Art. 49 — Registro en la base de datos europea&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Antes de poner en mercado / poner en servicio un sistema de alto riesgo del Anexo III (excepto el área 2 — infraestructura crítica), el provider lo registra en la &lt;strong>base de datos UE de sistemas IA de alto riesgo&lt;/strong> gestionada por la Comisión. Los deployers que sean autoridades públicas también registran su uso. Los datos del registro son públicos en su mayoría (transparencia hacia el público).&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> Procedimiento administrativo puro. Sin parte técnica más allá de tener el dossier preparado.&lt;/p>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Registro completado antes del primer uso productivo.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Actualización ante cambio sustancial.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Acceso al portal mantenido (credenciales, contacto).&lt;/li>
&lt;/ul>
&lt;h3 id="art-50--transparencia-a-los-usuarios-finales">Art. 50 — Transparencia a los usuarios finales&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Aplica a sistemas de &lt;strong>riesgo limitado&lt;/strong> (y también a algunos de alto riesgo, complementariamente):&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Chatbots y asistentes IA&lt;/strong>: la persona que interactúa debe saber que está hablando con una IA, salvo que sea obvio del contexto.&lt;/li>
&lt;li>&lt;strong>Contenido sintético generado&lt;/strong> (texto, audio, imagen, video): marcar como contenido AI-generated en el output, en formato machine-readable.&lt;/li>
&lt;li>&lt;strong>Deepfakes&lt;/strong>: declarar explícitamente que el contenido es artificialmente generado o manipulado.&lt;/li>
&lt;li>&lt;strong>Detectores de emociones&lt;/strong> o &lt;strong>categorización biométrica&lt;/strong>: informar a las personas afectadas.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> Materialización técnica:&lt;/p>
&lt;ul>
&lt;li>Banner UI en el chatbot indicando &amp;ldquo;Estás conversando con un asistente IA&amp;rdquo;.&lt;/li>
&lt;li>Disclaimer en cada respuesta exportable (PDF, email): &amp;ldquo;Generado por IA&amp;rdquo;.&lt;/li>
&lt;li>Watermarking del output (perplexity-based, model-fingerprint) — opcional pero útil para deepfakes.&lt;/li>
&lt;li>Para audio/imagen/video generado, metadatos C2PA estándar.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Banner UI obligatorio.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Disclaimer en outputs exportables.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Si genera contenido visual: marcado C2PA o equivalente.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento ante uso del sistema sobre persona sin su conocimiento (ej. evaluación automática de CV).&lt;/li>
&lt;/ul>
&lt;h3 id="art-53--obligaciones-de-los-proveedores-de-gpai-vigente-desde-2-ago-2025">Art. 53 — Obligaciones de los proveedores de GPAI (vigente desde 2 ago 2025)&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Los proveedores de GPAI (modelos de propósito general entrenados con vasto cómputo, típicamente fundacionales: Llama 4, Mistral, DeepSeek, Qwen, Gemma) deben:&lt;/p>
&lt;ul>
&lt;li>Mantener documentación técnica del modelo, accesible a la AI Office y autoridades nacionales.&lt;/li>
&lt;li>Hacer disponible información para los proveedores downstream que vayan a integrarlo.&lt;/li>
&lt;li>Cumplir con copyright UE (Art. 4 Directiva 2019/790): mecanismo opt-out para titulares de derechos.&lt;/li>
&lt;li>Publicar un resumen del contenido del training (Anexo XI - copyright summary).&lt;/li>
&lt;/ul>
&lt;p>Si el modelo tiene &lt;strong>riesgo sistémico&lt;/strong> (umbral 10^25 FLOPs o designado por la Comisión), obligaciones adicionales (Art. 55): model evaluation, adversarial testing, reporting incidentes, cybersecurity.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> Para una organización que &lt;strong>usa&lt;/strong> modelos GPAI (Llama 4, Mistral) y no los entrena desde cero:&lt;/p>
&lt;ul>
&lt;li>No es provider GPAI; es &lt;strong>downstream provider&lt;/strong> que integra GPAI en su sistema.&lt;/li>
&lt;li>Debe &lt;strong>disponer de la documentación técnica del GPAI&lt;/strong> (Llama paper, Mistral docs) y &lt;strong>referenciarla&lt;/strong> en su propia documentación Anexo IV.&lt;/li>
&lt;li>Análisis de licencia GPAI específica (Llama Community License, Apache 2.0, etc.).&lt;/li>
&lt;li>El &lt;a href="https://blog.lo0.es/posts/alignment-moderno-dpo-kto-orpo-simpo/">post sobre alignment moderno&lt;/a> y &lt;a href="https://blog.lo0.es/posts/fine-tuning-continuo-produccion/">fine-tuning continuo&lt;/a> describen cómo el adapter LoRA sobre el GPAI no convierte al downstream en provider GPAI siempre que no entrene un modelo nuevo desde cero.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist (downstream provider).&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Inventario de GPAI usados con versión, fuente, licencia, documentación referenciada.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Análisis de cumplimiento copyright EU (Art. 4 Dir. 2019/790).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Mapping responsabilidades upstream provider GPAI vs nosotros como downstream.&lt;/li>
&lt;/ul>
&lt;h3 id="art-72--post-market-monitoring">Art. 72 — Post-market monitoring&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Sistema documentado de monitoreo post-mercado proporcional al riesgo, que recoja datos sobre el funcionamiento durante todo el ciclo de vida, incluyendo interacción con otros sistemas IA. Permite al provider:&lt;/p>
&lt;ul>
&lt;li>Evaluar cumplimiento continuo de Arts. 8-15.&lt;/li>
&lt;li>Adoptar medidas correctivas necesarias.&lt;/li>
&lt;li>Detectar tendencias en uso real (drift, abuso).&lt;/li>
&lt;/ul>
&lt;p>El plan de monitoreo es &lt;strong>parte del Anexo IV&lt;/strong> y se mantiene durante toda la vida del sistema. La Comisión publica plantilla en 2026.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing OTel + Langfuse&lt;/a> — la base.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals continuos&lt;/a> — métricas operativas como gates online.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-as-judge-fundamentos/">LLM-as-judge&lt;/a> — judges sobre sampling de producción para detectar degradación.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain incident-driven&lt;/a> — el bucle de mejora cerrado.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Plan de monitoreo post-mercado documentado por sistema.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Métricas operativas definidas con thresholds y revisión periódica.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de acción correctiva ante alerta.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Integración con Art. 73 (cuando alerta = incidente grave).&lt;/li>
&lt;/ul>
&lt;h3 id="art-73--reporting-de-incidentes-graves">Art. 73 — Reporting de incidentes graves&lt;/h3>
&lt;p>&lt;strong>Qué exige.&lt;/strong> Definición de &lt;strong>incidente grave&lt;/strong> (Art. 3(49)):&lt;/p>
&lt;ul>
&lt;li>Muerte o daño grave a la salud.&lt;/li>
&lt;li>Disrupción grave de infraestructura crítica.&lt;/li>
&lt;li>Infracción de obligaciones legales destinadas a proteger derechos fundamentales.&lt;/li>
&lt;li>Daño grave a la propiedad o al medio ambiente.&lt;/li>
&lt;/ul>
&lt;p>El provider reporta a la autoridad de vigilancia del mercado del Estado miembro donde ocurrió el incidente. &lt;strong>Plazos&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Tipo de incidente&lt;/th>
&lt;th>Plazo máximo desde que se conoce&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>General&lt;/td>
&lt;td>&lt;strong>15 días&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Muerte&lt;/td>
&lt;td>&lt;strong>10 días&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Infra crítica afectada o infracción amplia&lt;/td>
&lt;td>&lt;strong>2 días&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>El primer informe puede ser preliminar; el completo sigue después. Investigación interna obligatoria; cooperación con autoridades. Acción correctiva proporcional.&lt;/p>
&lt;p>&lt;strong>Stack del blog.&lt;/strong> El flujo técnico:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing OTel&lt;/a> provee la trazabilidad para investigación forense.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety&lt;/a> emite el incident_event canónico (categoría, severity, trace_id).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain incident-driven&lt;/a> materializa la acción correctiva.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Checklist.&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Procedimiento de incident reporting documentado con plazos y plantillas.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Persona designada (típicamente DPO + AI Risk Owner) con responsabilidad y formación.&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Dry-run anual del procedimiento (simulacro).&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Integración técnica entre la capa de guardrails / tracing y el canal de notificación.&lt;/li>
&lt;/ul>
&lt;h2 id="el-expediente-anexo-iv-ensamblado-svg-del-dossier-completo">El expediente Anexo IV ensamblado: SVG del dossier completo&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="Expediente Anexo IV ensamblado sobre el stack OSS del blog">
&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">Expediente Anexo IV (Art. 11) — nueve apartados obligatorios + outputs derivados&lt;/text>
&lt;text x="410" y="55" text-anchor="middle" class="xs">amarillo = apartado del Anexo IV · verde = artefacto del blog que lo cubre · rojo = hueco documental&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. Descripción general&lt;/text>
&lt;text x="120" y="114" text-anchor="middle" class="xs">propósito, 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">Siete capas stack + siete fases despliegue + anatomía request + Catálogo OSS&lt;/text>
&lt;text x="520" y="114" text-anchor="middle" class="xs">descripción técnica completa accesible para autoridad&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. Diseño y desarrollo&lt;/text>
&lt;text x="120" y="164" text-anchor="middle" class="xs">arquitectura, modelos base, métodos&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">Pipeline LLMOps 6 etapas + Fine-tuning continuo + Alignment + Multi-LoRA + Quantization&lt;/text>
&lt;text x="520" y="164" text-anchor="middle" class="xs">decisiones de arquitectura con justificación técnica&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. Capacidades y limitaciones&lt;/text>
&lt;text x="120" y="214" text-anchor="middle" class="xs">precisión, esperada, comportamiento&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 con golden + LLM-as-judge + métricas F1 categoría + groundedness + faithfulness&lt;/text>
&lt;text x="520" y="214" text-anchor="middle" class="xs">métricas declaradas y medidas en 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. Datos&lt;/text>
&lt;text x="120" y="264" text-anchor="middle" class="xs">datasets, fuentes, preparación, sesgos&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">cuatro artefactos data versionados con lineage end-to-end&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. Monitoreo&lt;/text>
&lt;text x="120" y="314" text-anchor="middle" class="xs">métricas, 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">Tracing OTel GenAI + Langfuse + Prompt versioning + Spans gen_ai.guardrail.*&lt;/text>
&lt;text x="520" y="314" text-anchor="middle" class="xs">trazabilidad por request con retención &amp;gt;= 6 meses (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">procedimientos sistema gestión calidad&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 implantada (cláusulas 4-10) + procedimientos del pipeline LLMOps&lt;/text>
&lt;text x="520" y="364" text-anchor="middle" class="xs">manual del QMS firmado + plan auditorías internas + minutas dirección&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">si aplica deployer público / scoring&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">Procedimiento FRIA dedicado (insumo: A.5 ISO 42001 + métricas evals fairness)&lt;/text>
&lt;text x="520" y="414" text-anchor="middle" class="xs">documento de gobierno, no técnico — hay que redactarlo expresamente&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">logs automáticos + retención&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">Tracing OTel + Tempo / Jaeger + WORM storage + política PII redacción&lt;/text>
&lt;text x="520" y="464" text-anchor="middle" class="xs">retención 6+ meses, WORM, PII redactada por LLM Guard Vault&lt;/text>
&lt;/svg>
&lt;/div>
&lt;p>El gráfico muestra la asimetría editorial del blog: &lt;strong>siete de nueve apartados del Anexo IV los cubre el stack técnico directamente&lt;/strong>. Solo el FRIA (apartado 7) y la &lt;strong>declaración de conformidad firmada&lt;/strong> (apartado 9, no representado en el SVG por ser un documento de una página) son &lt;strong>huecos documentales&lt;/strong> que necesitan trabajo administrativo expreso. El esfuerzo principal de cumplimiento es &lt;strong>ensamblar y firmar&lt;/strong>, no construir desde cero.&lt;/p>
&lt;h2 id="caso-aplicado-el-chatbot-multi-tenant-evaluado-contra-el-ai-act">Caso aplicado: el chatbot multi-tenant evaluado contra el AI Act&lt;/h2>
&lt;p>Tomamos el sistema del &lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">post forense&lt;/a> — chatbot multi-tenant de atención al cliente para aseguradoras — y lo recorremos como &lt;strong>provider&lt;/strong> del sistema.&lt;/p>
&lt;p>&lt;strong>Clasificación Art. 6&lt;/strong>: el chatbot ayuda a clientes a entender productos, consultar estado, abrir incidencias. &lt;strong>No automatiza decisiones contractuales&lt;/strong> (no aprueba siniestros, no calcula primas). Cae en Anexo III área 8 (servicios privados esenciales)? — depende del uso. Si la aseguradora lo usa solo para soporte informativo, &lt;strong>riesgo limitado&lt;/strong> (aplica Art. 50). Si lo usa para evaluar declaraciones de siniestros, &lt;strong>alto riesgo&lt;/strong>. Documentación obligatoria del análisis.&lt;/p>
&lt;p>Asumimos &lt;strong>alto riesgo&lt;/strong> para el recorrido completo:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Art. 5 prohibiciones&lt;/strong>: declaración escrita de no aplicabilidad. ✓&lt;/li>
&lt;li>&lt;strong>Art. 9 risk management&lt;/strong>: documento por sistema con riesgos identificados (alucinación, sesgo por dialecto, fuga PII, jailbreak), mitigaciones aplicadas (RAG con corpus curado, guardrails con 4 líneas, LLM Guard Vault, evals continuos), residuales aceptados firmados. ✓ (insumo: pipeline + guardrails + evals).&lt;/li>
&lt;li>&lt;strong>Art. 10 data governance&lt;/strong>: gobernanza de los cuatro datasets (training adapter, RAG corpus aseguradora, golden eval, enriched retrain) con sesgos analizados, PII anonimizada, lineage. ✓ (insumo: data-versioning + rag-corpus-curation + LLM Guard).&lt;/li>
&lt;li>&lt;strong>Art. 11 + Anexo IV&lt;/strong>: expediente con 9 apartados redactado, firmado, accesible 10 años en bucket WORM. ✓ (7 apartados de blog, 2 nuevos).&lt;/li>
&lt;li>&lt;strong>Art. 12 + Art. 19 logs&lt;/strong>: OTel + Tempo + Langfuse con retención 24 meses, PII redactada por Vault. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 13 transparencia deployers&lt;/strong>: manual de usuario para aseguradora + manual técnico. ✓ (insumo: catálogo OSS + anatomía request).&lt;/li>
&lt;li>&lt;strong>Art. 14 supervisión humana&lt;/strong>: dashboard Langfuse + Grafana + protocolo de escalado humano para casos críticos + formación al personal de la aseguradora. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 15 precisión, robustez, ciberseguridad&lt;/strong>: métricas F1 por categoría declaradas, suite adversarial Promptfoo redteam ejecutada mensualmente, plan ciberseguridad del stack (vLLM patching, secrets rotation). ✓.&lt;/li>
&lt;li>&lt;strong>Art. 17 QMS&lt;/strong>: ISO 42001 implantada y certificada. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 26 deployer&lt;/strong>: contrato con aseguradora incluye obligaciones del deployer. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 27 FRIA&lt;/strong>: la aseguradora ejecuta FRIA antes de primer uso (es entidad privada de servicio esencial). ✓ (responsabilidad del deployer, provider asiste).&lt;/li>
&lt;li>&lt;strong>Art. 47 declaración conformidad&lt;/strong>: firmada por el CTO de la consultora antes de mercado. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 48 CE marking&lt;/strong>: visible en la interfaz del chatbot y en documentación oficial. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 49 registro EU DB&lt;/strong>: completado antes del primer uso productivo. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 50 transparencia usuarios&lt;/strong>: banner UI &amp;ldquo;Estás hablando con un asistente IA&amp;rdquo;, disclaimer en respuestas exportables. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 53 GPAI&lt;/strong>: documentación de Llama 4 (modelo base) referenciada + análisis copyright EU + mapping de responsabilidades. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 72 post-market monitoring&lt;/strong>: plan documentado, OTel + evals continuos + retrain ya operativos. ✓.&lt;/li>
&lt;li>&lt;strong>Art. 73 reporting incidentes&lt;/strong>: procedimiento + responsable designado + dry-run anual. ✓.&lt;/li>
&lt;/ul>
&lt;p>Resultado: &lt;strong>certificable y desplegable&lt;/strong> en mercado UE el 2 de agosto de 2026. Los huecos clave (FRIA, CE marking, registro EU DB, declaración conformidad) son trabajo documental sobre artefactos técnicos ya existentes, no proyectos técnicos nuevos.&lt;/p>
&lt;h2 id="sanciones-art-99">Sanciones (Art. 99)&lt;/h2>
&lt;p>El cuadro de sanciones es proporcional al volumen mundial &lt;strong>o&lt;/strong> a un tope absoluto, &lt;strong>el que sea mayor&lt;/strong>:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Violación&lt;/th>
&lt;th>Tope sanción&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Art. 5 (prácticas prohibidas)&lt;/td>
&lt;td>Hasta &lt;strong>35 M€&lt;/strong> o &lt;strong>7% volumen mundial anual&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Otras obligaciones (Arts. 8-22, 26-50, 72-73, etc.)&lt;/td>
&lt;td>Hasta &lt;strong>15 M€&lt;/strong> o &lt;strong>3% volumen mundial anual&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Información incorrecta o engañosa a autoridades&lt;/td>
&lt;td>Hasta &lt;strong>7,5 M€&lt;/strong> o &lt;strong>1% volumen mundial anual&lt;/strong>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Para PYMEs y startups, los topes son &lt;strong>el menor&lt;/strong> de las dos cifras (no el mayor) — la mitigación de proporcionalidad existe pero requiere demostración formal.&lt;/p>
&lt;p>Adicionalmente, las autoridades nacionales pueden ordenar:&lt;/p>
&lt;ul>
&lt;li>Suspensión inmediata del sistema en el mercado.&lt;/li>
&lt;li>Llamada a revisión (recall) obligatoria.&lt;/li>
&lt;li>Comunicación pública obligatoria de la sanción.&lt;/li>
&lt;/ul>
&lt;h2 id="las-cinco-trampas-frecuentes-del-cumplimiento">Las cinco trampas frecuentes del cumplimiento&lt;/h2>
&lt;p>&lt;strong>Trampa 1 — Asumir que el modelo GPAI usado ya cubre las obligaciones.&lt;/strong> El downstream provider sigue siendo responsable del sistema integrado: ni Meta ni Mistral ni DeepSeek asumen las obligaciones de quien construye sobre sus modelos. La trampa se descubre cuando la autoridad pide el expediente y el equipo apunta al model card de Llama como si bastara.&lt;/p>
&lt;p>&lt;strong>Trampa 2 — Confundir ISO 42001 con conformidad EU AI Act&lt;/strong>. Tener 42001 certificado &lt;strong>no implica&lt;/strong> conformidad: la certificación no es FRIA, no es CE marking, no es registro en EU database, no es declaración de conformidad firmada. La normalización avanza pero hasta que ISO 42001 se publique como norma armonizada (no lo era al cierre de 2025), no hay presunción de conformidad. El cuadro de obligaciones legales tiene su propio circuito.&lt;/p>
&lt;p>&lt;strong>Trampa 3 — Olvidar el reporting de incidentes en plazo legal&lt;/strong>. 15 días suena largo hasta que un incidente coincide con vacaciones de verano. 2 días para infra crítica no es negociable. Sin procedimiento documentado y simulacro anual, el plazo se incumple en silencio. Sanción por información engañosa (1% volumen mundial) si el reporting incompleto se descubre.&lt;/p>
&lt;p>&lt;strong>Trampa 4 — Subestimar el deployer&lt;/strong>. El AI Act asigna obligaciones tanto al provider como al &lt;strong>deployer&lt;/strong>. Una empresa que &lt;strong>usa&lt;/strong> un LLM hospedado integrado en su servicio (sin desarrollarlo) sigue siendo deployer con obligaciones propias (Art. 26): supervisión humana, FRIA si aplica, notificación a personas afectadas. La trampa se descubre cuando el deployer asume que &amp;ldquo;la responsabilidad es del proveedor del modelo&amp;rdquo; — no lo es del todo.&lt;/p>
&lt;p>&lt;strong>Trampa 5 — Dejar el FRIA para el final&lt;/strong>. El FRIA (Art. 27) requiere análisis de impacto sobre derechos fundamentales con dimensiones cualitativas (discriminación, privacidad, derechos sociales). No es un documento de una tarde. Se ejecuta antes del primer uso, no después de detectar un problema. Los deployers públicos y los proveedores de servicios esenciales privados que lo dejan para &amp;ldquo;cuando lo pidan&amp;rdquo; tardan 4-8 semanas en producir uno creíble — tiempo que típicamente no se tiene cuando llega la inspección.&lt;/p>
&lt;h2 id="lo-que-no-hemos-cubierto-próximos-posts">Lo que no hemos cubierto (próximos posts)&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Plantillas concretas&lt;/strong> de cada documento: declaración de conformidad UE (Anexo V), expediente Anexo IV completo apartado por apartado, FRIA, plan de post-market monitoring, informe inicial de incidente grave. Material para un post tipo &amp;ldquo;Carpeta del cumplimiento EU AI Act en 12 plantillas&amp;rdquo;.&lt;/li>
&lt;li>&lt;strong>Códigos de práctica voluntarios&lt;/strong> publicados por la Comisión bajo Art. 56 — útiles para sistemas de riesgo limitado que quieran demostrar buen comportamiento sin obligación legal.&lt;/li>
&lt;li>&lt;strong>Análisis comparativo de notified bodies&lt;/strong> para sistemas que requieran conformity assessment de tercero (Anexo I principalmente).&lt;/li>
&lt;li>&lt;strong>Cómo cambia el cumplimiento para agentes LLM&lt;/strong> — sistemas con autonomía gradúa, tool calling, capacidad de acción. La SC 42 y la AI Office trabajan en guidance específica.&lt;/li>
&lt;li>&lt;strong>El cuadro completo de autoridades nacionales&lt;/strong> designadas bajo Art. 70 + autoridades sectoriales que mantienen jurisdicción (AEPD para privacidad, CNMV para servicios financieros, Banco de España para banca, AESA para aviación).&lt;/li>
&lt;/ul>
&lt;h2 id="referencias">Referencias&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Regulation (EU) 2024/1689 (EU AI Act)&lt;/strong> — 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>&lt;strong>EU AI Act Explorer (AI Act Service Desk, Comisión Europea)&lt;/strong>: &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>&lt;strong>AI Act Text portal (artificialintelligenceact.eu)&lt;/strong>: artículos individuales con anotaciones.&lt;/li>
&lt;li>&lt;strong>Anexo IV — Technical documentation&lt;/strong>: estructura de los nueve apartados obligatorios.&lt;/li>
&lt;li>&lt;strong>Anexo V — EU declaration of conformity&lt;/strong>: plantilla obligatoria.&lt;/li>
&lt;li>&lt;strong>Anexo III — High-risk AI systems&lt;/strong>: las ocho áreas que clasifican un sistema como alto riesgo.&lt;/li>
&lt;li>&lt;strong>Anexo XI — Copyright training summary template&lt;/strong>: para GPAI providers.&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>ISO/IEC 42001:2023&lt;/strong> — sistema de gestión, complemento facilitador.&lt;/li>
&lt;li>&lt;strong>ISO/IEC 42005&lt;/strong> — Impact assessment AI (publicada 2025 como guía técnica para FRIA).&lt;/li>
&lt;li>&lt;strong>Draft Commission guidance on serious incident reporting&lt;/strong> (2025) — borrador en consulta para Art. 73.&lt;/li>
&lt;/ul>
&lt;h2 id="ver-también">Ver también&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://blog.lo0.es/posts/iso-42001-aims-llm-on-premise/">ISO/IEC 42001: el manual de operaciones del sistema de IA&lt;/a> — el post hermano sobre el sistema de gestión que facilita demostrar Arts. 9, 10, 11, 17 del Reglamento.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/pipeline-llmops-seis-etapas/">El pipeline LLMOps de seis etapas&lt;/a> — el ciclo de vida que materializa los Arts. 9 (risk management) y 17 (QMS) operativamente.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/anatomia-request-llm-mayo-2026/">Anatomía de una petición LLM en producción&lt;/a> — el caso forense usado como checklist del cumplimiento en este post.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/data-versioning-dvc-lakefs/">Data versioning con DVC y lakeFS&lt;/a> y &lt;a href="https://blog.lo0.es/posts/rag-corpus-curation-fundamentos/">RAG corpus curation&lt;/a> — Art. 10 data governance.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/tracing-llm-otel-genai/">Tracing LLM con OpenTelemetry GenAI&lt;/a> — Arts. 12 + 19 (record-keeping) con OTel canónico.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/guardrails-safety-llm/">Guardrails y safety en LLMs&lt;/a> — Arts. 14 (supervisión humana) y 15 (ciberseguridad/robustez).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/llm-guard-fundamentos/">LLM Guard: el traductor jurado con cuaderno de equivalencias&lt;/a> — Art. 10 + Art. 12 con PII redactada en path runtime.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/evals-llm-la-capa-despues-de-tracing/">Evals: la capa después del tracing&lt;/a> — Art. 15 (precisión) y Art. 72 (post-market monitoring).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/retrain-cerrar-el-bucle-feedback-dataset-adapter/">Retrain: cerrar el bucle feedback → dataset → adapter&lt;/a> — Art. 72 mejora continua + Art. 73 acción correctiva tras incidente.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/oss-vs-hyperscalers-llmops/">El catálogo paralelo: OSS vs hyperscalers&lt;/a> — Art. 53 (GPAI obligations) y análisis de proveedores GPAI integrados.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/catalogo-herramientas-oss-llmops/">El catálogo OSS para LLMOps&lt;/a> — Art. 13 (transparencia a deployers) con inventario completo de componentes.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/alignment-moderno-dpo-kto-orpo-simpo/">Alignment moderno: DPO, KTO, ORPO y SimPO&lt;/a> — diseño responsable del adapter (Art. 9 mitigación + Art. 15 robustez).&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/controles-tecnicos-ens-42001-eu-ai-act/">Controles técnicos: el mapeo cruzado ENS × ISO 42001 × EU AI Act&lt;/a> — el zoom técnico al solapamiento de los tres marcos. Una sola pieza de tracing, una sola pieza de guardrails, una sola pieza de versionado materializa las exigencias técnicas de ENS + 42001 + AI Act simultáneamente cuando se etiqueta con vocabulario común.&lt;/li>
&lt;li>&lt;a href="https://blog.lo0.es/posts/runbooks-incident-response-llm-keep-kafka/">Runbooks de incident response para LLM con Keep + Kafka&lt;/a> — la operacionalización del Art. 73 (reporting of serious incidents) con plazos 2/10/15 días según severity, workflows Keep YAML y topic Kafka &lt;code>audit.actions&lt;/code> WORM como evidencia para autoridad competente.&lt;/li>
&lt;/ul></description></item></channel></rss>