Ir al contenido

Nivel 2 · Práctica y cierre

El arco completo corre en la CPU de un portátil, sobre el conjunto de datos real UCI Student Performance combinando sus DOS cohortes, matemáticas y portugués (unas mil filas; sin GPU, sin credenciales, sin datos sintéticos). El resultado de cada comando es exactamente la etiqueta enlazada en el arco.

Usa el chip del hito V1 (en el arco) para clonar el repositorio y situarte en el punto de partida, e instala las dependencias del proyecto:

Terminal
uv sync # instala las deps del pyproject.toml + uv.lock (incluye fairlearn)

Con el entorno del proyecto activo, reproduce el arco. Cada bloque de abajo es el paso REAL del guion steps/ —el mismo que construye el repositorio publicado, no una copia a mano—; el botón «copiar» te da el comando exacto:

1 · Mide la V1 (sin tratar) → ROJO. Compila el contrato de la barrera desde froga.yaml y córrela. froga run sale con código de error a propósito (barrera roja), y aun así firma la evidencia:

Compilar el plan de evaluación OSCAL (antes del modelo) Marta
Comandos
  • froga compile
  • git add -A
  • git commit -m "compile: assessment plan OSCAL (contrato del gate, antes del modelo)"
Modelo logreg base V1 — escribe Y corre (gate RED esperado, sin generalizar la edad) MartaVeredicto esperadoROJO
📍 reproducir student-v1.0.0-red
git clone https://github.com/Venturalitica/vldemo-student-selection
cd vldemo-student-selection
git switch -c try student-v1.0.0-red
Comandos
  • patch: params.patch
  • patch: dvc-evaluate.patch
  • patch: train.patch
  • patch: evaluate.patch
  • patch: compliance-eval.patch
  • froga runpuede fallar
  • git add -A
  • git commit -m "modelo: logreg V1 (train/evaluate + dvc.yaml) — run: V1 evidencia base (gate RED esperado; seed=42)"

2 · Trata el riesgo y vuelve a medir → VERDE. El tratamiento y la re-medición son un único paso versionado: un commit con DOS cambios de código reales en train.py —la edad exacta de cada alumno se generaliza a un tercil (la técnica de k-anonimato de Sweeney) y el estimador pasa de regresión logística plana al ExponentiatedGradient(DemographicParity) de fairlearn— y, en el mismo paso, el motor vuelve a correr la barrera. El diff de abajo muestra ambos cambios de verdad (ninguno es un flag); con la edad generalizada, el k-anonimato del trío edad/dirección/tamaño de familia sube de 1 a 27 —el IC 95% bootstrap [18, 37] queda entero por encima del umbral k ≥ 5—:

Abre la rama de tratamiento + fairlearn (equidad) + minimización RGPD (§6.5) — escribe Y corre (gate VERDE) MartaVeredicto esperadoVERDE
📍 reproducir student-v2.0.0-green
git clone https://github.com/Venturalitica/vldemo-student-selection
cd vldemo-student-selection
git switch -c try student-v2.0.0-green
Comandos
  • git checkout -b tratamiento/minimizacion-rgpd
  • patch: train-treatment.patch
  • froga run
  • git add -A
  • git commit -m "treatment: fairlearn DemographicParity (sexo) + minimización RGPD (edad→tercil, k-anonimato) — ISO 23894 §6.5"

Cada paso llega al mismo color de barrera que su etiqueta: el paso 080 reproduce student-v1.0.0-red, el 090 reproduce student-v2.0.0-green. Una tarea de CI nocturna vuelve a clonar cada etiqueta y comprueba que el color sigue coincidiendo.

3 · Declaración de Aplicabilidad (SoA). Antes de solicitar la aprobación, Marta cruza el programa de riesgos con el catálogo del Anexo A de ISO/IEC 42001 (6.1.3 b/c/f) — qué controles del sistema de gestión están implementados, cuáles se excluyen con justificación y cuáles quedan como hueco a revisar. El nuevo gate de minimización de datos aparece bajo A.7.4 (calidad del dato):

Declaración de Aplicabilidad (SoA, ISO 42001 6.1.3) Marta
Comandos
  • froga soa

4 · Revisión periódica: re-medir, no dar nada por sentado. Aprobar en verde no cierra el ciclo para siempre — sigue habiendo un residual reconocido (la opacidad del modelo, sin control que reduzca su probabilidad). El froga.yaml declaró review_interval: P1Y, así que el sistema entra en su cadencia de revisión periódica (ISO 23894 §6.6). Diego abre la revisión (froga review) y el motor pasa el sistema a «en revisión» — la aprobación queda suspendida. La revisión significa volver a medir: re-corre la barrera con los mismos parámetros, para producir evidencia fresca:

