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
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.
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.
- 01
Ingesta
activitiesactivity_streamsrecovery_dailyStrava 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.
- 02
Valoración
athlete_ftp_historyfitness_dailyCada 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.
- 03
Decisión
plan_dayscoach_decisionsEl 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?».
- 04
Salida
.fit.zwointervals.icuEl 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.
- Conectado por OAuth
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 clave de API
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.
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.