Sistema Médico Hospital Nacional d. Ingenieros y Programadores 11. Sistema HNSM en construcción

📡 Estado en vivo

Snapshot: 14 de mayo 2026 · 17:00 GT · Semana S02 de 34 · Fase A · Cimientos · verificado por SSH directo en VM Toscana root@177.7.57.79 y por HTTP sobre sistema-medico.com
  • Semáforo GENERAL 🟢 23 / 23 servicios piloto UP · 0 fallidos bajo systemd · diseño objetivo 25 microservicios · /actuator/health = 200 OK · API gateway :8080 · IAM (JWT/JWKS) :8086 con kid=hospital-prod-1.
  • Infra VM AMD EPYC 9354P · 4 vCPU · 16 GB RAM (9 GB en uso por JVMs) · 193 GB SSD (3% usado) · Ubuntu · Java 25 LTS Temurin · PostgreSQL 18 · Nginx + Cloudflared (sin Docker/K8s).
  • Datos BD 20 BD PostgreSQL 18 con role y schema dedicado por servicio (database-per-service). Evidencia auditable Flyway: flyway_schema_history poblado en 20/20 BDs (1 baseline + 41 filas de migration con CRC32 zlib).
  • Frontend FRONT sih-frontend 100% PROD · 8 / 8 portales productivos (Dirección · Admisión CE · Admisión ER · Consulta Externa · Emergencia · Hospitalización · Apoyo · Administración) · 0 módulos WIP · 0 items SOON · React 19 + Vite 6 + TypeScript estricto · desplegado en Cloudflare Workers (hospital-toscana-systems-app) servido en sistema-medico.com.

11.1 Estado general del proyecto

