/docs · Vetta Trainer
How the engine works
No black box. Here's exactly how the Vetta engine builds your week: archetypes, philosophies, periodization, injury prevention. If you understand it, you can argue it with your coach.
Parametric archetypes
The engine doesn't carry a library of fixed workouts. It carries 66 parametric archetypes — templates with ranges. The "long Z2 climb" archetype, for example, has duration range 45-90 min, Z2 intensity (75% LTHR), 200-600m vert.
When instantiated, the archetype fills in with specific values for you: 60 min duration, target HR 145-152 bpm, +350m. Every week the variants are different — you never see the same session twice.
Philosophies as weight systems
13 hardcoded philosophies: Daniels VDOT, Lydiard, Kilian mountain, Coggan power, sweet-spot, classic polarized, Norwegian threshold (Ingebrigtsen/Bakken), MTB XC, swim CSS, classic triathlon, ultra Koop, polarized cycling, magness.
A philosophy is NOT a separate library of workouts. It's a weight profile over the same 66 archetypes. Classic polarized leans heavy on Z2 and Z4-5 archetypes, almost zero Z3. Sweet-spot leans into low-Z3. Same structure; different weights.
Periodization by phase
Four phases: base, build, peak, taper. The phase is selected automatically by days-to-next-A-race (if you have a goal loaded).
Each phase modulates volume and family mix. Base prioritizes endurance and strength_endurance. Build pushes threshold and VO2max up. Peak refines race-specific. Taper drops volume 22-38% (running -22%, cycling -38%, swim -35%) and filters out long + strength_endurance.
ramp_seguro: injury prevention
The engine never proposes a weekly volume jump larger than +8%. The 10% rule is popular but the evidence (Gabbett 2016) shows that <10% is the safe band, not exact. Vetta uses +8% for margin.
If your ACWR > 1.3 for 5+ days running across the last 2 weeks, the engine automatically suggests a deload week (-25-30% volume).
Deterministic weekly seed
Two visits to the same /training in the same ISO week return the SAME week. There's no hidden randomness — the seed is a function of (user_id, iso_year, iso_week, phase, philosophy, days_per_week).
Change a parameter (more days per week, different philosophy, different phase) → the week changes. Keep the parameters → the week stays stable Monday-Sunday.
Inventory and real-world constraints
Each archetype declares its `requiere` (required equipment). The engine only prescribes what you actually have ticked in your profile.
If your inventory says "no bike" or "bike unavailable until 2026-06-15" (vacation, travel, Veladero roster), the engine excludes cycling archetypes until that date and auto-resumes them when it expires.
Zones: HR vs pace vs power vs CSS
Each archetype declares intensity as a zone token (Z1..Z5b, P1..P7 cycling, S1..S5 swimming). The engine resolves those tokens to concrete numbers at instantiation, depending on your `zone_mode` and available data.
Zone calculation details at /docs/zonas. Summary: HR via Karvonen reserve, pace via Daniels VDOT, power via % FTP (Coggan), CSS via 400+200m test.
Where the engine does NOT help
The engine does NOT replace a human coach for technical corrections (gait, swim stroke, emotional management pre-race). That part stays human.
The engine also doesn't make decisions that need clinical history (recurring injuries, allergies, pregnancy). When your situation is medical, talk to a professional, not to the app.