Ingesta y extracción
Formas de ingreso
Sección titulada «Formas de ingreso»| Entrada | Persistencia del original | Momento de extracción |
|---|---|---|
| Texto pegado en consola | No crea archivo original | Inmediata, se encola al recibirlo |
| PDF, Word o texto en consola | Original cifrado en R2 + fila de metadatos | Bajo demanda desde el inventario |
| Carga por lotes con clave de servicio | Original cifrado por nota | Solo almacena; el médico extrae después |
| RheumAI “submit for review” | No crea fila de upload | Reextrae en servidor y crea un borrador retenido |
| Agente clínico dedicado | Usa solo uploads del médico configurado | Bajo demanda, con clave de agente |
| Documento del canal de estudio WhatsApp | Original cifrado en R2 | Inmediata cuando el canal, consentimiento y médico están configurados |
La respuesta de carga por lotes prueba almacenamiento, no extracción. Cada nota devuelve su propio resultado y una nota inválida no cancela sus hermanas.
Archivos
Sección titulada «Archivos»- El servidor valida formato, nombre y tamaño antes de decodificar por completo.
- Extrae texto localmente. PDF usa
unpdf, Word usa el parser de documentos y texto se decodifica directamente. - Cifra los bytes originales con AES-256-GCM.
- Guarda el ciphertext en R2 y metadatos en PostgreSQL.
- El inventario expone estado y nombre derivado, no el cuerpo de la nota.
- Al solicitar extracción, la API comprueba alcance antes de obtener o descifrar el archivo.
El límite actual del archivo original es 20 MiB. Los nombres se limpian para impedir controles y separadores de ruta.
Trabajo de extracción
Sección titulada «Trabajo de extracción»El trabajador obtiene el texto, aplica desidentificación de mejor esfuerzo, ejecuta el modelo de registro-extraction, analiza JSON, convierte nulos a unknown, valida el esquema, calcula DAS-28, calcula faltantes por enfermedad y crea un borrador review_pending con fuente cifrada y atribución.
Integridad
Sección titulada «Integridad»- El modelo no decide la semántica tri-state.
- Un cero real se conserva.
falsesolo representa negación explícita, salvo comorbilidades confirmadas al enviar.- DAS-28 reportado se compara; el valor autoritativo se calcula desde componentes cuando es posible.
- Episodios biológicos mantienen rol, fármaco, fechas y motivo separados.
- El solicitado sin fecha propia puede usar la fecha de solicitud o nota; no aplica a episodios actuales o previos.
Privacidad y riesgo residual
Sección titulada «Privacidad y riesgo residual»La desidentificación elimina identificadores genéricos y tokens del nombre cuando puede localizarlos. No es garantía de cumplimiento: un nombre libre sin etiqueta puede sobrevivir. Fechas clínicas, sexo, centro y médico pueden conservarse porque forman parte del registro.
El payload clínico de la cola de extracción puede contener texto en claro dentro de PostgreSQL. El camino de estudio cifra su nota antes de la cola, pero el camino clínico todavía no comparte esa protección.
Reintentos y fallos
Sección titulada «Reintentos y fallos»- Extracción permite cinco intentos con backoff.
- Al agotarlos, un dead-letter crea un fallo visible sin guardar el texto clínico.
- Una nota fallida o rechazada puede volver a extraerse.
- Un borrador pendiente o aprobado evita duplicados.
Huecos operativos
Sección titulada «Huecos operativos»- Un fallo entre guardar el objeto R2 y crear la fila puede dejar un objeto cifrado huérfano.
- Un fallo de cola después de guardar el upload produce éxito parcial: la fuente existe aunque no haya trabajo.
- Si el borrador se crea y luego falla la auditoría, el reintento puede crear otro borrador porque la inserción no tiene llave de idempotencia por intento.
- Una nota pegada que termina en dead letter no tiene archivo original recuperable desde el inventario.
- Completar desde fuente llena solo escalares
unknown; no fusiona arrays de episodios y no tiene UI clínica.