Healthcare Eval Harness — 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 usan Jest como framework de pruebas de referencia. Adapta los comandos a tu 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 farmacológicas, validación de dosis, puntuaciones)
- Después de cambiar esquemas de base de datos que afectan datos del paciente
- Después de modificar la autenticación o el control de acceso
- Durante la configuración de pipelines 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 prueba 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%+.
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 en el primer fallo) y aplica 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 soporte de decisiones clínicas: pares de interacciones farmacológicas (en ambos sentidos), reglas de validación de dosis, puntuaciones clínicas contra 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 la ausencia de fugas de información protegida de salud: respuestas de error de la API, salida de consola, parámetros de URL, almacenamiento del navegador, aislamiento entre instalaciones, acceso no autenticado, ausencia de clave 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 eliminación 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%+ requerido)
Prueba flujos de extremo a extremo: ciclo de vida del encuentro, renderizado de plantillas, conjuntos de medicamentos, 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
tasa=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Tasa de aprobación clínica: ${tasa}% ($passed/$total)"
5. Cumplimiento de Integración (ALTA — 95%+ 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
tasa=$(echo "scale=2; $passed * 100 / $total" | bc)
echo "Tasa de aprobación de integración: ${tasa}% ($passed/$total)"
Matriz de Aprobación/Fallo
| Categoría | Umbral | En caso de 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%+ | ADVERTIR, permitir con revisión |
| Integración | 95%+ | ADVERTIR, permitir con revisión |
Integración CI/CD
name: Puerta de Seguridad Sanitaria
on: [push, pull_request]
jobs:
puerta-seguridad:
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 en el primer fallo
- name: Precisión CDSS
run: npx jest --testPathPattern='tests/cdss' --bail --ci --coverage --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
- name: Verificación Exposición 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%+ 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")
PASADOS=$(jq '.numPassedTests // 0' "$TMP_JSON")
if [ "$TOTAL" -eq 0 ]; then
echo "::error::No se encontraron pruebas clínicas"; exit 1
fi
TASA=$(echo "scale=2; $PASADOS * 100 / $TOTAL" | bc)
echo "Tasa de aprobación: ${TASA}% ($PASADOS/$TOTAL)"
if (( $(echo "$TASA < 95" | bc -l) )); then
echo "::warning::La tasa de aprobación clínica ${TASA}% 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")
PASADOS=$(jq '.numPassedTests // 0' "$TMP_JSON")
if [ "$TOTAL" -eq 0 ]; then
echo "::error::No se encontraron pruebas de integración"; exit 1
fi
TASA=$(echo "scale=2; $PASADOS * 100 / $TOTAL" | bc)
echo "Tasa de aprobación: ${TASA}% ($PASADOS/$TOTAL)"
if (( $(echo "$TASA < 95" | bc -l) )); then
echo "::warning::La tasa de aprobación de integración ${TASA}% está por debajo del 95%"
fi
Anti-patrones
- Omitir las 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 el motor CDSS en pruebas de integración (debe probar 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 Tasa de Aprobación de Puerta ALTA
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 | Aprobados | Fallos | 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%+)
### Veredicto: SEGURO PARA DESPLEGAR