El problema de fondo
La información de un paciente vive a trozos. Sus citas están en un sistema, sus análisis en otro, sus recetas en un tercero y sus facturas en un cuarto. Ninguno se comunica bien con los demás.
Las consecuencias son corrientes y constantes. Un médico receta un medicamento sin ver que choca con otro que recetó un colega el mes pasado. Un resultado crítico se queda sin leer durante horas. Un paciente llama a recepción para preguntar algo que ya está respondido en un documento que nadie encuentra. El personal vuelve a teclear los mismos datos en cuatro pantallas distintas.
Nada de esto es un problema tecnológico en el sentido emocionante. Es un problema de coordinación. La información existe; simplemente nunca llega adonde hace falta, cuando hace falta.
La solución
HealthPack está diseñado como quince servicios pequeños e independientes en lugar de uno grande. Cada uno se encarga de una sola tarea y la hace bien: uno gestiona las historias clínicas, otro las citas, otro los resultados de laboratorio, otro las recetas, otro los documentos y otro el asistente de IA.
Se mantienen sincronizados difundiendo lo que pasa. Cuando un resultado de laboratorio queda validado, el servicio de laboratorio lo anuncia una sola vez, en lab.result.finalized. Todo lo que tiene interés en ello —la cronología médica del paciente, el sistema de alertas del médico, el circuito de facturación, el índice de búsqueda del asistente de IA— recibe el mismo anuncio por Kafka y reacciona por su cuenta. Nadie tiene que acordarse de avisar a nadie.
Esa es toda la idea: el sistema se cuenta a sí mismo lo que ha pasado, y lo que tiene que ocurrir ocurre solo. Kafka transporta los hechos —cosas que han pasado, reproducibles, conservadas— y RabbitMQ transporta el trabajo —genera este PDF, envía esta notificación—: un worker, un intento, reintentado si falla.
Las partes difíciles
Las cosas fallan, y el sistema tiene que sobrevivir. En un sistema de quince servicios independientes, que uno esté caído un rato es lo normal, no la excepción. El diseño de HealthPack mantiene el fallo acotado: si el servicio de notificaciones cae, las citas se siguen reservando; los recordatorios esperan en RabbitMQ y salen cuando se recupera. No se pierde nada.
Nada debería ocurrir dos veces. Una receta nunca debe emitirse dos veces porque se reintentó una petición de red. Cada generación de documento lleva una clave de idempotencia, comprobada antes de empezar cualquier trabajo, de modo que repetir el mismo comando produce el mismo resultado que ejecutarlo una vez.
Velocidad donde importa. El panel de un médico reúne información de cinco servicios distintos. Hecho de forma ingenua, son decenas de peticiones separadas y una página lenta. La capa GraphQL las agrupa en una sola llamada gRPC por servicio en lugar de una por fila de paciente, así que la página carga en un único viaje de ida y vuelta.
La privacidad es una restricción de diseño, no una funcionalidad. El consentimiento se comprueba antes de que el asistente de IA lea nada. Los datos personales se eliminan antes de que cualquier dato salga de los servidores del propio hospital. No son añadidos: la arquitectura los da por supuestos desde el primer diagrama.
Historias clínicas
Una identidad verificada única para cada paciente, para que todos los demás servicios hablen de la misma persona. Los campos sensibles se cifran uno a uno, no solo con un «la base de datos está cifrada».
Citas
Los pacientes reservan en línea y ven la disponibilidad real. Una restricción de exclusión en la base de datos hace que sea estructuralmente imposible guardar dos reservas del mismo médico en la misma franja, no solo algo que se comprueba con cuidado.
Registros clínicos
Los médicos registran visitas, diagnósticos y mediciones. Todo lleva fecha y hora, se vincula a la cronología del paciente y se codifica con CIE-10, SNOMED CT y LOINC, los estándares que de verdad usan los hospitales.
Resultados de laboratorio
Los resultados llegan en el formato de mensajería hospitalario estándar (HL7 v2) directamente desde los equipos de laboratorio. Un proceso de streaming vigila cada resultado en busca de valores peligrosos y avisa a un médico en segundos, saltándose el modo no molestar.
Recetas
Antes de emitir una receta, se comprueba contra todo lo que el paciente está tomando. Una interacción peligrosa bloquea la orden y explica exactamente por qué; si se fuerza, queda registrado para siempre con el motivo que da el médico.
Documentos
Informes de alta, informes de laboratorio, recetas y facturas se generan como PDF de calidad de archivo, firmados criptográficamente para que cualquier manipulación sea detectable. La generación ocurre en segundo plano: nadie espera delante de una pantalla de carga.
Asistente de IA
Pacientes y personal preguntan en lenguaje natural. El asistente responde solo a partir de los documentos reales de ese paciente, cita la fuente de cada afirmación y lo dice claramente cuando los documentos no contienen la respuesta.
Mensajería
Chat en tiempo real entre pacientes y profesionales sanitarios, y con el asistente de IA. Las respuestas llegan token a token en lugar de aparecer tras una larga pausa.
Notificaciones
Recordatorios de citas, avisos de resultados disponibles y valores críticos, enviados por push, correo o SMS según lo que haya elegido cada persona. Las alertas críticas siguen un camino aparte y más rápido que se salta las horas de silencio.
Facturación
Las facturas se generan automáticamente al cerrar una visita, con los pagos con tarjeta gestionados mediante Stripe y un outbox transaccional que mantiene ambos sincronizados.
Registro de auditoría
Cada acción de cualquier persona queda registrada en un log encadenado por hashes a prueba de manipulaciones. Alterar un registro pasado rompe la cadena y se detecta: la normativa lo exige, y la mayoría de los sistemas lo implementan mal.