Autoalojado · sin caja negra

Las reglas deciden.
El modelo explica.

Vrain lee tu carga y tu recuperación, y cada mañana decide si la sesión de hoy sigue en pie, se recorta o se cambia. La decisión y todas las cifras salen de un motor determinista. El modelo de lenguaje solo redacta el porqué —y nunca devuelve un número.

42 / 7
Días de las medias de forma y fatiga
90
Días de ventana para estimar el FTP
0
Cifras que escribe el modelo de lenguaje
Hoy

El principio rector

Un modelo de lenguaje no debería decidir tu semana

No es desconfianza abstracta: es que una recomendación de entrenamiento tiene consecuencias físicas, y hay tres propiedades que una tirada de dados no da.

Reproducible

Los mismos datos y la misma fecha dan la misma decisión. Un prompt no ofrece esa garantía, y sin ella no hay forma de saber si el plan cambió porque cambiaste tú.

Testeable

Las reglas viven en un paquete puro, sin base de datos ni red, con su batería de tests. Una redacción no se testea; un umbral sí.

Auditable

Cada decisión guarda el contexto entero con el que se tomó y la versión del motor. Meses después se puede reejecutar y obtener exactamente lo mismo, aunque las reglas ya hayan cambiado.

Si el modelo falla o tarda, se sirve la explicación de plantilla y la app sigue completa. La prosa es lo único que puede faltar.

Las pantallas

Cuatro sitios, y en cada uno una pregunta

Hoy responde qué toca. Generador, cómo se reparte la semana. Temporada, si el pico cae donde está tu carrera. Historial, de dónde salió cada número.

Temporada
Generador

El modelo de datos

De un fichero de Strava a la sesión que baja al Edge

Cuatro pasos, y una regla en cada uno que se ganó mirando qué salía mal.

  1. 01

    Ingesta

    activitiesactivity_streamsrecovery_daily

    Strava trae actividades, potencia y series por segundo. Las tres tablas llevan columna source y no saben de ningún proveedor: los conectores son adaptadores hacia ellas, nunca esquemas paralelos.

  2. 02

    Valoración

    athlete_ftp_historyfitness_daily

    Cada actividad se valora con el FTP vigente en su fecha, no con el de hoy. De ahí salen CTL, ATL y TSB, y con ellas la curva de forma.

  3. 03

    Decisión

    plan_dayscoach_decisions

    El motor mira el plan del día contra tus señales y decide. Guarda el contexto de entrada entero y su propia versión, que es lo que permite responder a «¿por qué me quitaste el martes?».

  4. 04

    Salida

    .fit.zwointervals.icu

    El plan baja al dispositivo. El envío es idempotente sobre la semana que cubre: lo que hay en tu calendario es exactamente el plan, ni un fantasma de más.

El FTP lleva fecha de vigencia

Strava solo expone el FTP actual. Sin memoria de los cambios solo hay dos opciones malas: recalcular el histórico con el valor de hoy —y entonces tu forma de octubre cambia cada vez que mejoras— o dejar las actividades viejas con un número obsoleto.

athlete_ftp_history.effective_from

Lo medido y lo estimado van en columnas distintas

Solo hay TSS donde hubo potenciómetro. Lo demás se estima desde el pulso y entra en la curva —si no, la forma decaería en los meses en que sí entrenabas— pero se puede distinguir en cualquier punto de la cadena.

activities.estimated_tss · fitness_daily.estimated_share

Ninguna señal aislada manda parar

La variabilidad diaria de la HRV es alta y un mal dato tras una sesión dura es lo normal. Lo que fuerza descanso es la convergencia: pulso elevado, HRV baja y temperatura de piel alta a la vez, o dos avisos independientes acumulados.

hrv -10% · fc reposo +4 lpm · piel +0.5 °C

Toda la ingeniería, con sus números — el motor, el modelo de datos y por dónde entra el modelo de lenguaje.

Por dónde entra y sale

Tus datos son tuyos, y el esquema no está casado con nadie

Todo corre en tu Postgres. Si un conector cae o se cierra, los datos siguen pudiendo entrar por fichero: ninguna fuente es un punto único de fallo.

  • Strava

    Actividades, potencia y series por segundo, incrementales y sin que tengas que subir nada. De ahí salen el TSS, la curva de forma y el ritmo con el que se escribe tu semana.

    Conectado por OAuth
  • Google Health

    Sueño con sus fases, HRV, frecuencia cardiaca en reposo, SpO2 y temperatura de piel. Es la mitad de la decisión de cada día; sin conectarlo el motor lo dice en pantalla en vez de disimularlo.

    Conectado por OAuth
  • intervals.icu

    El puente. Al generar la semana el plan se escribe en su calendario y de ahí baja solo a Garmin Connect y al dispositivo.

    Conectado por clave de API

Tu histórico ya sabe cómo entrenas. Falta leerlo.

El plan no sale de una plantilla: sale de tus últimas doce semanas —qué días sales, cuál es tu día largo, cuánta carga aguantas—. Conecta Strava y la primera semana se genera sola.