Trainingen, plannen, AI en de logica erachter
Dit document trekt de hele trainingslaag uit de app open: hoe de bibliotheek is opgebouwd, hoe categorieën in de UI werken, welke vaste plannen erin zitten, hoe persoonlijke AI-plannen worden opgebouwd en gevalideerd, hoe freshness actieve plansessies beïnvloedt, en waarom de totale trainingsarchitectuur precies zo gekozen is.
1. Kort samengevat
WattFlow heeft nu twee lagen boven elkaar. Onderin zit nog steeds de vaste trainingsbibliotheek met ingebouwde workouts en vaste catalogusplannen. Daarboven ligt nu een persoonlijke planlaag: gebruikers kunnen via de planwizard een prompt laten opbouwen, extern AI gebruiken om JSON te genereren, dat JSON importeren en daarna dat persoonlijke plan lokaal in de app laten meelopen. Tijdens het volgen van zo’n plan kan Freshness de volgende sessie vervolgens weer reduceren of vervangen. In de nieuwe appindeling betekent dat ook iets praktisch: Vandaag geeft context, Schema geeft planning, Training geeft de concrete workout, en Meer bevat de instellingen en AI-planacties die niet de hoofdflow hoeven te domineren.
2. Hoe de Training-tab werkt
De Training-tab is de concrete workoutlaag van WattFlow: bibliotheek, filterlaag en importpunt. In de app komen ingebouwde sessies, favorieten en imports hier samen rond dezelfde workoutgegevens uit. Voor vaste plannen en persoonlijke AI-plannen gebruikt de app daarna dezelfde detailweergave, startflow en workout-engine, maar de weekplanning zelf blijft in Schema.
Wat de gebruiker ziet
- Categorieknoppen in app-volgorde: uithoudingsvermogen, omslagpunt, VO2max, kracht, testen.
- Duurfilter in stappen van 15 minuten.
- Zoeken op titel.
- Favorieten en geïmporteerde trainingen in een aparte Favorieten-weergave.
- Import via
.zwo, workout-.fiten activity-.fit/.tcx. - Een geplande sessie kan bovenaan verschijnen als “volgende training”, zonder dat Training de hele weekplanning overneemt.
Wat er technisch gebeurt
- De Training-tab leest uit
WorkoutStore, dat built-in en imported workouts samen indexeert. - Filters en zoekwaarden leven in
AppModelen worden direct op de geïndexeerde lijst toegepast. - Imports worden gekopieerd naar
Documents/Trainingenen daarna opnieuw geïndexeerd. - Een net geïmporteerde workout kan automatisch openen of in de segmentweergave “Geïmporteerd” landen.
- Als er een actief schema loopt, kan de eerstvolgende geplande workout bovenaan Training verschijnen, zonder de weekplanning uit Schema te dupliceren.
| Onderdeel | Gebruikerslaag | Technische logica |
|---|---|---|
| Zoeken | Op titel filteren zonder extra scherm | Filtert direct de reeds geïndexeerde WorkoutItem-lijst |
| Categorieën | Snel naar een type sessie | Displayvolgorde komt uit WorkoutCategory.displayOrder |
| Duurfilter | Van kort en haalbaar naar langer en zwaarder | Werkt in stappen van 15 minuten met een bewaakte min/max-range |
| Favorieten | Vaste sessies snel terugvinden | Koppelt aan bestandsnaam, zodat herindexeren geen favorieten wist |
| Import | Bestanden uit Bestanden, Mail of iCloud toevoegen | Workoutbestanden blijven in de trainingsbibliotheek; activitybestanden gaan door naar Historie |
3. Categorieën in de app
De app gebruikt een gebruiksvriendelijke categorielaag boven op de ruwe workouttypes.
Daardoor hoeven gebruikers niet te denken in JSON-typen als sweet_spot of maintenance,
maar ziet de Training-tab er stabiel en herkenbaar uit.
3.1 Ingebouwde bibliotheek
3.2 Imports en analyzer
Voor imports loopt de app via een analyzer en classifier. Daardoor kan een buitenbestand wél in VO2max of Kracht terechtkomen, ook al levert de ingebouwde WattFlow-bibliotheek daar nu nog geen eigen sessies voor.
Analyzerregels
Importgedrag
- Workoutbestanden:
.zwoen workout-.fitworden trainingsitems. - Activiteiten: activity-
.fiten.tcxworden geen training, maar historie. - Waarom dat nuttig is: één importknop, maar toch een scheiding tussen “iets om te rijden” en “iets om terug te kijken”.
- App-flow:
4. Zones, kleuren en planmetrics
De grafische blokken in deze gids volgen dezelfde denklaag als in de app: FTP-percentages worden naar zones vertaald, zones krijgen een kleur, en diezelfde drempels sturen zowel mini-grafieken als trainingsclassificatie.
4.1 Zonegrenzen
4.2 IF en TSS
Geplande metrics in de bibliotheek
Elke ingebouwde training draagt een geschatte IF en TSS mee. Die waarden zijn bedoeld als plan- en bibliotheeknavigatie, dus als “hoe zwaar is dit ongeveer?” nog vóór je gaat rijden.
- IF: in de analyzer is dat de genormaliseerde vermogensfactor uit de blokken.
- TSS:
uren × IF² × 100. - Stressbars: in de analyzer worden die uit TSS afgeleid in 1 tot 5 balken.
Wat dit in de praktijk betekent
- De bibliotheek kan lichte, middelzware en zware sessies sorteren zonder eerst een echte rit nodig te hebben.
- Plannen kunnen weken opbouwen in duur en belasting, niet alleen in titels.
- De werkelijke rit berekent later zijn eigen metrics opnieuw uit de live samples en niet alleen uit de planwaarde.
- Voor testworkouts kan daarnaast nog een kandidaat-FTP uit het testblok komen.
5. Trainingsplannen
De planlaag in WattFlow bestaat nu uit twee families. Enerzijds zijn er de vaste catalogusplannen die rechtstreeks naar bekende workout-IDs in de bibliotheek verwijzen. Anderzijds kan de gebruiker een persoonlijk AI-plan laten maken en als JSON importeren. Beide eindigen uiteindelijk in dezelfde planstructuur in de app, maar de route ernaartoe is anders.
5.4 Persoonlijk AI-plan
Het persoonlijke AI-plan is geen tweede los systeem naast de gewone Schema-tab. Na import wordt het JSON-plan lokaal opgeslagen,
vertaald naar een gewone TrainingPlan en bovenaan de catalogus getoond. Daardoor krijgt een persoonlijk plan
dezelfde progressie, planning, workout-detailweergave en startlogica als de vaste plannen.
Wizard: welke input gaat erin?
- Doel: FTP verhogen, duur verbeteren, fit blijven of toewerken naar evenement.
- Beschikbaarheid: aantal sessies per week, voorkeursdagen, gemiddelde duur, langste training.
- Niveau: FTP, atleetniveau, huidige trainingsfrequentie, langste recente rit.
- Context: trainingsstijl, maximum zware sessies per week en optioneel Strava-samenvatting.
- Eventplannen: naam, datum, type, afstand, hoogtemeters en doel.
Hoe dat plan in de app landt
- Na validatie bewaart
AIPlanStorehet volledige plan lokaal. AIPlanMappinggeeft het plan een vaste prefixai_personal:.- De runtime-library van een AI-plan heet intern
wattflow_ai_plan_v1. - Workouts uit zo’n plan krijgen als runtime-auteur WattFlow AI.
- De generatorregel uit het JSON blijft zichtbaar als “Gemaakt met provider • model”.
- De gebruiker maakt of importeert zo’n plan niet vanuit Training, maar via Schema of Meer > AI plan instellingen.
5.5 Nieuwe planprompt: opbouw en inputvelden
De promptbuilder is bewust streng. Een “nieuw plan”-prompt bevat niet alleen een vriendelijke vraag, maar een volledige set uitvoerregels zodat het model exact één geldig WattFlow JSON-object terugstuurt.
Hoofdblokken van de prompt
- High priority execution rules: aantal sessies, vaste voorkeursdagen, geen extra tests, geen 0-seconde intervallen.
- Output schema rules: top-level keys, verplichte velden, enumwaardes en intervalcontract.
- TSS and load rules: 5 tot 12% opbouw, build-to-build sprongen onder ~18%, herstelweken duidelijk lichter.
- User input facts: alle wizard-invoer, maar alleen als inhoud, niet als extra JSON-velden.
- Final checklist: response moet met
{starten en met}eindigen, zonder markdown of extra tekst.
Wat WattFlow extra afdwingt
- Keys en enumwaarden blijven in het Engels; gebruikerszichtbare tekst volgt de iOS-systeemtaal.
- Voor gewone weken gebruikt de prompt een exact dagtemplate op basis van best verspreide voorkeursdagen.
- Voor eventweken bouwt de prompt een apart dagtemplate waarin de echte eventdag vastligt.
- Strava-context wordt alleen meegestuurd als de gebruiker die expliciet aanzet.
- De prompt verbiedt extra helpervelden zoals
preferred_days,weekly_tss_targetsof debugmetadata.
Generate one personal cycling training plan for WattFlow.
HIGH PRIORITY EXECUTION RULES:
- Obey the numeric input exactly.
- Do not add extra sessions to hit TSS targets.
- Use only the allowed preferred days for normal weeks.
- Do not add a benchmark, FTP test, nulmeting or diagnostic workout unless explicitly asked.
OUTPUT SCHEMA RULES:
- Return EXACTLY one JSON object.
- Use exactly these top-level keys:
app_id, format_id, schema_version, generator, plan, workouts
- app_id = WattFlow
- format_id = wattflow_plan
- schema_version = 1.1
TSS AND LOAD RULES:
- Increase weekly load gradually by about 5 to 12 percent in build weeks.
- Keep build-to-build jumps under about 18 percent.
- Insert a recovery week every 3 to 4 weeks.
5.6 JSON-contract en validatie
Voor import loopt elk AI-plan eerst door PlanImportValidator. Die validator is expres niet alleen technisch,
maar controleert ook of de weekloads logisch ogen en of het schema binnen WattFlow’s trainingsfilosofie blijft.
| Validatielaag | Wat er gecontroleerd wordt |
|---|---|
| Inputnormalisatie | Smart quotes en code fences worden genormaliseerd; de validator pakt het eerste echte JSON-object uit de plaktekst. |
| Metadata | app_id moet WattFlow zijn, format_id moet wattflow_plan zijn en schema 1.1 of legacy 1.0. |
| Workoutshape | Intervaltypes zijn beperkt tot Warmup, Cooldown, SteadyState, IntervalsT en FreeRide. |
| Inhoudelijke regels | FreeRide mag alleen in testworkouts, estimated_tss mag niet negatief zijn en alle durations moeten positief zijn. |
| Referenties | Elke workout_id in de weken moet in de top-level workoutarray bestaan; dubbele workout-IDs zijn een fout. |
| Weekloadcontroles | Grote build-to-build sprongen geven een waarschuwing; herstelweken die te weinig zakken geven ook een waarschuwing. |
Fouten die import blokkeren
- Ongeldige metadata
- Negatieve TSS of workoutduur 0
- Niet-ondersteund intervaltype
FreeRidebuiten testworkouts- Dubbele workout-IDs
- Onbekende workoutreferenties in een week
Waarschuwingen die wel mogen
- Legacy schema 1.0 zonder generator-object
duration_weekskomt niet overeen met aantal weken- Niet elke week heeft precies
sessions_per_weeksessies - Weekload maakt een te grote sprong
- Herstelweek ligt niet duidelijk lager dan de week ervoor
5.7 Voortgangscheck en update prompt
Een persoonlijk plan stopt niet bij de eerste import. Zodra er genoeg plan- en activiteitsdata is, bouwt WattFlow een voortgangsreview en kan daarna een gerichte updateprompt genereren.
PlanProgressReviewBuilder
- Planned week TSS komt uit de huidige geplande week in het plan.
- Actual week TSS komt uit voltooide activiteiten in de huidige kalenderweek.
- 14-daagse adherence vergelijkt geplande sessies met afgeronde sessies.
- Status wordt
insufficientData,tooHeavy,behindofonTrack. - Die review kan daarna doorstromen naar een expliciete updateflow, waarin WattFlow eerst om een reden vraagt en daarna pas een updateprompt bouwt.
Statusdrempels
- tooHeavy bij adherence < 55% of actual week TSS < 65% van gepland.
- behind bij adherence < 85% of actual week TSS < 90% van gepland.
- onTrack als weekload en adherence redelijk in lijn liggen.
- insufficientData als er nog geen betekenisvolle plan- of voortgangsdata is.
| Update-reden | Wat de gebruiker kan aanpassen | Hoe de prompt wordt aangevuld |
|---|---|---|
| Plan voelt te zwaar | Symptoom en gewenste bijsturing | updateContext.notes met combinaties als “Intervallen te zwaar” en “Iets lichter”. |
| Ik heb minder / meer tijd | Sessies per week, gemiddelde duur, langste training | Nieuwe beschikbaarheid wordt expliciet in de prompt gezet. |
| Ik heb trainingen gemist | Geen extra velden | Prompt vraagt om de load opnieuw uit te spreiden. |
| Mijn evenement is veranderd | Geen aparte UI in de updateflow | Prompt vraagt om rekening te houden met nieuwe timing of eisen. |
Update this WattFlow plan and return EXACTLY one raw JSON object in the same WattFlow format.
Additional update rules:
- Rebuild the plan with TSS as the main load driver.
- Obey the requested sessions per week exactly.
- Keep load progression gradual and keep recovery weeks clearly lower.
- Do not add benchmark or diagnostic test workouts unless explicitly requested.
5.8 Freshness en actieve plansessies
Zodra een plan actief is, loopt de volgende sessie niet blind door. Voor het openen van de detailview maakt de app eerst
een PreparedPlanWorkout. Dat object bevat de runtime-workout plus een adjustmentlaag uit
FreshnessTrainingAdvisor. Die advisor kijkt inmiddels niet alleen naar de zichtbare Freshness-score,
maar ook naar confidence, caution, load-context en trainability. In de praktijk zie je dat terug op drie plekken:
de dagcontext in Vandaag, de plankaart in Schema en de concrete trainingsstart in Training.
Wanneer een sessie ongewijzigd blijft
Bij een goede freshnessscore of een rustige trainingsdag blijft de originele workout gewoon staan.
De planstructuur verandert dan niet; alleen de voorbereidingslaag zegt expliciet keep.
Wanneer WattFlow terugschakelt
Bij lage freshness, hoge algemene load of duidelijke illness-signalen kan de app de intensiteit en duur verlagen, of een intensieve workout zelfs vervangen door een herstelrit. Die vervanger krijgt expliciet een titel als Herstel: of Aangepast:.
| Situatie | Actie | Intensity factor | Duration factor |
|---|---|---|---|
illness == likely | Replace | 0.65 | 0.60 |
illness == possible of hogere caution + intensieve sessie | Replace | 0.72 | 0.70 |
generalLoad == high + intensieve sessie | Replace | 0.75 | 0.75 |
trainability == low + intensieve sessie | Replace | 0.74 | 0.72 |
trainability == low + rustige sessie | Reduce | 0.90 | 0.78 |
confidence == low + intensieve sessie | Reduce | 0.90 | 0.85 |
freshness < 40 + intensieve sessie | Replace | 0.72 | 0.60 tot 0.80 |
freshness < 40 + rustige sessie | Reduce | 0.90 | 0.60 tot 0.80 |
freshness 60-69 | Reduce | 0.95 tot 0.97 | 0.92 tot 0.95 |
freshness 50-59 | Reduce | 0.95 | 0.90 |
freshness 40-49 | Reduce | 0.92 | 0.85 |
trainability == controlled + intensieve sessie | Reduce | 0.96 | 0.94 |
6. Bibliotheken en ontwerpkeuzes
Onder de plannen hangen nu twee bibliotheken. Eén richt zich op FTP-opbouw en één op duur/fit. Ze hebben bewust een ander karakter, maar delen wel dezelfde indoor logica en charttaal.
6.1 Structured FTP
6.2 Endurance & Fit
7. Alle trainingen
Hieronder staan alle ingebouwde trainingen gegroepeerd volgens de categorieën die de app zelf gebruikt. Elke kaart toont dezelfde basisinformatie die je in de bibliotheek nodig hebt, plus extra technische details en trainingsreden.
7.1 Uithoudingsvermogen
7.2 Omslagpunt
7.3 Testen
7.4 Importcategorieën
VO2max
De huidige WattFlow-library levert nog geen ingebouwde VO2max-sessies, maar imports kunnen daar wel landen als ze duidelijk veel korte harde blokken of race-achtige hard/rest-patronen bevatten.
Kracht
Ook Kracht is nu vooral een importcategorie. De classifier gebruikt onder andere cadence-indicaties om strength-achtige bestanden los te trekken van gewone duur- of drempeltrainingen.
8. Hoe en waarom achter de opbouw
Als je wilt begrijpen waarom deze bibliotheek voelt zoals hij voelt, dan zit de kern hier: WattFlow kiest niet voor zoveel mogelijk exotische sessies, maar voor een indoor bruikbare bibliotheek die plannen, progressie en herhaalbaarheid ondersteunt.
1. Indoor-first boven “alles kunnen”
De meeste sessies vallen in een bruikbaar venster van ongeveer 30 tot 75 minuten. Dat sluit beter aan op trainergebruik binnenshuis dan een eindeloze buitenlogica.
2. Statische blokken zijn expres saai
“Simpel en statisch” is hier geen beperking maar een ontwerpkeuze. Binnen voelt een heldere structuur vaak beter dan pseudo-complexiteit met veel microvariatie.
3. Sweet spot zit bij duurfamilie
Sweet spot ligt trainingskundig dicht tegen FTP aan, maar wordt in de app gegroepeerd bij duur/uithoudingsvermogen omdat het vaak als opbouw- en basiswerk wordt gebruikt.
4. Herstelweken zijn niet optioneel op papier
De plannen bouwen niet alleen omhoog. Een herstelweek zit erin om vermoeidheid te laten zakken, openers op het juiste moment terug te brengen en plantrouw haalbaar te houden.
5. Fit blijven is bewust klein
Het onderhoudsplan is geen afgezwakt FTP-blok maar een apart productdoel: ritme behouden, drempel laag houden en regelmaat maximaliseren.
6. Reusable IDs zijn een architectuurkeuze
Plannen verwijzen naar vaste workout-IDs. Dat maakt voortgang stabieler, laat plannen later uitbreiden en voorkomt dat een titelwijziging meteen een planstructuur breekt.
9. Relevante bronbestanden
| Bestand | Rol in de trainingslaag |
|---|---|
WattFlow/Views/TrainingenTabView.swift |
Trainingen-tab, filters, importentrypoint en navigatie naar detail of favorieten |
WattFlow/Views/FavorietenView.swift |
Favorieten- en geïmporteerd-segmenten |
WattFlow/Views/PlanView.swift |
Plancatalogus, freshnesskaart, persoonlijke AI-plannen, updateflows en weekschema’s |
WattFlow/Views/AIPlanViews.swift |
Wizard voor nieuwe plannen, promptpreview, JSON-import en planupdateflows |
WattFlow/Domain/WorkoutLibraryModels.swift |
Decoding van bibliotheken, workouttypes, intervallen en plangebruik |
WattFlow/Domain/WorkoutCategory.swift |
Gebruikerscategorieën en displayvolgorde in de app |
WattFlow/Services/TrainingPlanCatalog.swift |
Ingebouwde planstructuur, inclusief hardcoded FTP-plan |
WattFlow/Services/AIPlanImportService.swift |
Promptbuilder, JSON-validator, loadcontroles en importschema voor persoonlijke AI-plannen |
WattFlow/Services/AIPlanWorkoutAdapter.swift |
Vertaalt geïmporteerde AI-workouts naar runtime-workouts, categorieën en exporteerbare ZWO-workouts |
WattFlow/Services/AIPlanStore.swift |
Lokale opslag en verwijdering van het persoonlijke planbestand |
WattFlow/Services/WorkoutStore.swift |
Indexeren, imports en samenvoegen van built-in en imported workouts |
WattFlow/Services/WorkoutAnalyzer.swift |
IF/TSS-achtige analyse voor imports en classificatieinput |
WattFlow/Services/WorkoutCategoryClassifier.swift |
Regels die imports richting uithoudingsvermogen, omslagpunt, VO2max, kracht of test sturen |
WattFlow/Services/FreshnessTrainingAdvisor.swift |
Reduceert of vervangt actieve plansessies op basis van Freshness |
WattFlow/Services/FreshnessCalculator.swift |
Levert de herstelscore die de planadvisor en freshness-UI voedt |
WattFlow/Resources/WorkoutLibrary/*.json |
De huidige ingebouwde trainingsbibliotheken |
WattFlow/Resources/Plans/*.json |
Bundled plan-definities voor duur en fit |
Deze trainingsgids is afgestemd op de huidige trainingsbibliotheek, Schema/Training-verdeling, AI-planflow, progress review en freshness-bijsturing van 13 april 2026.