Ir al contenido

Ejecutar el KAG (sei assess)

🟡 Parcial — El KAG es un mock determinista en v1; el servicio real (Python por API) es línea futura.

ISO 23894 §6.4.2 exige que la identificación de riesgos sea continua: los riesgos no se declaran una vez y se congelan, sino que el registro crece a medida que el sistema evoluciona. El programa de riesgos (el AssuranceProgram, hoy una sección — risk: — del propio sei.yaml) es ese registro vivo. El KAG (Knowledge Assessment Graph) es el componente que detecta riesgos candidatos que aún no están declarados en él. sei assess ejecuta el KAG contra el manifiesto actual y emite, de forma advisory y no bloqueante, los riesgos que el KAG propone pero el equipo no ha registrado todavía.


sei assess lee el sei.yaml del proyecto (finalidad prevista, modalidad, tipo de tarea), pasa esa información al KAG y cruza los riesgos propuestos contra los id ya declarados en la sección risk: de sei.yaml. Los riesgos nuevos — los que el KAG propone pero no aparecen en el programa de riesgos — forman el backlog de crecimiento del registro:

Ejecutar el KAG
sei assess --repo .

Cuando hay riesgos nuevos, la salida lista cada uno con su identificador y título:

sei assess: el KAG propone 1 riesgo(s) NO declarado(s) en el AssuranceProgram (backlog de crecimiento):
+ risk.age-discrimination — «Age-based Credit Discrimination»
Cúralos: añádelos al AssuranceProgram (con impact/likelihood/provenance) y commitea — el commit es la identificación (ISO 6.4.2).

Cuando el registro está al día:

sei assess: el KAG no propone riesgos nuevos — el registro de riesgos está al día.

El exit code es siempre 0 (advisory). Un riesgo propuesto por el KAG no bloquea sei run ni sei compile; su función es señalar el hueco para que el equipo decida si curarlo o documentar por qué no aplica.


El ciclo completo de crecimiento del registro, conforme a ISO 23894 §6.4.2, tiene cuatro pasos:

  1. Detecciónsei assess lista el backlog de crecimiento.
  2. Curación humana — el equipo evalúa cada riesgo propuesto: lo añade a la sección risk: de sei.yaml con impact, likelihood, treat y provenance: proposed_by_kag, o decide que no aplica y lo documenta.
  3. Commit — el commit que añade el riesgo al programa de riesgos es, en sí, el acto de identificación fechado y atribuible. sei reconstruct lo recupera después como “①Identificación”.
  4. Recompilaciónsei compile regenera el assessment_plan.oscal.yaml con el nuevo riesgo. El motor vuelve a medir en el siguiente sei run.

La procedencia proposed_by_kag queda registrada en el programa de riesgos de sei.yaml y viaja al bundle de evidencia firmado, donde sei reconstruct la muestra distinguiéndola de los riesgos declarados directamente por el equipo.


Ejemplo: riesgo emergente de discriminación por edad

Sección titulada «Ejemplo: riesgo emergente de discriminación por edad»

El escenario loan_growth ilustra este ciclo. El programa de riesgos inicial (la sección risk: de sei.yaml) declara cinco riesgos (exclusión crediticia injusta, gobernanza del dato, opacidad, robustez/seguridad del modelo y supervisión humana insuficiente). A mitad del desarrollo, sei assess propone un riesgo emergente adicional, risk.age-discrimination, que el registro inicial no cubría:

T0 — antes de curar el registro
sei assess --repo .
# → propone risk.age-discrimination (no declarado aún)

El equipo cura el riesgo en la sección risk: de sei.yaml, bajo la lista risks::

sei.yaml (extracto — riesgo emergente bajo risk.risks)
risk:
# … appetite, criteria, overall_residual_criterion, riesgos previos …
risks:
- id: risk.age-discrimination
title: "Age-based Credit Discrimination"
affects: [sys.creditscore]
sources: [ctx.historical-bias]
provenance: proposed_by_kag # identificado por el KAG, curado por el equipo
impact: { individual: HIGH, society: MEDIUM }
likelihood: POSSIBLE # análisis ISO 6.4.3 — POSSIBLE×HIGH = HIGH
treat:
- method: REDUCE
action: "Acotar la paridad demográfica de la decisión también por grupo de edad."
controls: [eu/ai-act@2024#art-15]
residual_likelihood: UNLIKELY
measures:
- id: age-discrimination
metric: demographic_parity_diff
constraint: "< 0.03"
severity: high
enforcement: gate
lifecycle: [validation]
article: "15"
inputs: { prediction: prediction, dimension: age_bucket,
age_bucket_method: quantiles, age_buckets: 3 }

Tras curar y commitear, se recompila y se vuelve a medir:

T2 — tras incorporar el riesgo emergente
sei compile --repo .
sei run --repo .
# → el control age-discrimination FALLA (DP de edad ≈ 0.14 ≫ 0.03)
# → gate ROJO: mitigar solo el género dejó injusta la dimensión de edad

Este resultado es la iteración ISO: el registro creció, el motor detectó el hueco empírico y el equipo debe aplicar un nuevo tratamiento (V3, que mitiga género y edad simultáneamente). Al final del ciclo, sei reconstruct muestra:

① Identificación <sha> <fecha> «CRECIMIENTO: +risk.age-discrimination»
· identificado por: KAG (propuesto, curado por humano)

La historia git de sei.yaml (el programa de riesgos) es el audit log de la identificación, fechado y atribuible, conforme a ISO 23894 §6.4.2.

Para el flujo completo paso a paso, incluida la exploración con dvc exp y el tratamiento V3, véase el tutorial Primer sistema con Venturalítica.