verified/emitted. Objetivo ≥95%. Visible al usuario si <100%.[cita no verificable]. Objetivo <2%.evidencia-safeguards.test.ts.08-incident-response.md).evidenciaSearch.ts está envuelto en .catch() que devuelve array vacío y registra el error en meta.errors. Una caída de PubMed no impide ver Europe PMC + OpenAlex + CORE.routing.ts prueba DeepSeek → Gemini → Mistral → OpenRouter en cascada hasta obtener respuesta.Estado: ✅ Implementado en functions/src/evidencia/biasAudit.ts + biasAuditScenarios.ts. Test runner en functions/test/evidencia-biasAudit.test.ts. Se ejecuta automáticamente en cada push (CI vitest) y de forma manual con npm test -- evidencia-biasAudit.
| Especialidad | Nº escenarios | Variantes de sesgo |
|---|---|---|
| Cardiología | 5 | 2 |
| Respiratorio | 4 | — |
| Digestivo | 4 | — |
| Infecciosas | 4 | 2 |
| Endocrino | 4 | 2 |
| Neurología | 4 | 2 |
| Safeguard rejection (uno por motivo: corta, larga, diagnóstica, terapéutica, PII DNI/fecha/teléfono) | 7 | — |
| Total clínicos | 25 | 8 |
pass_rate ≥ 99%.consistency_rate = 100%.studyTypes esperados (revisión sistemática, RCT, guía EU, etc.) y se valida que gradeEvidence() asigna un grado ≥ al esperado mínimo → grade_match_rate ≥ 80%.pass_rate = 100%.evidencia_consultas.Estas dimensiones se cubren con la vigilancia post-market documentada en 10-post-market-surveillance.md.
SCENARIOS_VERSION en biasAudit.ts cuando se añadan/eliminen escenarios (para que los reportes históricos sean comparables).08-incident-response.md) revele un caso no cubierto.runFullAudit(){
total: number, // total escenarios evaluados
passed: number, failed: number,
passRate: number, // ≥ 0.95 obligatorio
byCategory: { ... }, // breakdown por especialidad
metrics: {
safeguard_pass_rate: number, // ≥ 0.99
safeguard_consistency_rate: number, // = 1.0
reranker_grade_match_rate: number, // ≥ 0.8
citation_verifier_pass_rate: number,// = 1.0
},
scenariosVersion: 1,
ranAt: ISO-8601,
}
CI rechaza el deploy si cualquier umbral falla.
| Capa | Medida |
|---|---|
| Frontend | CSP estricto, X-Content-Type-Options, Referrer-Policy, integridad SRI en scripts críticos |
| Auth | Firebase Auth + Google OAuth + email verificado; reCAPTCHA v3 en login |
| Transport | HTTPS only (HSTS via Firebase Hosting) |
| App Check | Enforce activo en Firestore + Functions + Storage (reCAPTCHA Enterprise) |
| Cloud Functions | App Check requerido (configurable); rate limit por uid + por IP |
| Secrets | Secret Manager (no en código, no en frontend) |
| Firestore Rules | Solo Admin SDK escribe evidencia_consultas, evidenciaCache; lectura propia restringida |
| CORS | Whitelist explícita: area2cartagena.es, github.io, localhost dev |
| Logging | Sentry (errores) + Cloud Logging (operacional) + Firestore (auditoría AI Act) |
| Backups | Firestore backup diario auto, retención 30d |
| Vulnerabilidades | npm audit en CI + dependabot en GitHub |
Pendiente: pen-test trimestral + red team específico de prompt injection. Plan documentado en 06-accuracy-robustness.md (sección a expandir tras acuerdo con auditor externo).
Visibles en /admin-dashboard.html (rol admin):
Anomalías → alerta a carlosgalera2roman@gmail.com (vía Sentry + dailyBalanceCheck).