Una sola lectura no dice prácticamente nada.
Tu frecuencia cardíaca en este momento es un dato sin referencia. ¿Es alta? ¿En comparación con qué? Con una media poblacional calculada a partir de personas que no eres tú, en condiciones que no son las tuyas, a una hora del día que no es esta. La comparación es peor que inútil, porque parece información.
Lo que realmente importa eres tú, el martes pasado. Tú, en una buena semana. Tú, antes de que ocurriera aquello que lo cambió todo.
Para ello se necesitaban dos cosas de las que no disponíamos: registros lo suficientemente sólidos como para compararlos a lo largo de varios meses y un método de puntuación que supiera reconocer cuándo no disponía de datos suficientes. Durante la última semana de agosto desarrollamos ambos.
Sesiones que sobreviven al viaje
Una sesión es un registro: señales procedentes de un dispositivo que se anotan, se guardan y se vuelven a leer más tarde.
Lo complicado es que cada paso de ese proceso supone un riesgo de pérdida de fidelidad. Un dispositivo se desconecta en mitad de la grabación. Un trabajador se demora. El esquema cambia entre la versión que creó el archivo y la que lo lee. Seis meses después, abres una sesión y las cifras difieren ligeramente de las que viste en su momento, y no tienes forma de saber cuál de los dos conjuntos era el correcto.
Así que biosignal-session Se basa en un protocolo de comunicación versionado y en fragmentos «Arrow», que se registran localmente y se conservan en el dispositivo que los ha generado. No es necesario que nada salga de tu dispositivo para que una sesión sea válida.
Dos de nosotros la desarrollamos de forma independiente, en ramas diferentes, al mismo tiempo. En lugar de eliminar una de ellas, las fusionamos y anotamos qué se había incorporado y por qué. Ambas versiones habían resuelto problemas que la otra no había resuelto.
Demostrarlo en lugar de afirmarlo
La mayor parte del trabajo aquí no consistió en programar el registrador, sino en demostrar que el registrador hace lo que dice.
Generamos «golden fixtures» y nos aseguramos de que todas las implementaciones se ajustaran a ellos. Leemos nuestros fragmentos de Arrow con pyarrow y pandas, de modo que la garantía se mantiene en todos los lenguajes y no solo dentro de nuestro propio código. Ejecutamos comprobaciones de ida y vuelta con precisión de bits e invariantes basadas en propiedades.
Creamos un cliente hostil, un consumidor ficticio que hace todo mal a propósito, y este detectó dos vulnerabilidades reales en el servidor. Demostramos que la memoria utilizada durante la grabación no aumenta con la duración de la sesión, por lo que una sesión de cuatro horas consume lo mismo que una de cuatro minutos. Cruzamos todos los fallos recuperables con todas las posiciones de una sesión, ya que una pérdida de señal al principio y otra en el minuto noventa son errores distintos. Confirmamos que los fragmentos siguen leyéndose correctamente después de que el esquema subyacente haya evolucionado.
Por eso el código ha acabado teniendo sesenta mil líneas. Aproximadamente la mitad son funciones fijas y pruebas.
Seis puntuaciones y la hipótesis nula honesta
Por encima de las sesiones se encuentra biosignal-analytics, que convierte los registros en seis valores numéricos: calidad de la medición, activación, recuperación, concentración, disposición y resiliencia.
A cada uno se le asigna una puntuación de 0 a 100. También se puede ocultar cada uno de ellos y, cuando se oculta, el valor es nulo en lugar de una cifra intermedia «diplomática». Esto es más importante de lo que parece. Una puntuación de 50 sin datos que la respalden es una mentira que parece una medición, y todas las aplicaciones posteriores la interpretarán como tal.
Cuando no se muestra una puntuación, se explica el motivo: aún no hay datos de referencia suficientes; la calidad de la captura es demasiado baja; no se ha detectado activación; faltan datos de entrada; o no hay historial suficiente para un análisis longitudinal. Una aplicación puede mostrar el motivo en lugar de mostrar una cifra, lo cual es más honesto y más útil, ya que el motivo suele indicar qué hay que hacer al respecto.
En el fondo, hemos trasladado los cálculos del pulso y la activación a Rust y hemos expuesto los analizadores al navegador a través de WebAssembly, con oráculos de Python que fijan los resultados de Rust para que ambos coincidan.
Volver a la línea de base
La última pieza es aquella para la que existen todas las demás.
Las puntuaciones se calculan en función de una referencia personal renovable, elaborada a partir de tus propias sesiones recientes y agrupada por contexto, de modo que una lectura matutina se compara con tus mañanas. Los valores atípicos se tratan de forma rigurosa, por lo que una mala noche no arrastra consigo la referencia. Hasta que no exista suficiente historial para que esa comparación sea válida, la puntuación permanece oculta.
Esto significa que la primera semana es tranquila por diseño. Creemos que eso es correcto. Una cifra en la que se puede confiar en la tercera semana vale más que una cifra en la que no se puede confiar el primer día.
Situación actual
biosignal-session y biosignal-analytics Se han fusionado en la rama «main» en la versión 0.1.0 y aún no están disponibles en npm. El código fuente se encuentra en github.com/Elata-Biosciences/elata-bio-sdk Si quieres leer el protocolo o los archivos de configuración antes de que publiquemos la versión.
Si estás trabajando en esto, la pregunta que más nos gustaría que nos hicieras es en cuál de las seis puntuaciones no confiarías y qué tendría que ocurrir para que cambiaras de opinión.
