Ir al contenido

Ingesta y extracción

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.

  1. El servidor valida formato, nombre y tamaño antes de decodificar por completo.
  2. Extrae texto localmente. PDF usa unpdf, Word usa el parser de documentos y texto se decodifica directamente.
  3. Cifra los bytes originales con AES-256-GCM.
  4. Guarda el ciphertext en R2 y metadatos en PostgreSQL.
  5. El inventario expone estado y nombre derivado, no el cuerpo de la nota.
  6. 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.

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.

  • El modelo no decide la semántica tri-state.
  • Un cero real se conserva.
  • false solo 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.

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.

  • 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.
  • 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.