WattFlow trainingsgids

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.

Gebaseerd op
TrainingenTabView.swift PlanView.swift AIPlanViews.swift AIPlanImportService.swift AIPlanWorkoutAdapter.swift TrainingPlanCatalog.swift FreshnessTrainingAdvisor.swift WorkoutCategory.swift JSON-libraries
Datum: 13 april 2026 Scope: trainingsbibliotheek, Schema/Training-flow, vaste plannen, AI-planimport, promptopbouw, progress review en freshness-bijsturing

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.

Belangrijk ontwerpprincipe. De trainingslaag is bewust indoor-first. Dat zie je terug in de duurvensters, de statische blokopbouw, het beperkte aantal lange sessies, de vaste workout-IDs in catalogusplannen en de strikte JSON-contracten voor AI-plannen zodat ook gegenereerde schema’s later stabiel in dezelfde appstructuur passen.

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-.fit en 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 AppModel en worden direct op de geïndexeerde lijst toegepast.
  • Imports worden gekopieerd naar Documents/Trainingen en 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

Belangrijke nuance. Sweet spot zit in de huidige app onder Uithoudingsvermogen en niet onder Omslagpunt. Dat is dus een bewuste UI-keuze: de bibliotheek groepeert sessies op gebruikersgevoel en trainingsfamilie, niet alleen op theoretische zoneleer.

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: .zwo en workout-.fit worden trainingsitems.
    • Activiteiten: activity-.fit en .tcx worden 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 AIPlanStore het volledige plan lokaal.
    • AIPlanMapping geeft het plan een vaste prefix ai_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.
    Belangrijke nuance. De app genereert niet zelf de volledige plan-JSON. WattFlow bouwt de prompt, laat de gebruiker die in een extern model plakken en importeert daarna alleen JSON die exact aan het contract voldoet. Daardoor blijft de app model-agnostisch, maar dwingt ze wel een strakke structuur af.

    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_targets of 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
    • FreeRide buiten testworkouts
    • Dubbele workout-IDs
    • Onbekende workoutreferenties in een week

    Waarschuwingen die wel mogen

    • Legacy schema 1.0 zonder generator-object
    • duration_weeks komt niet overeen met aantal weken
    • Niet elke week heeft precies sessions_per_week sessies
    • 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, behind of onTrack.
    • 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:.

    Belangrijke koppeling met de Freshness-pagina. De trainingsgids beschrijft hier alleen hoe plansessies op Freshness reageren. De volledige readiness-architectuur achter Freshness, inclusief morning readiness, day score, confidence, trends en trainability, staat apart in WattFlow_Freshness.html. Voor de letterlijke codeflow, ankerkeuze, HRV-selectie, confidence-penalties en advisor-drempels staat er nu ook een aparte Freshness-audit.
    Situatie Actie Intensity factor Duration factor
    illness == likelyReplace0.650.60
    illness == possible of hogere caution + intensieve sessieReplace0.720.70
    generalLoad == high + intensieve sessieReplace0.750.75
    trainability == low + intensieve sessieReplace0.740.72
    trainability == low + rustige sessieReduce0.900.78
    confidence == low + intensieve sessieReduce0.900.85
    freshness < 40 + intensieve sessieReplace0.720.60 tot 0.80
    freshness < 40 + rustige sessieReduce0.900.60 tot 0.80
    freshness 60-69Reduce0.95 tot 0.970.92 tot 0.95
    freshness 50-59Reduce0.950.90
    freshness 40-49Reduce0.920.85
    trainability == controlled + intensieve sessieReduce0.960.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

    Waarom twee libraries? De FTP-library is strakker en explicieter periodiseerd. De Endurance & Fit-library moet juist rustiger voelen, minder mentale druk geven en bruikbaar blijven voor onderhoud of algemene duurverbetering zonder dat elke sessie meteen “FTP werk” wordt.

    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.