Re-medir ante la revisión (verde confirmado) MartaVeredicto esperadoVERDE
📍 reproducir student-v2.0.1-green
git clone https://github.com/Venturalitica/vldemo-student-selection
cd vldemo-student-selection
git switch -c try student-v2.0.1-green
Comandos
  • froga run
  • git add -A
  • git commit -m "run: re-medición V2.0.1 ante la revisión periódica (mismo params; gate verde confirmado; seed=42)"

El veredicto no cambia: sigue VERDE. El k-anonimato sigue en 27, sobre el mismo umbral 5 — re-medir no degrada lo que no ha cambiado. La re-medición V2.0.1 re-ancla la evidencia al estado actual (el triple.code del bundle se actualiza) pero el gate sigue donde estaba, exactamente lo que la revisión debe confirmar. Marta re-solicita (froga request) y Diego re-aprueba (froga approve) sobre esa evidencia fresca, con el motivo de la aceptación consciente del residual de nuevo en el acta. El sistema vuelve a «aprobado», ahora anclado a la V2.0.1. La revisión no dio nada por sentado: lo re-confirmó con evidencia al día.

Un sistema de IA de alto riesgo — declarado, clasificado según el Anexo III §3, tratado con un cambio versionado, con la evidencia firmada en git — que cierra en VERDE limpio, sin ambigüedad estadística, en el control que de verdad podía sostener un rojo→verde honesto: la minimización de datos de un alumno que puede ser menor de edad (RGPD Art. 5(1)(c)). El riesgo era real (216 de 1044 alumnos eran re-identificables exactamente por su edad, dirección y tamaño de familia), el tratamiento fue un cambio de código versionado en train.py (la edad se generaliza a tercil), y el gate pasó de k=1 a k=27 con un intervalo de confianza que queda entero del lado seguro — nada infrapotenciado, nada fabricado. En paralelo, la paridad demográfica también mejoró (0,024 → 0,014) y queda certificada como control de auditoría, no como el gate: a la muestra real (mat + portugués combinadas, 1044 filas) la disparidad de género ya era pequeña — inflarla a rojo habría sido tan deshonesto como fabricar un verde. Lo que queda como residual reconocido es la opacidad del modelo (Art. 13): sin un control que reduzca su probabilidad, su nivel se mantiene por encima del apetito del programa, y Diego lo acepta conscientemente, con motivo en acta, junto al acto de aprobación firmado. El mismo paquete firmado se proyecta sobre ISO 23894 y prEN 18228 con veredictos reales — presunción = falso hoy — y ni DORA ni MDR se declararon, porque no aplica ninguna capa. Esa es la lección completa del Nivel 2: un gate limpio no significa que todo el programa esté resuelto — significa que el control que de verdad podía sostenerse, se sostuvo, y lo que no se ha reducido queda reconocido, no escondido. Y esa aprobación no es un final: la revisión periódica (P1Y, ISO 23894 §6.6) la reabre, devuelve a Marta a medir (§6.7) y el verde se re-confirma con evidencia fresca — nunca se da por sentado.

La V1 mide k-anonimato = 1 sobre el trío edad/dirección/tamaño de familia. ¿Qué significa exactamente ese número, y por qué es un riesgo RGPD y no solo una curiosidad estadística?

k-anonimato = 1 significa que al menos un alumno del dataset es la única persona que comparte su combinación exacta de edad, dirección (urbana/rural) y tamaño de familia — de hecho, 216 de los 1044 alumnos están en esa situación. Eso es precisamente lo que el RGPD llama re-identificación: alguien con un poco de conocimiento externo (por ejemplo, “conozco a un chico de 17 años, de zona rural, de familia numerosa, que solicitó plaza este año”) podría señalar exactamente a esa fila del dataset, aunque el nombre no esté en la tabla. Como los sujetos pueden ser menores de edad, el RGPD exige un listón de protección reforzado (Art. 5(1)(c), minimización de datos) — y un dataset donde uno de cada cinco alumnos es re-identificable con tres atributos comunes no lo cumple. No es una curiosidad: es el riesgo declarado en risk.minors-vulnerable-processing hecho número.

El tratamiento generaliza la edad exacta a un tercil (b0/b1/b2) pero deja la dirección y el tamaño de familia sin tocar. ¿Por qué basta ese único cambio para que k-anonimato pase de 1 a 27?

