Arnés de Evaluación para Salud — Verificación de Seguridad del Paciente
Sistema de verificación automatizada para despliegues de aplicaciones sanitarias. Un solo fallo CRÍTICO bloquea el despliegue. La seguridad del paciente no es negociable.
Nota: Los ejemplos utilizan Jest como ejecutor de pruebas de referencia. Adapte los comandos a su framework (Vitest, pytest, PHPUnit, etc.) — las categorías de prueba y los umbrales de aprobación son independientes del framework.
Cuándo Usarlo
- Antes de cualquier despliegue de aplicaciones EMR/EHR
- Después de modificar la lógica de CDSS (interacciones medicamentosas, validación de dosis, puntuaciones)
- Después de cambiar esquemas de base de datos que afecten datos de pacientes
- Después de modificar la autenticación o el control de acceso
- Durante la configuración del pipeline CI/CD para aplicaciones sanitarias
- Después de resolver conflictos de fusión en módulos clínicos
Cómo Funciona
El arnés de evaluación ejecuta cinco categorías de pruebas en orden. Las tres primeras (Precisión de CDSS, Exposición de PHI, Integridad de Datos) son puertas CRÍTICAS que requieren una tasa de aprobación del 100 % — un solo fallo bloquea el despliegue. Las dos restantes (Flujo de Trabajo Clínico, Integración) son puertas ALTAS que requieren una tasa de aprobación del 95 % o superior.
Cada categoría se asigna a un patrón de ruta de prueba de Jest. El pipeline de CI ejecuta las puertas CRÍTICAS con --bail (detenerse ante el primer fallo) y exige umbrales de cobertura con --coverage --coverageThreshold.
Categorías de Evaluación
1. Precisión de CDSS (CRÍTICA — 100 % requerido)
Prueba toda la lógica de apoyo a decisiones clínicas: pares de interacciones medicamentosas (ambas direcciones), reglas de validación de dosis, puntuaciones clínicas frente a especificaciones publicadas, sin falsos negativos, sin fallos silenciosos.
npx jest --testPathPattern='tests/cdss' --bail --ci --coverage
2. Exposición de PHI (CRÍTICA — 100 % requerido)
Prueba fugas de información sanitaria protegida: respuestas de error de API, salida de consola, parámetros de URL, almacenamiento del navegador, aislamiento entre instalaciones, acceso no autenticado, ausencia de claves de rol de servicio.
npx jest --testPathPattern='tests/security/phi' --bail --ci
3. Integridad de Datos (CRÍTICA — 100 % requerido)
Prueba la seguridad de los datos clínicos: encuentros bloqueados, entradas de pista de auditoría, protección contra borrado en cascada, manejo de ediciones concurrentes, sin registros huérfanos.
npx jest --testPathPattern='tests/data-integrity' --bail --ci
4. Flujo de Trabajo Clínico (ALTA — 95 % o más requerido)
Prueba flujos completos: ciclo de vida del encuentro, renderizado de plantillas, conjuntos de medicación, búsqueda de medicamentos/diagnósticos, PDF de prescripción, alertas de bandera roja.
tmp_json=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$tmp_json" || true
total=$(jq '.numTotalTests // 0' "$tmp_json")
passed=$(jq '.numPassedTests // 0' "$tmp_json")
if [ "$total" -eq 0 ]; then
echo "No se encontraron pruebas clínicas" >&2
exit 1
fi
rate=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Tasa de aprobación clínica: ${rate}% ($passed/$total)"
5. Cumplimiento de Integración (ALTA — 95 % o más requerido)
Prueba sistemas externos: análisis de mensajes HL7 (v2.x), validación FHIR, mapeo de resultados de laboratorio, manejo de mensajes malformados.
tmp_json=$(mktemp)
npx jest --testPathPattern='tests/integration' --ci --json --outputFile="$tmp_json" || true
total=$(jq '.numTotalTests // 0' "$tmp_json")
passed=$(jq '.numPassedTests // 0' "$tmp_json")
if [ "$total" -eq 0 ]; then
echo "No se encontraron pruebas de integración" >&2
exit 1
fi
rate=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Tasa de aprobación de integración: ${rate}% ($passed/$total)"
Matriz de Aprobación/Fallo
| Categoría | Umbral | Ante un Fallo |
|---|---|---|
| Precisión de CDSS | 100 % | BLOQUEAR despliegue |
| Exposición de PHI | 100 % | BLOQUEAR despliegue |
| Integridad de Datos | 100 % | BLOQUEAR despliegue |
| Flujo de Trabajo Clínico | 95 % o más | ADVERTENCIA, permitir con revisión |
| Integración | 95 % o más | ADVERTENCIA, permitir con revisión |
Integración CI/CD
name: Puerta de Seguridad Sanitaria
on: [push, pull_request]
jobs:
safety-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
# Puertas CRÍTICAS — 100 % requerido, detenerse ante el primer fallo
- name: Precisión de CDSS
run: npx jest --testPathPattern='tests/cdss' --bail --ci --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
- name: Verificación de Exposición de PHI
run: npx jest --testPathPattern='tests/security/phi' --bail --ci
- name: Integridad de Datos
run: npx jest --testPathPattern='tests/data-integrity' --bail --ci
# Puertas ALTAS — 95 % o más requerido, verificación de umbral personalizada
- name: Flujos de Trabajo Clínicos
run: |
TMP_JSON=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$TMP_JSON" || true
TOTAL=$(jq '.numTotalTests // 0' "$TMP_JSON")
PASSED=$(jq '.numPassedTests // 0' "$TMP_JSON")
if [ "$TOTAL" -eq 0 ]; then
echo "::error::No se encontraron pruebas clínicas"; exit 1
fi
RATE=$(echo "scale=2; $PASSED * 100 / $TOTAL" | bc)
echo "Tasa de aprobación: ${RATE}% ($PASSED/$TOTAL)"
if (( $(echo "$RATE < 95" | bc -l) )); then
echo "::warning::La tasa de aprobación clínica ${RATE}% está por debajo del 95%"
fi
- name: Cumplimiento de Integración
run: |
TMP_JSON=$(mktemp)
npx jest --testPathPattern='tests/integration' --ci --json --outputFile="$TMP_JSON" || true
TOTAL=$(jq '.numTotalTests // 0' "$TMP_JSON")
PASSED=$(jq '.numPassedTests // 0' "$TMP_JSON")
if [ "$TOTAL" -eq 0 ]; then
echo "::error::No se encontraron pruebas de integración"; exit 1
fi
RATE=$(echo "scale=2; $PASSED * 100 / $TOTAL" | bc)
echo "Tasa de aprobación: ${RATE}% ($PASSED/$TOTAL)"
if (( $(echo "$RATE < 95" | bc -l) )); then
echo "::warning::La tasa de aprobación de integración ${RATE}% está por debajo del 95%"
fi
Anti-Patrones
- Omitir pruebas de CDSS "porque pasaron la última vez"
- Establecer umbrales CRÍTICOS por debajo del 100 %
- Usar
--no-bailen conjuntos de pruebas CRÍTICAS - Simular (mockear) el motor CDSS en pruebas de integración (debe probarse la lógica real)
- Permitir despliegues cuando la puerta de seguridad esté en rojo
- Ejecutar pruebas sin
--coverageen conjuntos de CDSS
Ejemplos
Ejemplo 1: Ejecutar Todas las Puertas Críticas Localmente
npx jest --testPathPattern='tests/cdss' --bail --ci --coverage && \
npx jest --testPathPattern='tests/security/phi' --bail --ci && \
npx jest --testPathPattern='tests/data-integrity' --bail --ci
Ejemplo 2: Verificar la Tasa de Aprobación de Puertas ALTAS
tmp_json=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$tmp_json" || true
jq '{
passed: (.numPassedTests // 0),
total: (.numTotalTests // 0),
rate: (if (.numTotalTests // 0) == 0 then 0 else ((.numPassedTests // 0) / (.numTotalTests // 1) * 100) end)
}' "$tmp_json"
# Esperado: { "passed": 21, "total": 22, "rate": 95.45 }
Ejemplo 3: Informe de Evaluación
## Evaluación Sanitaria: 2026-03-27 [commit abc1234]
### Seguridad del Paciente: APROBADO
| Categoría | Pruebas | Aprobadas | Fallidas | Estado |
|-----------|---------|-----------|----------|--------|
| Precisión de CDSS | 39 | 39 | 0 | APROBADO |
| Exposición de PHI | 8 | 8 | 0 | APROBADO |
| Integridad de Datos | 12 | 12 | 0 | APROBADO |
| Flujo de Trabajo Clínico | 22 | 21 | 1 | 95.5 % APROBADO |
| Integración | 6 | 6 | 0 | APROBADO |
### Cobertura: 84 % (objetivo: 80 % o más)
### Veredicto: SEGURO PARA DESPLEGAR