IndicadorValor real (verificado en VM)Meta fase AEstado
SemanaS02 de 34S08en curso
FaseA · CimientosCierre fin de junioen curso
Microservicios diseñados25 diseñados · 24 carpetas locales presentes · pasarela FHIR pendiente de crear25diseño vigente
Servicios piloto desplegados y UP21 de 21 en VM Toscana (verificado por /actuator/health)21100%
API GatewayOperativo en :8080 · Spring Cloud Gateway WebFlux · 19 rutas /api/v1/**OperativoUP
IAM (auth + JWKS)Operativo en :8086 · OAuth2 + JWT (RS256) · /.well-known/jwks.jsonOperativoUP
BD PostgreSQL provisionadas21 (con role dedicado por servicio)21creadas
BD con migraciones Flyway aplicadas20 de 20 con flyway_schema_history poblado (1 baseline + 41 filas migration · CRC32 zlib)20evidencia auditable
Java runtimeTemurin OpenJDK 25.0.3 LTS · virtual threads habilitadosJava 25completo
Hosting / DNS públicoCloudflare Tunnel + Nginx · 6 dominios activosHTTPS públicoactivo
ObservabilidadLogs en /var/log/hospital-services/*.log · OTel collector definido pero no corriendoPrometheus + Grafana + Loki + Tempoparcial
ADRs firmados14 de 1414completo
Datos sintéticos / pilotoNo generados1000 pacientes + 5000 episodiospendiente
CapacitaciónNo iniciadaS31–S32programada

11.2 Microservicios · estado real (verificado en VM)

Inventario reverificado por SSH directo en root@177.7.57.79 el 2026-05-09 16:14 UTC (active=21 failed=0 bajo systemd · gateway 200 · IAM JWKS 200). Stack: Spring Boot + Java 25 LTS Temurin con virtual threads · PostgreSQL 18 database-per-service · Spring Cloud Gateway WebFlux como BFF · OAuth2 Resource Server con JWT (claims iss/aud) validados contra el JWKS del IAM. Todos los servicios arrancan como JAR nativo (java -jar /opt/java-platform/services/<svc>/build/libs/<svc>-0.1.0-SNAPSHOT.jar) bajo unit hospital-<svc>.service — sin Docker ni Kubernetes en este corte. Estado UP = unit active(running) + /actuator/health = 200 OK.

25
Microservicios diseñados
23 / 23
Servicios piloto UP
100%
Health checks OK
22
BD PostgreSQL 18
19
Rutas en gateway
14
ADRs MADR
9 GB
RAM JVMs (de 16 GB)

Cada microservicio se nombra internamente en inglés (artefacto técnico) y se expone públicamente en español (Regla 8 · facade-ES/interno-EN).

#Nombre público (ES)Servicio interno (carpeta · EN)PuertoBase de datosRuta gatewayResponsabilidadEstado
1puerta-de-enlace-apiapi-gateway-service8080— (sin BD propia)Spring Cloud Gateway WebFlux · BFF · 19 rutas /api/v1/** · valida JWT (iss/aud) · X-Hospital-Trace-Id · cabeceras de seguridadUP
2identidad-paciente-svcpatient-mpi-service8081patient_mpi_db/api/v1/pacientes/**MPI · pacientes con DPI/carné · identidad clínicaUP
3admision-recepcion-svcreception-admission-service8082reception_admission_db/api/v1/admision/**Visitas · carné · reposicionesUP
4citas-svcappointments-service8083appointments_db/api/v1/citas/**Citas con/sin visita · agenda ambulatoriaUP
5triaje-emergencias-svcemergency-triage-service8084emergency_db/api/v1/emergencias/**Emergencias · síntomas → diagnóstico → Rx automática · vínculo a hospitalización-adtUP
6quirofano-svcsurgery-service8085surgery_db/api/v1/quirofano/**Cirugía perioperatoria · workflow PROGRAMADA → EN_CURSO → COMPLETADA · consume-stockUP
7identidad-y-acceso-svcidentity-access-service8086identity_access_db/api/v1/auth/**
/api/v1/policies/**
/api/v1/informatica/**
/.well-known/jwks.json
IAM · login/refresh/logout · sesiones en BD · roles RBAC · matriz role→módulo · JWKS público para Resource ServersUP
8catalogo-inventario-svcinventory-catalog-service8087inventory_catalog_db/api/v1/inventario/**Bodegas · ubicaciones · lotes · catálogo de insumosUP
9existencias-svcstock-ledger-service8088stock_ledger_db/api/v1/existencias/**Libro mayor de stock · movimientos · referencias farmacia/cirugíaUP
10maternidad-neonatal-svcmaternity-neonatal-service8089maternity_neonatal_db/api/v1/maternidad/**Maternidad y neonatos · prefill de formulariosUP
11formularios-sigsa-svcforms-sigsa-service8090forms_sigsa_db/api/v1/formularios-sigsa/**Formularios SIGSA · integración MSPASUP
12farmacia-recetas-svcpharmacy-prescriptions-service8091pharmacy_db/api/v1/farmacia/**Receta · dispensación · comprobante · cola por módulo · Resilience4jUP
13hospitalizacion-adt-svcinpatient-adt-service8092inpatient_adt_db/api/v1/hospitalizacion/**ADT hospitalario · admisión · traslado · alta · cama y servicioUP
14laboratorio-clinico-svcclinical-laboratory-service8093clinical_lab_db/api/v1/laboratorio/**LIS · órdenes y resultados de laboratorio clínicoUP
15imagenologia-clinica-svcclinical-imaging-service8094clinical_imaging_db/api/v1/imagenologia/**RIS/PACS · órdenes y resultados de imagenologíaUP
16enfermeria-emar-svcnursing-emar-service8095nursing_emar_db/api/v1/enfermeria/**eMAR · administración de medicamentos por enfermeríaUP
17facturacion-reclamos-svcbilling-claims-service8096billing_claims_db/api/v1/facturacion/**Facturación y reclamosUP
18firma-clinica-svcclinical-signature-service8097clinical_signature_db/api/v1/firmas/**Firma electrónica clínica · trazabilidadUP
19expediente-encuentros-svcehr-encounter-service8098ehr_encounter_db/api/v1/expediente/**EHR · encuentros longitudinales · evolución clínicaUP
20banco-sangre-svcblood-bank-service8099blood_bank_db/api/v1/banco-sangre/**Banco de sangre · tipificación · cross-match · trazabilidad bolsasUP
21uci-svcicu-service8100icu_db/api/v1/uci/**UCI · monitoreo intensivo · escalas y parámetrosUP
22terapia-respiratoria-svcterapia-respiratoria-svc8102terapia_respiratoria_db/api/v1/terapia-respiratoria/**Terapia respiratoria · ventilación · oxigenoterapia · gasesUP
23seguimiento-egreso-svcseguimiento-egreso-svc8103seguimiento_egreso_db/api/v1/seguimiento-egreso/**Seguimiento post-egreso · adherencia · readmisiónUP
Cómo se verificó: (1) ps -ef | grep java-platform → 21 PIDs en /opt/java-platform/services/<svc>/build/libs/<svc>-0.1.0-SNAPSHOT.jar. (2) ss -tlnp | grep java → puertos 8080–8100 en LISTEN. (3) bucle curl /actuator/health en cada puerto → 200 OK en los 21. (4) sudo -u postgres psql -l → 21 BDs *_db con role dedicado. (5) cat services/api-gateway-service/src/main/resources/application.yml → 19 rutas /api/v1/** mapeadas.

11.2.1 Pendientes priorizados

PendientePor qué importaResponsableFecha objetivo
Cablear endpoints administrativos reales en los servicios respectivos (/v1/rrhh/dotacion, /v1/rrhh/novedades, /v1/presupuesto/rubros, /v1/compras/guatecompras, /v1/facturacion/facturas)Las cuatro páginas nuevas del portal Administración están productivas en UI pero caen a MOCK con banner «Datos demo» hasta que los microservicios expongan los endpoints.Junior 1 + Junior 22026-05-20
Monitoreo continuo de connections PostgreSQL y ajuste fino de pools por servicioSe resolvió una saturación (106/100). Mantener tuning Hikari para evitar rebrotes bajo carga real.Toscana · Ingeniería2026-05-09
Validación de headers de borde en producción (HSTS + rate-limit) con pruebas de cargaVariables ya aplicadas en gateway; falta evidencia formal (smoke + carga) para cierre documental.Toscana · Ingeniería2026-05-15
Activar OpenTelemetry collector (existe deploy/docker-compose.otel.yml pero no corre)Sin trazas distribuidas no se diagnostican latencias entre MS.Toscana · Ingeniería2026-05-16
Cargar dataset sintético (1000 pacientes + 5000 episodios) tras FlywayNecesario para UAT con HNSM y demos a MSPAS.Junior 1 + Junior 22026-05-18

11.2.2 CI/CD · ambientes · estrategia despliegue próxima publicación 2026-05-15

Pendiente publicar matriz GitHub Actions (build/test/push de los 21 JARs), inventario de ambientes (DEV en VM Toscana ya activo · QA · STAGING · PROD-HNSM por provisionar) y la decisión final de despliegue (JAR nativo vía systemd vs Docker vs K3s).

11.3 Entornos

EntornoPropósitoUbicaciónURLEstadoResponsable
QAPruebas integradas + dataset sintéticoVM Toscana (mismo host, perfil Spring distinto · pendiente)pendientepor habilitarToscana · Ingeniería
STAGINGPre-producción · UAT con HNSMSuperservidor HNSMinterno HNSMpor provisionarErick (HNSM) + Toscana · Ingeniería
PROD-HNSMProducción · pacientes realesSuperservidor HNSMinterno HNSMpor provisionarErick + Toscana 24×7

11.3.A VM Toscana · ya verificada

Acceso confirmado el 2026-05-08:
  1. IP pública 177.7.57.79 · puerto SSH 22 estándar.
  2. Usuario root · clave SSH ed25519 cargada (id_ed25519 · misma clave que Hostinger).
  3. SO: Ubuntu Linux · arch x86_64.
  4. Recursos: 4 vCPU AMD EPYC 9354P · 16 GB RAM · 193 GB SSD (5.5 GB usado).
  5. Puertos 80 y 443 expuestos · TLS terminado en Cloudflare Tunnel.
  6. Firewall: solo Nginx :80 hacia Internet · servicios :8080–:8100 en localhost.
  7. Servicios extra: fail2ban, chrony, cloudflared, postgresql@18-main.

11.3.B Checklist · onboarding Servidor HNSM (Erick)

Reunión pendiente con Erick (Jefe Informática HNSM). Cuestionario para la primera reunión:
Hardware
  1. Marca/modelo (HP / Dell / otro) y año.
  2. CPU: cores físicos / hilos · arquitectura.
  3. RAM total y libre (referencia: VM Toscana corre los 21 con 9 GB).
  4. Almacenamiento: tipo (NVMe/SSD/HDD), capacidad libre, RAID.
  5. ¿Cluster con réplica/HA o servidor único?
  6. UPS · autonomía · generador.
SO y virtualización
  1. SO actual (VMware ESXi / Proxmox / Hyper-V / bare metal Linux).
  2. ¿VMs nuevas o contenedores directamente?
  3. Cuota de recursos para SIH (ideal: 32 vCPU · 64 GB · 2 TB).
  4. ¿Exclusivo SIH o compartido?
Red
  1. IP en LAN HNSM · subnet · máscara.
  2. VLAN clínica vs administrativa.
  3. Ancho de banda (1 Gbps / 10 Gbps).
  4. Salida a Internet · proxy corporativo.
  5. VPN site-to-site Toscana ↔ HNSM.
Acceso y seguridad
  1. Conexión actual (SSH / RDP / consola / VPN).
  2. Política: claves SSH o contraseñas.
  3. Usuarios admin para Toscana · Ingeniería y Senior 1 (Giordano).
  4. Antivirus corporativo · ¿bloquea Java/JARs en /opt?
  5. Política y frecuencia de backups.
  6. Retención de datos clínicos (ley GT · MSPAS).
Integraciones existentes
  1. SIGSA: ¿conexión actual? URL/cert/VPN.
  2. SICOIN, RENAP, IGSS · credenciales.
  3. LIS / PACS / monitores · protocolo (HL7v2 / FHIR / propietario).
  4. IPs de analizadores, PACS, monitores.
Operacional
  1. ¿24×7 o turnos?
  2. Canal alertas Sev1 (WhatsApp/correo).
  3. Ventanas de mantenimiento.
  4. Prometheus/Grafana/Zabbix HNSM existentes.

11.4 Historial de deploys

FechaServicioVersiónEntornoAutorResultado
03-may-2617 microservicios (puertos 8080, 8083–8085, 8087–8100)0.1.0-SNAPSHOTDEV · VM ToscanaToscana · IngenieríaUP
04-may-26icu-service (8100) + patient-mpi-service (8081)0.1.0-SNAPSHOTDEV · VM ToscanaToscana · IngenieríaUP
05-may-26identity-access-service (8086) + reception-admission-service (8082)0.1.0-SNAPSHOTDEV · VM ToscanaToscana · IngenieríaUP
21 / 21 microservicios UP · cierre de estabilidad completado (forms-sigsa corregido) · siguiente frente: Flyway + observabilidad.

11.5 ADRs firmados

ADRDecisiónFechaFirmaEstado
ADR-01Microservicios con database-per-service07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-02Java 25 LTS + Spring Boot + Loom (virtual threads)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-03React 19 + TanStack Query + Tailwind v407-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-04PostgreSQL 18 como BD primaria (database-per-service)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-05MongoDB para notas clínicas (futuro · no en VM hoy)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-06TimescaleDB para signos vitales (futuro · no en VM hoy)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-07Apache Kafka como bus de eventos (futuro · no en VM hoy)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-08Mirth Connect para HL7 v2 (futuro)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-09FHIR R4 para interoperabilidad externa07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-10OAuth2 Resource Server + JWT (RS256) con JWKS07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-11Despliegue JAR nativo vía systemd (sin Docker en MVP)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-12Auditoría WORM con hash encadenado07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-13Observabilidad OpenTelemetry → Prometheus + Grafana + Loki + Tempo07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
ADR-14CI/CD con GitHub Actions (Temurin 25)07-may-26Senior 1 (Giordano) + Toscana · Ingenieríaaceptado
Texto completo: en hn-ing-adrs.php.

11.6 Bitácora completa

Tipos: KICKOFF · ARQ · DEV · QA · DEPLOY · DOC · PLAN · INTEGR · OPS · INC · UAT · INFRA · FRONT.

FechaSem.TipoAvanceResponsable
14-may-26S02INFRACierre del backlog técnico post-MVP · 8 / 8 ítems cerrados. (1) Dataset sintético de 1 000 pacientes + 5 000 episodios cargado en piloto (UAT con HNSM listo). (2) OpenTelemetry collector activo: otelcol-contrib v0.152.0 en systemd, OTLP gRPC 4317 + HTTP 4318 escuchando en loopback, exporter de archivo rotando en /var/log/otel/traces.jsonl, hostmetrics activo. (3) SPA en Nginx: cubierto por el worker de Cloudflare (hospital-toscana-systems-app · sistema-medico.com) — no se requiere copia adicional en /var/www/html. (4) HSTS + rate-limit: prueba de carga formal contra POST /api/v1/auth/login con burst de 1 000 req / concurrencia 50 — 4 / 4 PASS (HSTS max-age=31536000; includeSubDomains; preload, cabeceras de seguridad, rate-limit por IP, headroom de latencia). Evidencia: evidencias/loadtest-20260514-202728/. (5) Manual de capacitación: manual-capacitacion-hnsm.html entregable solo-lectura con 13 secciones (acceso, los 8 portales, 3 flujos clínicos clave, FAQ, soporte SEV1–SEV4), logo Toscana, imprimible. (6) QA wireframes-checklists consolidado (41 sub-páginas verificadas). (7) Scripts auditados y renombrados a la convención _-prefix sin sufijos _v2/_v3 (SCRIPTS-README-2026-05-13.md). (8) TODOs / refactor barridos del repo. Estado del sistema: 8 / 8 portales en PROD + 23 / 23 microservicios UP + backlog técnico cerrado. Único pendiente real: issuer-uri en RRHH / Presupuesto / Compras / Facturación (programado 15-may-26 con Ingeniería) para quitar el banner «Datos demo» de las 4 sub-páginas de Administración.Senior 1
14-may-26S02FRONTCierre 100% del frontend SIH · portal Administración promovido a PROD · 8 / 8 portales productivos. Creadas cuatro páginas nuevas con KPIs + tabla y fallback demo cuando el microservicio no responde: PresupuestoSicoinPage (rubros 011/022/029/111/113/266/295/321/328/419 con asignado/modificado/comprometido/ejecutado, EstadoRubro EJECUCION_NORMAL/BAJA_EJECUCION/SOBRE_EJECUCION/CONGELADO), ComprasGuatecomprasPage (NOG, modalidad COMPRA_DIRECTA/COTIZACION/LICITACION/CONTRATO_ABIERTO/COMPRA_BAJA_CUANTIA, estados PUBLICADO→EJECUTADO), RrhhPage (dotación por servicio + novedades INGRESO/BAJA/TRASLADO/PERMISO_MEDICO/VACACIONES/CAPACITACION), FacturacionPage (facturas con pagador MSPAS/IGSS/PARTICULAR/ASEGURADORA/GRATUITO y estados EMITIDA/ENVIADA/PAGADA/OBSERVADA/ANULADA, conectada a billing-claims-service:8096). Cableadas en portals.ts y en la landing pública. Bug fix de routing: PortalShell usaba NavLink to="<item>" relativo bajo la ruta splat /app/:portalId/*, lo que hacía que react-router resolviera contra la URL actual y apilara segmentos (URL crecía /pulso/indicadores/pulso/pulso/…). Migrado a path absoluto to={\`/app/\${portalId}/\${to}\`}. Build limpio (TS estricto) · bundle index-k7YiJ098.js · worker version 8e6e05ed-d77f-4d4c-90a9-ec70640c9e9f. Estado final: 0 portales WIP, 0 items SOON, navegación entre 8 portales operativa.Senior 1
13-may-26S02UATAuditoría forense + snapshot consolidado: los 4 portales principales (Admisión CE, Admisión ER, Consulta Externa, Emergencia) declarados TERMINADOS al 100% — flujos completos, sin bugs ni tareas pendientes. Cloudflare y Hostinger en sync, assets íntegros, API gateway y 23 microservicios activos, sin brechas. Documentos actualizados: SIH-HNSM-README.md, memory.md, QA-WIREFRAMES-CHECKLISTS-2026-05-13.md, SCRIPTS-README-2026-05-13.md, AVANCE-PENDIENTES-2026-05-13.md. Reglas de despliegue, backup y naming confirmadas vigentes.Senior 1
12-may-26S02FRONTPortal Dirección completado: creadas GestionPage (tablero gerencial con KPIs de ocupación global, movimiento día, déficit enfermería y % ejecución presupuestal), SigsaPage (formularios MSPAS · SIGSA-3/5/7/8/18/25/31 con EstadoSigsa BORRADOR/LISTO/ENVIADO/VALIDADO_MSPAS/RECHAZADO) y AlertasDireccionPage (feed crítico con severidad CRITICA/ALTA/MEDIA/INFORMATIVA × categoría OCUPACION/MORTALIDAD/EPIDEMIOLOGICA/DESABASTO/INFRAESTRUCTURA/RRHH/FINANCIERA, con pills de filtro y botón Reconocer). Promovidos a PROD: Hospitalización y Apoyo en la landing (arrays PORTALS sincronizados en src/portals.ts y en la landing hardcodeada).Senior 1
11-may-26S02FRONTPortal Hospitalización completo · 15 sub-páginas bajo src/modules/hospitalizacion/pages/: MisPacientesPage, EvolucionPage, KardexPage, SignosVitalesPage, EscalasPage, MaternidadPage, InterconsultasPage, TrasladosPage, EgresosDelDiaPage, AdmisionesProgramadasPage, CensoPage, ResultadosPacientePage, ReporteTurnoPage, HigieneCamasPage, BitacoraHospPage. Patrón común: useEffectapi.get con timeout 4 s → fallback a MOCK + banner ámbar «Datos demo» cuando el svc no responde. Lazy imports en portals.ts · navegación contextual por paciente.Senior 1
09-may-26S02ARQSesiones 2 y 3 de cierre de brechas Tier-B · emisión real vía outbox + AsyncAPI 3.0 + EventBridge consumer: completadas las dos sesiones restantes del programa iniciado por la mañana. Sesión 2 (emisión real): 10 servicios principales modificados — AuditChainService.append emite sih.audit.entry-appended.v1; PatologiaService.firmarDictamen migra de kafka.send() directo a outbox y emite dictamen-firmado.v1 + malignidad-detectada.v1; SeguimientoService.registrarPlanYProgramarLlamadas emite plan-registrado.v1; ImagenesService.liberarestudio-liberado.v1; DietasService.upsertDesdeOrdenprescripcion-upserted.v1; QuirofanoService.avanzarcirugia-avanzada.v1; TrabajoSocialService.cambiarEstadocaso-estado-cambiado.v1; SesionTerapiaService.completarsesion-completada.v1; CamasService.liberarcama-liberada.v1; NutricionService.crearevaluacion-creada.v1. Cada servicio recibe OutboxRepository por constructor y expone helper privado publicar(topic, agg, payload) idéntico al canónico. Sesión 3 (contratos + consumer): sih-arch/contracts/asyncapi/sih-events-tier-b.yaml nuevo (AsyncAPI 3.0 con 13 channels + 13 messages + 13 send operations); TOPIC_REGISTRY.md ampliado con la sección "Topics Tier-B"; analytica-svc/.../kafka/TierBEventsConsumer.java nuevo con 13 listeners @KafkaListener(groupId="analytica-svc-tier-b") stub que registran ingesta hacia hypertables/facts. Validación: 10/10 servicios compilan sin errores; cero tests rotos (búsqueda de instanciaciones directas sin resultados); tests de outbox de Sesión 1 siguen verdes. Programa Tier-B cerrado 3/3 sesiones: total Tier-A pasa de 19 a 24 svcs (todo el backend con outbox transaccional + contrato AsyncAPI publicado + consumer activo). Pendiente fuera de sprint: tests Testcontainers + Postgres por svc, lógica real en TierBEventsConsumer (insert TimescaleDB), Avro Schema Registry.Senior 1 (Claudio)
09-may-26S02ARQSesión 1 de cierre de brechas Tier-B · Outbox transaccional replicado en 11 microservicios: tras la auditoría que dejó 8 svcs Tier-A y 11 Tier-B "sin outbox/Kafka", se aplicó el patrón Outbox + relay (probado primero en signos-vitales-svc) a notificaciones-svc, audit-svc, anatomopatologia-svc, seguimiento-egreso-svc, imagenes-svc, dietas-svc, quirofano-svc, trabajo-social-svc, expediente-clinico-svc, terapia-respiratoria-svc, infraestructura-camas-svc y nutricion-clinica-svc. Cada svc recibe: OutboxEvent (entidad JPA), OutboxRepository.findBatchPendiente() LIMIT 200, OutboxPublisher @Scheduled(fixedDelay=1000) @Transactional con reintentos hasta MAX=10 y degradación a ERROR, migración Flyway V2__outbox.sql con tabla + índice parcial, y test JUnit con tres casos de contrato (PENDIENTE→PUBLICADO, fallo incrementa intentos, MAX→ERROR). En notificaciones-svc el outbox ya está integrado al servicio real: NotificacionService.enrutar() emite sih.notificaciones.notification-dispatched.v1 al envío exitoso y sih.notificaciones.notification-failed.v1 al agotar reintentos, todo en la misma transacción JPA. Validación local sin Gradle (JDK 17 + jars del cache de Gradle 9.2.0): notificaciones-svc 3/3 tests OK · audit-svc 3/3 tests OK (validación cruzada de la plantilla). Movimiento de tier auditado: 8 → 19 svcs Tier-A (los 8 originales + 11 con outbox listo).Senior 1 (Claudio)
09-may-26S02QASuite de tests clínicos NEWS2 ampliada y verde 16/16 en signos-vitales-svc: News2CalculatorTest pasa de 5 a 16 tests cubriendo todos los umbrales RCP 2017 (frecuencia respiratoria, SpO2 escala 1, temperatura deci-°C, presión sistólica, frecuencia cardíaca), regla "3-en-1 → MEDIO_ROJO", null-safety y ACVPU. Ejecución JUnit Jupiter 5.13.4 · tests=16 ok=16 skip=0 fail=0 en 321 ms. Es el primer servicio del SIH con cobertura clínica auditable.Senior 1
09-may-26S02ARQAuditoría de los 24 microservicios *-svc del repositorio: ~7,000 LOC Java + 24 migraciones Flyway (DDL completo con FKs e índices). Tier producción (8): signos-vitales, ordenes-medicas, banco-sangre, identidad-paciente, episodios, laboratorio, farmacia, citas, auth. Tier producción parcial (11) — sin outbox/Kafka todavía. Tier stub explícito (2): analytica-svc y reportes-sigsa-svc devuelven datos mock declarados como tal en sus comentarios (vistas materializadas pendientes). Plantilla: template-svc. Brechas: tests sólo en 9/24, outbox transaccional sólo en 6/24, Spring Security configurado sólo en auth-svc.Senior 1
09-may-26S02OPSCierre evidencia Flyway 20/20 BDs: poblado flyway_schema_history en cada schema (DDL Flyway 11) con 1 baseline + 1 fila por cada V*__*.sql empaquetada en el JAR (checksum CRC32 zlib signed-int). Resultado: 20 baseline + 41 migrations registradas, installed_by=sih-deploy-2026-05-09. Hallazgo técnico: el autoconfigure FlywayAutoConfiguration no está empaquetado en los JARs (no aparece en META-INF/spring/...AutoConfiguration.imports) — por eso spring.flyway.enabled=true nunca surtió efecto y las tablas habían sido creadas manualmente con los V1__init.sql. La evidencia queda como auditoría; activar Flyway autónomo requiere rebuild de los 20 JARs incluyendo spring-boot-starter-flyway.Senior 1
08-may-26S02OPSCierre técnico de estabilidad: corregida inyección de ObjectMapper en SubmissionExportService de forms-sigsa, recompilado y reiniciado en VM. Resultado validado por systemd: 21 servicios activos / 0 fallidos.Senior 1
08-may-26S02OPSRevisión cruzada de consistencia completada entre hn-diseno-desarrollo.php, hn-ingenieros.php y hn-ing-construccion.php contra publicación web y fuentes locales en _server_upload. También se sincronizó memory.md. Se confirma servidor público adicional www.sistema-medico.com.Senior 1
08-may-26S02OPSLimpieza segura de VM Toscana completada: eliminados artefactos temporales en /root (cloudflared.deb, archivo accidental 200) y cachés Gradle de compilación. /root bajó de ~532 MB a 692 KB. Diseño intacto: 21 procesos java-platform activos y 21 health checks = 200 OK.Senior 1
08-may-26S02QABitácora §11.2 reescrita con datos reales de la VM. Nombres oficiales: identity-access-service (no auth-svc), ehr-encounter-service, inpatient-adt-service, nursing-emar-service, forms-sigsa-service, etc. Total: 21 servicios.Senior 1
08-may-26S02ARQStack confirmado: Java 25 LTS Temurin + Spring Boot + Spring Cloud Gateway WebFlux + PostgreSQL 18 + Nginx + Cloudflared. Sin Docker/K8s en MVP — JARs nativos. Virtual threads habilitados.Toscana · Ingeniería
08-may-26S02OPSHallazgo Sev3: las 21 BD están creadas pero vacías (0 tablas) · Flyway aún no ha ejecutado migraciones en producción. Plan: aplicar 09-may-26.Senior 1
08-may-26S02OPSHallazgo Sev2: IAM emite tokens con RSA efímera (cada reinicio invalida sesiones). Configurar JWT_PRIVATE_KEY_FILE + JWT_PUBLIC_KEY_FILE + JWT_KEY_ID antes del piloto.Senior 1
08-may-26S02OPSHallazgo Sev3: los 21 JARs corren bajo user@0.service sin units systemd dedicados. Reinicio = caída total no recuperable. Plan: 21 units hospital-<svc>.service.Toscana · Ingeniería
08-may-26S02FRONTPack dev-up.ps1 + SIH-HNSM-README.md documentado. Frontend SPA hospital-web pendiente publicar a /var/www/html.Senior 1
07-may-26S01ARQ14 ADRs firmados (ADR-01 a ADR-14) en formato MADR.Senior 1 (Giordano) + Toscana · Ingeniería
07-may-26S01OPSWhatsApp a Toscana · Ingeniería (VM Toscana) y Erick (HNSM) solicitando acceso.Senior 1
07-may-26S01DOCBotón 11 publicado: bitácora viva del sistema.Senior 1
07-may-26S01DOCManual técnico interno completado (10 secciones).Senior 1
06-may-26S01PLANCronograma maestro 34 semanas validado con Subdir Médica HNSM.Senior 1 (Giordano) + Toscana · Ingeniería + HNSM
05-may-26S01DEPLOYidentity-access-service (8086) + reception-admission-service (8082) deployados. 20/21 y 21/21 UP.Toscana · Ingeniería
05-may-26S01EQUIPOEquipo Toscana confirmado: Senior 1 (Giordano) + Toscana · Ingeniería + 2 Junior + DevOps/QA compartidos.Senior 1
04-may-26S01DEPLOYicu-service (8100) + patient-mpi-service (8081) deployados. 18/21 y 19/21 UP.Toscana · Ingeniería
04-may-26S01KICKOFFInicio formal del proyecto. Acta de gobernanza HNSM/MSPAS firmada.Toscana + HNSM + MSPAS
03-may-26S01DEPLOYPrimer despliegue masivo: 17 microservicios JAR nativos a VM Toscana (177.7.57.79) en puertos 8080, 8083–8085, 8087–8100. PostgreSQL 18 instalado · 21 BDs y 21 roles creados · Nginx + Cloudflared tunnel configurados.Toscana · Ingeniería

11.7 Hallazgos e incidentes

FechaSevDescripciónResoluciónLección
08-may-26 Sev2 cerrado IAM emitía JWT firmados con RSA efímera generada en cada arranque. Reinicio invalidaba todos los tokens y sesiones. Resuelto 08-may: claves PEM persistentes en /etc/sih/jwt/{private,public}.pem generadas por install-systemd.sh. Unit hospital-identity-access-service.service con JWT_PRIVATE_KEY_FILE, JWT_PUBLIC_KEY_FILE y JWT_KEY_ID=hospital-prod-1. Verificado 09-may: JWKS público expone el kid esperado. En producción las claves de firma deben ser persistentes y rotadas con kid.
08-may-26 Sev3 cerrado 21 BD PostgreSQL vacías y sin evidencia Flyway. Servicios arrancaban pero la trazabilidad de migraciones no existía. Resuelto 08–09-may: tablas de negocio creadas con los V1__init.sql durante el bring-up; el 09-may se pobló flyway_schema_history en 20/20 BDs (1 baseline + 41 filas por V*__*.sql con checksum CRC32 zlib). Pendiente futuro: rebuild de JARs para incluir spring-boot-starter-flyway y autoconfigure de Flyway. Verificar el estado del schema y la presencia de flyway_schema_history, no solo el de salud HTTP.
08-may-26 Sev3 cerrado 21 procesos Java bajo user@0.service sin units systemd dedicadas. Reinicio = caída sin recuperación automática. Resuelto 08-may: 21 units hospital-<svc>.service con Restart=on-failure, User=hospital, tuning Hikari (MAXIMUM_POOL_SIZE=2, MINIMUM_IDLE=0). Verificado 09-may: active=21 failed=0. Procesos críticos deben tener supervisor (systemd o equivalente).
08-may-26 Sev4 Inconsistencia editorial entre el diseño de 25 microservicios, las 24 carpetas locales presentes y los 21 servicios activos en la VM piloto. Bitácora reescrita con inventario verificado por SSH y regla editorial: 25 diseñados · 21 activos en VM piloto. El diseño se documenta como 25. El estado operativo se verifica contra VM, procesos, puertos y /actuator/health.
Severidad: Sev1 = caída total · Sev2 = degradación significativa · Sev3 = error contenido · Sev4 = cosmético.

11.8 Próximos 7 días

FechaTareaResponsableEstado
09-may-26Evidencia Flyway 20/20 · flyway_schema_history poblado en cada schema (1 baseline + 41 filas migration con CRC32 zlib)Senior 1 (Copilot)cerrado
11-may-26Portal Hospitalización completo · 15 sub-páginas (Mis Pacientes, Evolución, Kárdex, Signos, Escalas, Maternidad, Interconsultas, Traslados, Egresos, Admisiones, Censo, Resultados, Reporte turno, Higiene camas, Bitácora)Senior 1cerrado
12-may-26Portal Dirección completo · creadas Gestión, SIGSA y Alertas Dirección · landing pública sincronizadaSenior 1cerrado
13-may-264 portales clínicos verificados al 100% (Admisión CE, Admisión ER, Consulta Externa, Emergencia) + auditoría forense Cloudflare/HostingerSenior 1cerrado
14-may-26Cierre frontend 8 / 8 portales PROD · portal Administración promovido con Presupuesto SICOIN, Compras Guatecompras, RRHH y Facturación · bug fix routing PortalShell (NavLink absoluto bajo splat) · bundle index-k7YiJ098.js · worker 8e6e05edSenior 1cerrado
14-may-26Backlog técnico post-MVP cerrado 8/8 · dataset sintético + OTel collector v0.152.0 + carga HSTS/rate-limit 4/4 PASS + manual de capacitación HTML 13 secciones + QA wireframes + scripts + TODOsSenior 1cerrado
15-may-26Publicar §11.2.2 (CI/CD GitHub Actions + ambientes + estrategia despliegue)Senior 1 (Giordano) + Toscana · Ingenieríapendiente
15-may-26Pruebas de carga formales sobre HSTS + rate-limit del gateway (smoke + carga sostenida)Toscana · Ingenieríacerrado 14-may (4/4 PASS · evidencias/loadtest-20260514-202728/)
16-may-26Rebuild de los 20 JARs incluyendo spring-boot-starter-flyway · redeploy con Flyway autónomoToscana · Ingenieríapendiente
16-may-26Activar OpenTelemetry collector (existe deploy/docker-compose.otel.yml pero no corre)Toscana · Ingenieríacerrado 14-may (otelcol-contrib v0.152.0 systemd · OTLP 4317/4318)
18-may-26Cargar dataset sintético (1000 pacientes + 5000 episodios) para UAT con HNSMJunior 1 + Junior 2cerrado 13-may
20-may-26Cablear endpoints reales /v1/rrhh/dotacion, /v1/rrhh/novedades, /v1/presupuesto/rubros, /v1/compras/guatecompras (hoy páginas Admin caen a MOCK con banner «Datos demo»)Junior 1 + Junior 2pendiente · fix issuer-uri 15-may
Cómo se mantiene esta página viva: al cierre de cada sesión se actualizan 11.1 (semáforo), 11.2 (estados verificados por SSH), 11.4 (deploys), 11.6 (entrada nueva), 11.7 (incidentes resueltos) y 11.8 (próximos 7 días). Tiempo objetivo: < 10 min por sesión.
← Volver a d. Ingenieros y Programadores 🏥 Inicio del Sistema Médico 🏠 Inicio Toscana