Resumen por categoría
CDSS Accuracy
42
de 42 tests · 100%
CRITICAL
PHI Exposure
10
de 10 tests · 100%
CRITICAL
Data Integrity
14
de 14 tests · 100%
CRITICAL
Clinical Workflow
23
de 24 tests · 95.8%
HIGH
Integration
8
de 8 tests · 100%
HIGH
Tabla de evaluación detallada
| Categoría | Tipo de puerta | Umbral | Tests | Tasa de aprobado | Estado |
|---|---|---|---|---|---|
|
CDSS Accuracy
Interacciones, dosis, escalas clínicas
|
CRITICAL | 100% | 42 / 42 | ✓ PASS | |
|
PHI Exposure
Fugas PHI, aislamiento multi-tenant
|
CRITICAL | 100% | 10 / 10 | ✓ PASS | |
|
Data Integrity
Locks, auditoría, cascade delete
|
CRITICAL | 100% | 14 / 14 | ✓ PASS | |
|
Clinical Workflow
Ciclo episodio, prescripciones, alertas
|
HIGH | 95%+ | 23 / 1 fail / 24 | ⚠ WARN | |
|
Integration Compliance
HL7 v2.5, FHIR R4, lab results
|
HIGH | 95%+ | 8 / 8 | ✓ PASS |
Fallos y advertencias
WARNING · Clinical Workflow
prescription-pdf.test.ts › debería generar PDF con firma electrónica del médico
tests/clinical/prescription-pdf.test.ts:87
El test de generación de PDF con firma electrónica ha fallado en el entorno CI por timeout (3000ms). El módulo
@medicultiva/pdf-signer no recibe respuesta del mock del servicio HSM en CI. No afecta a la seguridad del paciente — solo a la generación de documentación administrativa.
● prescription-pdf › debería generar PDF con firma electrónica del médico
Timeout - Async callback was not invoked within the 3000ms timeout
at tests/clinical/prescription-pdf.test.ts:87:5
→ Causa probable: mock HSM no inicializado en entorno CI
→ Funciona correctamente en entorno local (verificado 2026-06-17)
→ Ticket: MC-1847 · Asignado a: María Torres · ETA: 2026-06-20
Cobertura de código (módulo CDSS)
Statements
92%
objetivo: ≥80%
Branches
88%
objetivo: ≥80%
Functions
93%
objetivo: ≥80%
Lines
92%
objetivo: ≥80%
Línea de tiempo de ejecución
✓
🧠 CDSS Accuracy — CRITICAL GATE
09:14:37 → 09:16:42 · 2m 05s
42/42 tests aprobados · Cobertura 92% · Nuevas reglas warfarina+AINEs y metformina+contraste IV verificadas sin regresión en las 38 reglas existentes.
✓
🔒 PHI Exposure — CRITICAL GATE
09:16:43 → 09:17:11 · 28s
10/10 tests aprobados · Sin fugas PHI en respuestas de error, sin datos en URL params, aislamiento multi-clínica verificado, service_role key ausente del bundle frontend.
✓
🗄️ Data Integrity — CRITICAL GATE
09:17:12 → 09:17:55 · 43s
14/14 tests aprobados · Bug MC-1841 de cascade delete en episodios cerrados correctamente reparado — test específico de regresión añadido y aprobado.
⚠
🏥 Clinical Workflow — HIGH GATE
09:17:56 → 09:18:47 · 51s
23/24 tests aprobados · 95.8% ≥ 95% umbral — PASA con advertencia · 1 fallo no crítico (PDF firma HSM timeout) documentado en ticket MC-1847.
✓
🔗 Integration Compliance — HIGH GATE
09:18:48 → 09:19:00 · 12s
8/8 tests aprobados · Nuevo endpoint FHIR R4 valida correctamente recursos Patient, Encounter y MedicationRequest · HL7 v2.5 ADT^A01 sin regresión.
Configuración CI/CD aplicada
📄 .github/workflows/healthcare-safety-gate.yml — fragmento activo
# Healthcare Safety Gate — MediCultiva EMR
name: Healthcare Safety Gate
on: [push, pull_request]
jobs:
safety-gate:
runs-on: ubuntu-latest
steps:
# ─── CRITICAL gates — bail en primer fallo ───────────────────
- name: CDSS Accuracy [CRITICAL]
run: npx jest --testPathPattern='tests/cdss' --bail --ci --coverage \
--coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80}}'
- name: PHI Exposure Check [CRITICAL]
run: npx jest --testPathPattern='tests/security/phi' --bail --ci
- name: Data Integrity [CRITICAL]
run: npx jest --testPathPattern='tests/data-integrity' --bail --ci
# ─── HIGH gates — 95%+ con cálculo dinámico ──────────────────
- name: Clinical Workflows [HIGH]
run: |
TMP=$(mktemp)
npx jest --testPathPattern='tests/clinical' --ci --json --outputFile="$TMP" || true
RATE=$(jq '(.numPassedTests // 0) * 100 / (.numTotalTests // 1)' "$TMP")
echo "Clinical pass rate: ${RATE}%"
if (( $(echo "$RATE < 95" | bc -l) )); then exit 1; fi
- name: Integration Compliance [HIGH]
run: |
TMP=$(mktemp)
npx jest --testPathPattern='tests/integration' --ci --json --outputFile="$TMP" || true
RATE=$(jq '(.numPassedTests // 0) * 100 / (.numTotalTests // 1)' "$TMP")
echo "Integration pass rate: ${RATE}%"
if (( $(echo "$RATE < 95" | bc -l) )); then exit 1; fi