{"que_es":"Datos del medidor de trabajo clínico: cuánto trabajo operativo cuesta la atención en el PC de cada consultorio (tiempo activo, tiempo en el sistema clínico SAP, escritura, clics, pantallas recorridas, esperas del sistema, trabajo posterior a la atención), medido de forma continua y agregado por jornada (consultorio × día operativo) y por paciente, en tres fases del estudio con el mismo instrumento: baseline (sin Miracle), notes (con Miracle Notes) y notes_ops (Notes + Operations).","privacidad":"No hay contenido clínico ni texto tecleado en ningún campo. Los pacientes aparecen solo como encounter_key: una huella HMAC irreversible calculada en el PC (misma persona = misma huella dentro del mismo día operativo; entre días no se puede enlazar). Las pantallas SAP son identidades técnicas (sistema/transacción/programa/dynpro), nunca títulos ni valores. Del tecleo solo hay cantidades y tiempo en ráfagas. El único dato de persona es el login de SAP (sap_user), que identifica al médico, no al paciente.","unidades":"Todos los tiempos terminan en _ms y están en milisegundos (60000 = 1 minuto). Los instantes (_at) son ISO 8601 en UTC. dia_operativo es la fecha del día operativo del hospital (corte a las 06:00 hora de Bogotá): una guardia nocturna que cruza medianoche pertenece al día en que empezó.","como_comparar":"La unidad de análisis es el CONSULTORIO y su JORNADA (un consultorio, un día operativo). Compara fases usando solo jornadas con calidad_ok = true (sin datos descartados, reloj estable, cobertura >= 80 %). Usa medianas por jornada, no promedios. Para comparaciones pareadas agrupa por consultorio_id y phase. El médico es una anotación derivada del login SAP visto (sap_users / medico_id), útil para explicar una jornada, no para agrupar el estudio.","definiciones":{"jornada":"Todo lo que un consultorio hizo en un día operativo (corte 06:00 Bogotá). El medidor graba de forma continua: no hay turnos que abrir ni cerrar.","estados":"Cada cubeta de 15 s del día está en uno de cuatro estados: activo (hubo clic, tecla o scroll en los últimos 60 s), inactivo (PC encendido y desbloqueado sin nadie tocándolo), bloqueado (sesión de Windows bloqueada) o sin_datos (no llegó cubeta: PC apagado, suspendido o medidor caído).","activo":"Tiempo en primer plano con algún clic, tecla o scroll en los últimos 60 segundos. foreground_ms es el tiempo en primer plano sin exigir input.","his_ms":"Tiempo activo con SAP (el sistema clínico) en primer plano.","tramo":"Isla de actividad: cubetas activas separadas por menos de 15 minutos sin actividad. tramos_ms es la suma de las islas; las horas «en tramos» son el denominador de pacientes_por_hora.","post_atencion_ms":"Tiempo activo atribuido a un paciente DESPUÉS de que se abrió otro paciente distinto: lo que se hace sobre A cuando ya se está con B (documentación posterior a la atención).","ready_ms":"Time-to-ready: desde que se llega a una pantalla SAP hasta el primer fin de round-trip con el servidor sin estar ocupado. Nulo (no cero) si nunca llegó.","sap_wait_ms":"Suma de round-trips al servidor SAP (StartRequest → EndRequest) durante la visita o la jornada: tiempo esperando al sistema.","cobertura_pct":"Porcentaje de la ventana de actividad (de la primera a la última cubeta activa del día) que llegó medido. Cada cubeta cubre su bucket_ms, o la suma de sus foreground_ms si es mayor (un tramo fundido cuyo ancho se guardó recortado). Baja de verdad cuando el PC se apaga o suspende o el medidor muere en medio del día. sin_datos_ms son esos huecos, en milisegundos.","calidad_ok":"true si la jornada es comparable: spool_dropped = 0 (nada descartado en el PC), clock_jumps <= 2 (reloj estable) y cobertura_pct >= 80. calidad_motivos lista por qué no lo es (spool_dropped, clock_jumps, cobertura, sin_actividad).","encounter_key":"Huella HMAC-SHA256 (32 hex) del identificador del paciente, calculada en el PC con una clave que cambia cada día operativo. Irreversible. Nula si la pantalla no mostró paciente.","sap_user":"Login de SAP visto en la cubeta (el del médico, no del paciente). Con el roster se traduce a un nombre (medico_id, medico).","teclas_de_control":"Del teclado solo se distinguen seis teclas: Tab, Enter, borrar (Backspace/Supr → correcciones), copiar (Ctrl+C/Ctrl+Ins), pegar (Ctrl+V/Mayús+Ins) y guardar (Ctrl+S). Cualquier otra tecla cuenta solo como «una tecla».","interrupciones":"Veces que se vuelve a un paciente que ya se había abierto antes en la jornada (el A→B→A de urgencias).","revisitas_sap":"Veces que se vuelve a una pantalla SAP ya visitada con el mismo paciente: navegación de ida y vuelta.","consulta_ms":"Duración de una consulta en reloj de pared: del primer al último instante con actividad sobre ese paciente (incluye interrupciones).","entre_consultas_ms":"Del último instante con actividad de un paciente al primero del siguiente: cuánto tarda el médico en quedar disponible para el próximo (aproximación al «time to administrative readiness»; el momento físico en que el paciente se va no es observable).","carga_admin_pct":"Porcentaje del tiempo activo de la jornada que fue en SAP (el sistema clínico).","surface":"Identidad técnica de la pantalla: sapgui://SISTEMA/TRANSACCION/PROGRAMA/DYNPRO[/subpantalla] para SAP, web://dominio para webs de la lista permitida, o nulo.","app":"Aplicación en primer plano normalizada según la config: sap, miracle_web, chrome, edge, firefox, office, uexe, explorador, otro. Más 'bloqueado', que no es una app: es el estado del PC.","procesos":"Cuántas veces arrancó el medidor ese día en ese PC (1 = nunca se cayó). Los contadores de calidad se suman entre procesos.","pre_atencion_ms":"Tiempo activo del día ANTES de abrir al primer paciente: el arranque (encender, entrar a SAP, revisar).","cola_post_jornada_ms":"Tiempo activo en SAP DESPUÉS de abrir al último paciente del día: la cola de documentación al final.","encuentro":"Un paciente en una jornada (una consulta): desde su primer toque hasta el fin de su última cubeta, con todo lo que costó (activo, SAP, tecleo, clics, pantallas, interrupciones, post-atención)."},"colecciones":{"jornadas":{"descripcion":"Una fila por consultorio (PC) y día operativo con todas las métricas agregadas (tabla jornada_summary). Es la tabla principal para análisis.","campos":{"device_id":"Id del PC (uuid).","pc":"Nombre del PC (machine_name).","consultorio_id":"Id del consultorio (uuid) o nulo si el PC no estaba asignado ese día.","consultorio":"Nombre del consultorio.","dia_operativo":"Día operativo (YYYY-MM-DD, corte 06:00 Bogotá).","phase":"Fase del estudio: baseline | notes | notes_ops (derivada del calendario por fecha).","primera_actividad":"Primera cubeta activa del día (ISO UTC).","ultima_actividad":"Fin de la última cubeta activa (ISO UTC).","ventana_ms":"ultima_actividad − primera_actividad.","foreground_ms":"Tiempo medido en primer plano (sin exigir input).","activo_ms":"Tiempo activo total.","his_ms":"Tiempo activo en SAP.","miracle_ms":"Tiempo activo en Miracle (app miracle_web).","typing_ms":"Tiempo escribiendo, medido por ráfagas de tecleo.","keystrokes":"Teclas pulsadas (nunca cuáles).","clicks":"Clics izquierdos.","scroll_ticks":"Muescas de rueda.","context_switches":"Cambios de app, pantalla o paciente.","tabs":"Tab.","enters":"Enter.","correcciones":"Backspace + Supr.","copias":"Copiar.","pegados":"Pegar.","guardados":"Ctrl+S.","pacientes":"Pacientes distintos identificados en SAP.","consulta_ms_mediana":"Mediana de la duración de consulta (ver definiciones.consulta_ms).","activo_por_paciente_mediana":"Mediana del tiempo activo por paciente.","entre_consultas_ms_mediana":"Mediana del tiempo entre consultas.","post_atencion_ms":"Ver definiciones.post_atencion_ms.","interrupciones":"Ver definiciones.interrupciones.","pacientes_por_hora":"Pacientes distintos por hora en tramos de actividad.","visitas":"Visitas a pantallas SAP (una visita = una estadía).","pantallas_distintas":"Pantallas SAP distintas visitadas.","revisitas_sap":"Ver definiciones.revisitas_sap.","sap_wait_ms":"Suma de esperas al servidor SAP.","sap_roundtrips":"Round-trips al servidor SAP.","ready_ms_p50":"Mediana del time-to-ready de las pantallas SAP (nulo si no hubo).","ready_ms_p95":"Percentil 95 del time-to-ready.","bloqueado_ms":"Tiempo con la sesión bloqueada.","inactivo_ms":"Tiempo encendido y desbloqueado sin input.","sin_datos_ms":"Huecos sin cubetas (> 30 s) entre la primera y la última cubeta del día.","cobertura_pct":"Ver definiciones.cobertura_pct.","carga_admin_pct":"Ver definiciones.carga_admin_pct.","tramos":"Islas de actividad.","tramos_ms":"Suma de las islas de actividad.","pre_atencion_ms":"Ver definiciones.pre_atencion_ms.","cola_post_jornada_ms":"Ver definiciones.cola_post_jornada_ms.","consulta_ms_p25":"Percentil 25 de la duración de consulta.","consulta_ms_p75":"Percentil 75 de la duración de consulta.","por_app":"Objeto {app: {activo_ms, foreground_ms, typing_ms, keystrokes, clicks}}: cuánto se trabajó, tecleó y clicó en cada app.","por_hora":"Objeto {\"07\": ms activos, \"08\": …} por hora de Bogotá: el perfil del día.","procesos":"Arranques del medidor ese día.","app_version":"Versión del medidor.","activo_por_app":"Objeto {app: ms activos}.","sap_users":"Objeto {login SAP: ms activos}.","calidad":"Objeto con los contadores del instrumento: cobertura_pct, sin_datos_ms, huecos_ms, clock_jumps, spool_dropped, hooks_degradados, hooks_rearmados, ticks_sap_saltados_busy, sap_scripting, sap_eventos_com, procesos.","calidad_ok":"Ver definiciones.calidad_ok.","calidad_motivos":"Lista de motivos por los que la jornada no es comparable (vacía si lo es).","por_hora_detalle":"De qué está hecha cada hora de Bogotá: {\"07\": {sap, otras, inactivo, bloqueado}} en ms. sap y otras se miden con input real (como activo_ms); inactivo y bloqueado con el tiempo que cubre la cubeta. La suma de sap por horas es exactamente his_ms, y sap+otras exactamente activo_ms; no suman 60 min por hora porque el resto de una cubeta activa no se atribuye a nadie, igual que en los totales del día.","algo_version":"Versión del algoritmo de resumen (4 = con el perfil horario detallado).","resumido_en":"Cuándo se calculó esta fila."}},"pacientes":{"descripcion":"Una fila por paciente y jornada (tabla encuentros): lo que costó cada consulta. Se regenera con el resumen de la jornada.","campos":{"device_id":"PC.","consultorio_id":"Consultorio o nulo.","consultorio":"Nombre del consultorio.","dia_operativo":"Día operativo.","phase":"Fase de la jornada.","orden":"P1, P2… por primera aparición en el día (el mismo número que la línea de tiempo).","encounter_key":"Huella del paciente (irreversible, solo dentro del día).","sap_user":"Login SAP con más actividad sobre este paciente.","medico_id":"Médico del roster para ese login, o nulo.","medico":"Nombre, o nulo.","primera_vez":"Primer toque (ISO UTC).","ultima_vez":"Fin de la última cubeta con este paciente (ISO UTC).","consulta_ms":"ultima_vez − primera_vez (reloj de pared, incluye interrupciones).","activo_ms":"Activo sobre este paciente.","his_ms":"Activo en SAP sobre este paciente.","miracle_ms":"Activo en Miracle sobre este paciente.","typing_ms":"Ms escribiendo.","keystrokes":"Teclas.","clicks":"Clics.","tabs":"Tab.","enters":"Enter.","correcciones":"Backspace + Supr.","copias":"Copiar.","pegados":"Pegar.","guardados":"Ctrl+S.","tramos":"Rachas de atención: 1 = sin interrupción; A→B→A da 2 para A.","post_atencion_ms":"Activo sobre este paciente después de abrir otro posterior.","siguiente_ms":"Del último toque de este paciente al primero del siguiente distinto; nulo si fue el último del día.","visitas":"Estadías en pantallas SAP con este paciente.","pantallas_distintas":"Pantallas SAP distintas.","sap_wait_ms":"Espera al servidor SAP.","ready_ms_p50":"Mediana del time-to-ready de sus pantallas (nulo si no hubo)."}},"muestras":{"descripcion":"La serie temporal cruda: una fila por cubeta de 15 segundos y contexto (app · pantalla · paciente · usuario SAP). Es lo que suma a las jornadas. Grande: ~5.800 filas por PC y día.","campos":{"device_id":"PC.","consultorio_id":"Consultorio o nulo.","dia_operativo":"Día operativo.","phase":"Fase de la jornada.","bucket_start":"Inicio de la cubeta de 15 s (ISO UTC, alineada al reloj de pared).","bucket_ms":"Lo que cubre esta fila en milisegundos. Normalmente 15000 (una cubeta). En los tramos donde no pasa nada —PC bloqueado, o encendido sin nadie— el medidor funde las cubetas seguidas en UNA fila que cubre todo el tramo (hasta 5 min), así una noche son unas pocas filas y no miles. El tiempo cubierto es exactamente el mismo.","seq":"Índice del segmento dentro de la cubeta cuando cambió el contexto a mitad (0, 1, 2…). Los segmentos se reparten los 15 s en proporción a su foreground_ms.","app":"Aplicación normalizada, o 'bloqueado'.","surface":"Pantalla (ver definiciones.surface).","encounter_key":"Huella del paciente o nulo.","sap_user":"Login SAP visto o nulo.","medico_id":"Médico del roster para ese login, o nulo.","medico":"Nombre del médico, o nulo.","foreground_ms":"Ms en primer plano.","active_ms":"Ms activos.","typing_ms":"Ms escribiendo.","keystrokes":"Teclas.","clicks":"Clics.","scroll_ticks":"Scroll.","context_switches":"Cambios de contexto en la cubeta.","sap_roundtrips":"Round-trips al servidor SAP en la cubeta.","sap_wait_ms":"Espera al servidor SAP en la cubeta (ms).","tabs":"Tab.","enters":"Enter.","correcciones":"Backspace + Supr.","copias":"Copiar.","pegados":"Pegar.","guardados":"Ctrl+S."}},"visitas_sap":{"descripcion":"Una fila por estadía en una pantalla SAP: el recorrido por el sistema clínico, en orden.","campos":{"device_id":"PC.","consultorio_id":"Consultorio o nulo.","dia_operativo":"Día operativo.","phase":"Fase.","encounter_key":"Paciente (huella) vigente al salir de la pantalla, o nulo.","sap_user":"Login SAP.","medico_id":"Médico del roster para ese login, o nulo.","sid":"Sistema SAP (p. ej. PRD).","tcode":"Transacción (p. ej. NV2000, NWP1).","dynpro":"Número de pantalla (4 dígitos).","surface":"Identidad completa de la pantalla.","entered_at":"Llegada (ISO UTC).","left_at":"Salida (ISO UTC).","dwell_ms":"Duración de la estadía.","ready_ms":"Time-to-ready (nulo si nunca llegó).","sap_wait_ms":"Espera al servidor durante la estadía.","roundtrips":"Round-trips durante la estadía.","exit_to":"Transacción a la que se fue después, o nulo si salió de SAP."}},"eventos":{"descripcion":"Eventos discretos: arranques y caídas del medidor, bloqueos, suspensiones, pacientes abiertos/cerrados, calidad, asignación de consultorio.","campos":{"device_id":"PC.","consultorio_id":"Consultorio o nulo.","dia_operativo":"Día operativo.","occurred_at":"Instante (ISO UTC).","kind":"Tipo: jornada_inicio, jornada_fin, encounter_enter, encounter_exit, encounter_unknown, lock, unlock, suspend, resume, medidor_start, medidor_stop, sap_attach, sap_detach, sap_user_seen, sap_scripting_no_disponible, clock_jump, spool_drop, spool_reset, hooks_degradados, hooks_rearmados, config_applied, consultorio_asignado, ops_run, calidad.","encounter_key":"Paciente (huella) si aplica.","detail":"Objeto con claves de una lista cerrada (reason, ms, count, user, rule, version…). Nunca texto libre."}},"consultorios":{"descripcion":"Los consultorios: la unidad del estudio.","campos":{"id":"uuid.","nombre":"Nombre.","orden":"Orden en el panel.","activo":"Si sigue en uso."}},"medicos":{"descripcion":"El roster: nombres para los logins SAP (anotación opcional).","campos":{"id":"uuid.","display_name":"Nombre.","sap_users":"Logins SAP asociados.","active":"Si está vigente."}},"dispositivos":{"descripcion":"Los PCs con el medidor.","campos":{"id":"uuid.","machine_name":"Nombre del PC.","consultorio_id":"Consultorio asignado.","consultorio":"Nombre del consultorio.","status":"active | paused | retired.","app_version":"Versión del medidor.","registered_at":"Registro.","last_seen_at":"Último latido."}},"fases":{"descripcion":"Calendario del estudio.","campos":{"phase":"baseline | notes | notes_ops.","starts_on":"Desde (fecha).","ends_on":"Hasta (fecha) o nulo."}}}}