Changelog
Novedades de Vetta Trainer. Las fechas son del deploy a producción.
2026-05-28 — 🚀 VETTA TRAINER ENVIADA A GOOGLE PLAY STORE (Closed Alpha)
Hito
Renso completó la configuración Play Console y envió Vetta Trainer a
review de Google. Status: "Cambios en revisión" con 13 cambios.
Lo que se envió
Cambio de código
GDPR para eliminar cuenta (requisito Google Play Data Safety).
Próximo
2026-05-28 — ✅ PROD RECUPERADA (causa raíz: SyntaxError Python 3.11)
Causa raíz confirmada
Railway "Diagnose" AI identificó: SyntaxError en `vetta_server.py` —
backslash dentro de f-string. PEP 701 (Python 3.12) lo permite,
Python 3.11 lo prohíbe. El server crasheaba en startup → healthcheck
siempre fallaba → 502 perpetuo desde 25-05 23:25.
Fix raíz (1 línea)
Bonus fix incluido en la sesión
healthcheck usa HEAD; antes respondía 405 Method Not Allowed).
Verificación post-recovery
TWA 100% listo
Renso puede ir a Play Console → "Revisar version" → "Iniciar
lanzamiento a Prueba cerrada" → empieza ventana 14 días mínimo
de closed testing.
Lección durable
Mi env Python local (3.12) ocultaba SyntaxErrors que Python 3.11
expone. Alinear siempre versión Python local con prod. Railway
Diagnose AI: usar primero antes de iterar fixes ciegos.
2026-05-28 — Recovery Railway en autónomo (parcial — sigue 502)
Intentado (4 commits pusheados, ninguno desbloqueó)
`railway.json` con `builder: DOCKERFILE`.
para que Railway no dude sobre qué builder usar.
sin `EXPOSE`, `CMD` JSON con `sh -c` para expandir `$PORT`.
para que los logs del deploy sean diagnosticables.
Diagnóstico ejecutado
Handoff
para Renso: dashboard Railway → ver logs del último deploy →
identificar caso (Build falla / Deploy falla / Healthz timeout)
→ compartir error → fix en 5 min.
2026-05-25 — Hito Play Store en curso + bloqueo Railway
En proceso (bloqueado al cierre)
Bloqueado
2026-05-25 — Hito Play Store (bloque autónomo): assets + /descargar + copy + Data Safety
Agregado
Herramientas, Mi perfil) y 4 screenshots referenciadas.
`/play-store/feature-graphic.png` (1024×500), `/play-store/icon-1024.png`,
`/play-store/screen-{1,2,3,4}.png` (1080×1920 cada uno).
inline, 6 features, 4 screenshots, nota iOS. Aliases `/download` (302
→ en) y `/app` (302 → es).
idiomas (ES + EN completos 4000 chars), Data Safety form pre-armado
(~15 preguntas Play Console respondidas), diagnóstico TWA en vivo.
4 idiomas (columna Producto).
2026-05-25 — Hito Play Store: pre-requisitos de código aplicados
Agregado (habilitadores TWA)
(Trusted Web Activity) — sin esto, la app Android del Play Store
muestra la barra de URL del navegador. Lee `VETTA_TWA_SHA256` (lo da
Play Console al subir el primer AAB) y `VETTA_TWA_PACKAGE` (default
`com.vettatrainer.app`).
(standalone, minimal-ui fallback), `prefer_related_applications:false`.
Mejora score de PWABuilder.
Documento nuevo
en Google Play Store via TWA. USD 25 one-time, 5-6 hs activas
distribuidas. iOS NO entra en este hito.
2026-05-25 — Fix Sentry: Pillow faltaba en requirements (4 endpoints PNG en 500)
Arreglado (infraestructura)
devolviendo 500 "PIL no disponible" en prod desde que se agregaron
(`/og/blog/{slug}.png`, `/og/{slug}.png`, `/share/semana.png`,
`/share/week.png`). Impacto: las previews OG cuando se comparte el link
en redes (WhatsApp, Twitter, IG) no mostraban imagen.
(sistema OG dinámico) — local funcionaba porque mi entorno tenía Pillow
instalado; Railway no lo bajaba nunca porque no estaba declarado.
2026-05-24 — /admin hub completo (vistas usuario + páginas + endpoints)
Mejorado (UX admin)
Pasó de 14 cards a 14 + 6 nuevas + ~80 links en 2 details colapsables.
/training, /calendario, /coach, /onboarding, /demo. Crítico para QA
end-to-end del flujo coach.
marketing (12) + disciplinas SEO (4) + producto (6) + contenido (2)
+ auth (4) + legal x4 idiomas (6).
salud/version + SEO + datos del usuario + APIs públicas contenido
+ APIs motor + APIs predicciones + admin restringido.
2026-05-24 — Figuras+viento en /training
Cambiado
viento + halo pulsante (igual que landing/informativas/dashboard).
Antes estaba `side_figs=False` por decisión "foco máximo en el plan";
Renso pidió revertir esto en producción. Aplicado a las 2 routes:
vista principal + caso "todavía no hay semana".
(11 steps para probar end-to-end usando tu correo como coach + alias
Gmail como atleta de prueba).
2026-05-24 — Bug fix detector post-carrera (Coros sin Strava)
Arreglado (motor)
`profile.objetivos` con fecha en los últimos 3 días. Antes solo miraba
parquet, por lo que atletas con reloj Coros (sin vincular a Strava)
no disparaban el auto-taper y el motor les prescribía carga normal al
día siguiente de una carrera. Ahora si declaraste el objetivo con la
fecha de hoy y la fecha es pasada, el motor asume que corriste y
fuerza `fase=taper` la próxima semana. TSS estimado ~8 TSS/km trail.
2026-05-24 — 3 fixes XSS + validación fecha (audit forms)
Arreglado (seguridad)
HTML del email a Renso. Fix: `html.escape()` aplicado a `name`, `email` y
`message` antes de interpolar.
`message`. Fix: escape de los 4 campos.
string como fecha. Fix: `datetime.fromisoformat()` con `HTTPException 400`
si el formato es inválido.
Sin features nuevas
Verificación adicional sin hallazgos en `/api/waitlist`, `/signup`,
calculadoras (VDOT/zonas/TSS/altitude) y `/api/regenerar`.
2026-05-24 — Auditoría + fixes seguridad/eficiencia + figuras dashboard
Arreglado (dashboard)
que las URLs background-image eran `/static/figures/runner-trail` y `/cyclist`
sin extensión `.png` → 404 silencioso → divs invisibles. Fix: extensión
agregada + 3 chevrons de viento por figura (animación diagonal) + opacity
visible subido 0.20 → 0.45 + threshold display bajado 1620px → 1340px (más
pantallas ahora ven las figuras).
Mejorado (seguridad)
producción (antes solo `/supabase` callback). Inconsistencia resuelta.
que el target resuelto esté dentro de `raw_dir` antes de extraer; bloquea
ZIPs maliciosos con `../`).
está configurado, exige matching del `subscription_id` del body; valida
tipo `dict` del body y tipo `int|str` del `owner_id`.
Mejorado (eficiencia)
parseaba JSON desde disco en 58+ call sites). El cache se invalida en
`_save_users` para no devolver datos stale tras escritura.
devuelven `Cache-Control: public, max-age=3600` (contenido 100% estático,
cambia solo en deploys).
call: cache módulo-level `_ARCHETYPES_CACHE` poblado en primera invocación.
Sin features nuevas
Regla durable `feedback-vetta-stop-features` respetada: solo bugs/auditoría.
2026-05-24 — B63-65 reactivados (docs + endpoints + posts)
Nuevo
- `/docs/predicciones` — modelo Daniels, corrección por altitud, dónde pierde precisión.
- `/docs/strava` — OAuth flow, qué se importa y qué no, privacidad y GDPR.
- `/docs/coach` — modelo coach, anti-fraude, qué ve y qué no ve el coach.
- 4 idiomas (es/en/de/fr).
- `/api/v1/blog-tags` — tags únicos con conteo (filtro lang opcional).
- `/api/v1/health` — uptime + git sha + boot_time, ideal para UptimeRobot.
- `/api/v1/predict-batch?vdot=X` — predicciones para 6 distancias en una llamada.
- `/api/v1/disciplines-detail` — info por disciplina (arquetipos, filosofías, zone_mode).
- `/api/v1/changelog-rss` — RSS 2.0 del CHANGELOG.md para feedly/Inoreader.
- `vert-training-para-trail` — entrenamiento de desnivel específico.
- `pacing-mental-en-ultras` — Marcora + Noakes, estrategias mentales.
- `recuperacion-activa-real` — sueño, hielo, sauna, foam roller con evidencia.
- `lesiones-it-band-runners` — IT band syndrome, prevención y tratamiento.
2026-05-24 — Cierre final: consistencia pricing/onboarding
Arreglado (consistencia pricing ↔ código)
El pricing decía solo Pro/Coach pero el dashboard de Free las mostraba.
Idem mismatch: ahora coincide con el card del pricing.
`pdf_reports`). El botón en `/training` muestra "📥 PDF · Coach" en gris
para Pro, normal para Coach.
reemplazada por "Notas por sesión con tus atletas" (que sí existe).
4 idiomas.
Mejorado (onboarding)
cargados (antes solo se veía el botón "Agregar"). Lista con badge
prioridad A/B + nombre + distancia + fecha + tiempo objetivo.
card. Responsive @640px (pasa a 2 columnas, botón × debajo).
lugares tenga aire.
Cambiado
2026-05-24 — Cierre features + reorganización + go-live focus
Mejorado
calculadoras ya no son un mar plano):
- Pace y ritmos (9): VDOT, ritmos Daniels, easy-pace-vdot, etc.
- Zonas FC, esfuerzo y carga (9): zonas, karvonen, fcmax, tss…
- Trail, altitud y clima (6): altitud, vk-pace, descenso-trail…
- Nutrición, cuerpo y ciclismo (7): calorías, race-weight…
- Headers con título + subtítulo + contador en es/en/de/fr.
bloqueantes (Lemon, welcome mail, GSC), 5 alto ROI (crons, R2,
IndexNow, Plausible, outreach), 4 estratégicos. Total ~1.5-4 hs de
acción humana de Renso para empezar a cobrar real.
Bloqueado por decisión humana (no requiere más código)
2026-05-24 — 2da pasada autonoma (bloques 55-60)
Nuevo
estres-cronico-y-rendimiento, pared-del-maraton, trail-nocturno
(copy nativo, no traducción literal).
(pacing con 2a mitad más rápida), /herramientas/maf-180 (Maffetone
aerobic max), /herramientas/watts-per-kg (W/kg + nivel Coggan + VAM
estimado).
(las 13 filosofías del motor con contexto para elegir), /docs/inventario
(sistema temporal con 4 casos de uso reales), /docs/api (intro al
catálogo /api/v1 con ejemplo JS).
HRV, lactato, capilarizacion, MAF, sliding_filament, mitocondria,
plasma_volume, fast_twitch.
no cubierta). Más 2 sub-niches: /running/marathon, /running/half-marathon.
Mejorado
2026-05-24 — sesion autonoma "termina todos los puntos" (bloques 49-54)
Nuevo
plan-sub-40-10k, vdot-vs-ftp-vs-css, zonas-fc-vs-ritmo, tapering-avanzado,
ftp-sin-potenciometro, nutricion-trail-running. Total EN: 9 → 15.
(vertical km pace), /herramientas/cho-fueling (carbs/h race),
/herramientas/tsb-recovery (Banister projection), /herramientas/carb-load
(pre-race CHO loading).
monotonia_foster (Foster Training Monotony Index), strain_foster
(Foster Strain Index), descenso_volumen (deconditioning 4+ semanas),
easy_too_fast (rodajes easy corridos cerca del umbral).
/docs/motor (cómo funciona el motor — arquetipos, filosofías,
periodización, ramp_seguro), /docs/zonas (FC Karvonen, ritmo Daniels,
potencia Coggan, CSS), /docs/tss-ctl-atl (TSS, CTL, ATL, TSB, ACWR).
Plus /docs index.
docs, zones-spec (fórmulas completas para integraciones),
glossary-search, engine-info.
Notas
nativo: cómo lo escribiría un nativo, no una traducción literal del ES.
CSS, Banister) para que terceros puedan replicar el cálculo.
2026-05-24 — ultra-sesion autonoma (bloques 34-47)
Nuevo
+ 12 quick links organizados en 3 secciones (Operación, Captación,
Infraestructura).
protegidas con doble guarda (cookie firmada + email whitelist).
conversor min/km↔min/mi con tiempos por distancia, aclimatación al
calor con heat index.
ultra, pared del maratón, trail nocturno) + 6 traducciones nativas
(DE x3, FR x3): VDOT, polarizado vs piramidal, primer ultra UTMB.
(100 millas), /ciclismo/gravel, /triatlon/sprint.
(sub-40 10K), Sole (UTMB OCC), Pablo (granfondo cycling), Vale (70.3).
supercompensación, mesociclo/microciclo/macrociclo, taper, deload,
Z2, fartlek, EPOC, sleep_debt, RMR, ramp_seguro.
/tools-search, /seo-pages.
gym_zero, long_run_insuficiente, balance_disciplinas.
calendario editorial 4 semanas, hashtags por plataforma + idioma.
imprimible con dialogo PDF nativo del browser auto-disparado.
Mejorado
(TrainingPeaks, Runna) en /comparar, /pricing y FAQ multi-idioma.
Cambiadas a categorías genéricas ("apps premium", "apps solo running").
2026-05-22
Nuevo
propio por disciplina. Bajamos también sub-niches: `/trail/ultra-50k`,
`/trail/maraton-de-montana`, `/ciclismo/granfondo`, `/ciclismo/ftp`,
`/triatlon/ironman`, `/triatlon/olimpico`.
exportá un ZIP con todos tus datos o eliminá tu cuenta desde Ajustes.
link por email (vive 1 hora) y elegís nueva.
Strava mobile si todavía no tenés reloj.
VDOT/CTL se calculan con muy pocas actividades o datos muy viejos.
con duración + RPE y el motor lo suma a tu historial (TSS por Foster).
pegada a una sesión específica del motor.
ahora podés marcar "solo lo tengo hasta X" o "solo desde X" (bici
prestada, equipo que llega más adelante).
por WhatsApp/IG/Twitter aparece con título, descripción e imagen.
Mejorado
laterales de runner/cyclist con animación al scroll).
(no traducción literal del español).
2026-05-21
Lanzamiento de la versión SaaS
Accept-Language).
filosofías (Daniels VDOT, Lydiard, Kilian montaña, Coggan potencia,
sweet-spot, polarizado, MTB XC, natación CSS, triatlón clásico, etc.).
natación, triatlón (con día de brick).
(Coggan FTP) o CSS (natación) según `zone_mode`.
proyectado a 5K, 10K, 21K, 42K con corrección por altitud.
invitación por email y vínculo coach↔atleta.
Cómo te enterás de los próximos cambios
por email cuando hay novedades grandes.