Porque la edad exacta es, con diferencia, el atributo con más cardinalidad de los tres — hay muchos valores de edad distintos en el dataset, cada uno formando grupos pequeños al cruzarse con dirección y tamaño de familia. Al sustituirla por un tercil (solo tres valores posibles: b0/b1/b2), el número de combinaciones posibles del trío se reduce drásticamente — de cientos de grupos diminutos a apenas 16 grupos, todos con decenas de alumnos como mínimo. Dirección y tamaño de familia ya eran atributos “coarse” (solo dos valores cada uno: urbano/rural, familia pequeña/grande), así que no aportaban casi nada a la granularidad — generalizarlos también no habría cambiado mucho el resultado. Es la técnica clásica de generalización de Sweeney: no hace falta ocultar TODOS los atributos identificadores, basta con coarsear el que más discrimina.

La paridad demográfica de la V2 (0,014) está muy por debajo de la barrera 0,08, con un intervalo de confianza que no la cruza. ¿Por qué NO es esta la barrera bloqueante del nivel, si también es un riesgo real y medido?

Porque el motivo por el que existe un arco rojo→verde en un control es que los datos REALMENTE lo sostienen — y aquí no lo sostenían: sobre la muestra honesta (matemáticas + portugués combinadas, 1044 filas, con los 382 alumnos que cursan ambas asignaturas tratados como una sola persona, no como dos registros independientes) la disparidad de género ya era pequeña en la V1 sin tratar (0,024) y baja algo más con el tratamiento (0,014) — nunca hubo un rojo real que tratar. (Una versión anterior de este guion medía la equidad sobre un hold-out de apenas 99 estudiantes, y esa muestra pequeña infló la aparente disparidad — una lección de honestidad estadística por sí misma, pero no una que sostuviera un arco.) Convertir la paridad demográfica en gate habría exigido fabricar un rojo artificial o forzar el umbral hasta que “cerrara” — ambas cosas exactamente lo que este enfoque existe para prevenir. El control sigue siendo real: se mide con 5-fold out-of-fold sobre la muestra completa y queda certificado en verde como audit, en el registro, visible — pero el arco que de verdad podía sostenerse con los datos es la minimización de un dato de menor.

El gate de minimización de datos cierra en VERDE, pero Diego tiene que aportar un motivo para aprobar de todos modos. ¿Por qué, si el control bloqueante ya pasó?

Porque el programa de riesgos de este sistema tiene SEIS riesgos declarados, y el gate solo refleja el estado de los controles bloqueantes (aquí, uno: minors-data-minimization). risk.opacity — decisiones automatizadas sin explicabilidad suficiente — es un riesgo distinto, con nivel inherente Crítico (probabilidad casi cierta × impacto alto) y solo un control de auditoría (accuracy-floor), sin ninguna medida que reduzca su probabilidad. Su residual queda, por tanto, por ENCIMA del apetito declarado del programa — algo que el motor detecta y anuncia explícitamente, aunque no bloquee el gate (los controles de auditoría nunca bloquean, por diseño). La aprobación de dirección (ISO 42001 6.1.3) exige que alguien con autoridad reconozca ese residual y decida conscientemente aceptarlo — con el motivo exigido y registrado en el acto firmado, no en una nota aparte. Un gate verde certifica lo que el gate mide; la aprobación certifica que una persona responsable ha mirado TODO el programa, no solo el gate.

El sistema declara ISO 23894 y prEN 18228, pero no DORA ni el MDR — ni tampoco un catálogo RGPD completo. ¿Por qué esa mezcla de 'sí declarado' y 'aún no proyectado' es la respuesta honesta?

Declara solo las normas que realmente lo gobiernan, y solo hasta donde el motor puede proyectarlas de verdad. La selección de estudiantes es de alto riesgo bajo la Ley de IA sin capa sectorial, así que DORA (finanzas) y el MDR (dispositivos médicos) no aplican — declararlos sería una afirmación exagerada. El RGPD, en cambio, SÍ aplica (los sujetos pueden ser menores), pero el motor no tiene todavía un catálogo de cláusulas RGPD que proyectar automáticamente — así que la parte medible (minimización de datos, Art. 5(1)(c)) se convirtió en un control real con gate numérico, mientras que la parte que aún no es medible (consentimiento del niño, DPIA, no elaboración de perfiles) se lleva como una medida atestada: declarada con evidencia y firmada, pero honestamente marcada como no verificada automáticamente. En cuanto a prEN 18228: es un borrador armonizado (HarmonizedDraft), así que su indicador presunción es falso — aunque el motor proyecte veredictos reales por cláusula sobre ella. La honestidad corta en las tres direcciones a la vez: declara lo que te gobierna, mide lo que puedas medir de verdad, y marca como pendiente lo que todavía no puedas.

Ya has gobernado un sistema de alto riesgo sobre la columna vertebral limpia y has conocido tu primer gate de minimización de datos RGPD. A continuación vienen las capas sectoriales — regímenes sectoriales que se apilan sobre la Ley de IA: