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.
Qué hace sei assess
Sección titulada «Qué hace sei assess»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:
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.
Flujo del registro vivo
Sección titulada «Flujo del registro vivo»El ciclo completo de crecimiento del registro, conforme a ISO 23894 §6.4.2, tiene cuatro pasos:
- Detección —
sei assesslista el backlog de crecimiento. - Curación humana — el equipo evalúa cada riesgo propuesto: lo añade a la sección
risk:desei.yamlconimpact,likelihood,treatyprovenance: proposed_by_kag, o decide que no aplica y lo documenta. - Commit — el commit que añade el riesgo al programa de riesgos es, en sí, el acto de identificación fechado y atribuible.
sei reconstructlo recupera después como “①Identificación”. - Recompilación —
sei compileregenera elassessment_plan.oscal.yamlcon el nuevo riesgo. El motor vuelve a medir en el siguientesei 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:
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::
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:
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 edadEste 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.
Referencias
Sección titulada «Referencias»- Registro vivo del AssuranceProgram — ciclo de identificación continua y curación
- Referencia
seiCLI —sei assess,sei compile