Ir al contenido

Identificación de riesgos (froga assess)

🟡 Parcial — El KAG (asistente de identificación de riesgos) es línea futura: hoy NO está disponible. `froga assess` es un stub honesto y la evaluación (clasificación + riesgos) se declara a mano en froga.yaml.

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 froga.yaml) es ese registro vivo.

Hoy esa identificación la realiza el humano: el desarrollador o el quality manager declara a mano, en froga.yaml, tanto la clasificación del sistema (tier/basis/rationale) como el programa de riesgos (cada riesgo con su domain/rationale). El motor no infiere ni propone nada: froga run lee esa declaración directamente del manifiesto y falla de forma explícita si la clasificación falta.

El KAG (Knowledge Assessment Graph) será, en el futuro, el componente que asista esa identificación proponiendo riesgos candidatos a partir del contexto del sistema. Hoy no está disponible — ver El KAG (línea futura).


Mientras el KAG no exista, froga assess es un stub honesto: no fabrica ni propone nada. Te recuerda que la evaluación se declara a mano y muestra la forma del bloque classification:. Está oculto de la ayuda pública y su exit code es siempre 0 (advisory).

froga assess (stub honesto)
froga assess --repo .
froga assess: KAG no disponible aún.
Declara la evaluación (clasificación + riesgos) a mano en `froga.yaml`:
classification:
tier: high # high | limited | minimal | prohibited
basis:
- "EU AI Act Annex III §..."
rationale: "..."
La evaluación queda en tu repositorio (manifiesto + bundle firmado); `froga run` la lee directamente.
Consulta la documentación para cada dominio (crédito §5b, empleo §4, SaMD, educación §3...).

El KAG cerrará el bucle de identificación de riesgos (ISO 23894 §6.4.2) asistiendo al humano: mirará el contexto del sistema (metadata Croissant, métricas históricas, etc.) y propondrá riesgos candidatos que aún no estén en el AssuranceProgram, para que el equipo los cure. Será advisory, no bloqueante — la decisión de añadir un riesgo seguirá siendo humana.

El servicio real (Python por API) es trabajo futuro; se anuncia en la Hoja de ruta. El mock determinista que existía en versiones anteriores se eliminó para no simular una automatización que no existe: hasta que el KAG esté listo, la declaración a mano es la fuente de verdad. El contrato del componente (su entrada/salida) se conserva en el código para que la declaración humana de hoy encaje sin reescritura cuando llegue.


El ciclo de crecimiento del registro, conforme a ISO 23894 §6.4.2, tiene cuatro pasos. Hoy el paso de detección lo realiza el humano (mediante análisis, revisión o medición); en el futuro el KAG lo asistirá.

  1. Identificación — el equipo detecta un riesgo nuevo (por análisis, deriva detectada o revisión periódica) que el registro no cubría.
  2. Declaración — lo añade a la sección risk: de froga.yaml con impact, likelihood, treat y provenance (ver procedencia), o decide que no aplica y lo documenta.
  3. Commit — el commit que añade el riesgo al programa es, en sí, el acto de identificación fechado y atribuible. froga reconstruct lo recupera después como «①Identificación».
  4. Recompilaciónfroga compile regenera el assessment_plan.oscal.yaml con el nuevo riesgo. El motor vuelve a medir en el siguiente froga run.

Cada riesgo lleva un campo provenance que clasifica su origen, con fines de auditoría (no afecta al tratamiento):

ValorSignificado
declared (por defecto)El equipo lo identificó y declaró directamente.
proposed_by_kagReservado para riesgos que surgen de la identificación asistida (el dominio del KAG futuro). Hoy el equipo puede usarlo a mano para marcar un riesgo emergente, detectado a mitad del desarrollo mediante análisis, frente a los declarados al inicio.
derived_from_gapEmergió de un data_gap detectado por el motor (EU AI Act Art. 10(5)) y propagado como riesgo de sesgo.

La procedencia viaja al bundle de evidencia firmado, donde froga reconstruct la muestra distinguiendo cada origen.


Ejemplo: riesgo emergente de discriminación por edad

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

El siguiente es un ejemplo hipotético del ciclo de crecimiento del registro (no un escenario empaquetado). Partiendo del demo loan-scoring —cuyo programa declara cinco riesgos: exclusión crediticia injusta, gobernanza del dato, opacidad, robustez/seguridad del modelo y supervisión humana insuficiente—, supongamos que a mitad del desarrollo el equipo identifica un riesgo emergente que el registro inicial no cubría —discriminación por edad— y lo declara a mano en la sección risk:, marcándolo con provenance: proposed_by_kag para registrar que es un riesgo de identificación asistida (la clase que el KAG futuro propondrá):

froga.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 # identificación asistida (declarado a mano hoy)
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.092"
severity: high
enforcement: gate
lifecycle: [validation]
article: "15"
inputs: { prediction: prediction, dimension: age_bucket,
age_bucket_method: quantiles, age_buckets: 3 }

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

T2 — tras incorporar el riesgo emergente
froga compile --repo .
froga run --repo .
# → ilustrativo: si la DP por edad superase el umbral (p. ej. ≈ 0.14 ≫ 0.092), el control age-discrimination FALLARÍA
# → barrera ROJA: 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, froga reconstruct muestra la identificación fechada y atribuible (la procedencia proposed_by_kag se renderiza como «identificación asistida»):

① Identificación <sha> <fecha> «CRECIMIENTO: +risk.age-discrimination»
· procedencia: identificación asistida (proposed_by_kag)

La historia git de froga.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 Nivel 1.