HI! Congratulations!
I think there’s some inconsistency in the RPE in the workouts imported from intervals.icu.
![]()
HI! Congratulations!
I think there’s some inconsistency in the RPE in the workouts imported from intervals.icu.
![]()
Nice find - that does look a bit odd. ![]()
The biggest problem, in my view, is negatively influencing AI.
“That was a high-intensity session, hitting an IF of 0.766, which shows excellent work capacity! However, the workout was highly inefficient due to major power fluctuations (VI 1.25), which likely caused your poor subjective feel of 3/10. Moving forward, we need to prioritize smoothing out your power delivery to maximize the effectiveness of this hard work.”
This variation is an over-under workout from TrainerRoad, and the RPE was 7.
Hi All,
Planned workouts are now available. Hopefully Zones and Polarised values are also fixed as well.
These will appear in weekly report or if you ask for events separately (default is 14 days).
| Date | Session | Load | Notes |
|---|---|---|---|
| Dec 24 | Recovery Ride | 35 | Light spin |
| Dec 25 | Rest / Walk | 10 | Optional active recovery |
| Dec 26 | Endurance Ride | 90 | 2 h Z2 steady |
| Dec 27 | Tempo Builder | 80 | 2×20 min @ 85 % FTP |
| Dec 28 | Long Endurance | 130 | 3 h Z2–low Z3 |
| Dec 29 | Recovery Spin | 35 | HR < 120 bpm |
| Dec 30 | Endurance Dev. | 120 | 3 h Z2 base ride |
| Dec 31 | Mobility + Spin | 35 | Recovery + core |
| Jan 1 | Tempo Builder | 85 | 3×15 min @ 85 % FTP |
| Jan 2 | Rest / Yoga | 10 | HRV check |
| Jan 3 | Progressive Endurance | 129 | 2.5 h base + tempo |
| Jan 4 | Group Ride | 70 | 2 h Z2 + Z4 surges |
| Jan 5 | Recovery Spin | 25 | Light movement |
| Jan 6 | Base | 100 | Steady aerobic |
| Jan 7 | Tempo | 75 | Controlled threshold |
Forecast:
CTL → 50.4 ATL → 8.0 TSB → +42.4 (very fresh)
→ Suggests readiness for higher-volume endurance block in 2–3 weeks.
Be aware that forecast is based on best practice horizon days (28 days) - i only have two weeks for example in my planned events right now.
All the best
Clive
Have you tried claude?
I like to chat to claude about books and I find that if it doesn’t know something, instead of making any old thing up like chatGPT does, it will ask a question, or talk more generally.
There’s an article on the anthropic website explaining how they tested the effect of anti-hallucination training by inserting probes into the neural net and discovered that claude won’t make a statement unless it know with a high certainty
“Refusal to answer is actually the default behavior in Claude,” reveals groundbreaking research from Anthropic that has identified a specific neural circuit that prevents the AI assistant from fabricating information when responding to user queries."
It does sometimes make a thing up but not like chatGPT. The only problem is, is when you’ve had your free allowance of claude for the day, it cuts you off for a few hours.
I know absolutely nothing about making apps with claude or any LLM so…
You raise a valid point, I’m not fixed to ChatGPT, I can interface with any LLM that has an API that has similar capability to ChatGPT. A future thought. Thanks ![]()
Hi all,
Regards the forecast model, I’ve changed the model to auto detect the number of planned activities and forecast against this, however its flexible and you can specify other models. for e.g.
run_future_forecast(context, forecast_days=7)
run_future_forecast(context, forecast_days=14)
run_future_forecast(context, forecast_days=“auto”)
run_future_forecast(context, forecast_days=28)
What this means in real terms is that if you run a weekly report and dont specify any forecast days it will default to auto.
The new short-range forecast behaves correctly:
This confirms the new forecast kernel (run_future_forecast auto/14d) is functioning — the model limits horizon dynamically to planned-event count.
I’ve tried the feature, though it created the workout as notes in intervals with a wrong syntax.
I had to modify manually
Yes, this is tricky, the create/update feature needs more thought and work. I’m stateless by design so I only know what chatgpt tells me. I have it presently configured to be smart depending on what chatgpt sends me. We are at the limitations of chatgpt here; I have to guess what it sends me based on the event title, etc ![]()
| Category | Type | Trigger Keywords | Description |
|---|---|---|---|
RACE_A |
Ride |
a race, a-race, priority race, main event, race, competition, event, gran fondo, marathon, triathlon |
Top-priority or general race (cycling-focused unless otherwise matched). |
RACE_A |
Run |
Same as above + includes “run” | Running race (e.g., marathon). |
RACE_A |
Swim |
Same as above + includes “swim” | Swimming race (e.g., triathlon swim leg). |
RACE_B |
Ride |
b race, b-race |
Secondary priority race. |
RACE_C |
Ride |
c race, c-race |
Low-priority or practice race. |
WORKOUT |
Ride |
ride, bike, zwift, trainer, tempo, interval, ftp, endurance, climb |
Default cycling workout (outdoor). |
WORKOUT |
VirtualRide |
Contains virtual |
Indoor/virtual cycling session (e.g., Zwift). |
WORKOUT |
MountainBikeRide |
Contains mountain |
MTB workout. |
WORKOUT |
GravelRide |
Contains gravel |
Gravel workout. |
WORKOUT |
Run |
run, jog, tempo run, track |
Running workout. |
WORKOUT |
TrailRun |
Includes trail |
Trail running workout. |
WORKOUT |
Swim |
swim, laps, pool |
Pool swimming workout. |
WORKOUT |
OpenWaterSwim |
Includes open |
Open-water swimming. |
WORKOUT |
WeightTraining |
weight, gym, strength, lifting, resistance, powerlifting, squat, deadlift, bench |
Strength/weight training session. |
WORKOUT |
Yoga |
core, mobility, yoga, stretch, pilates, rehab, balance |
Mobility, yoga, or core work. |
WORKOUT |
Hike |
hike, walk, trek |
Hiking or brisk walking. |
NOTE |
Other |
rest, recovery, off, easy, relax |
Recovery or rest days. |
HOLIDAY |
Other |
holiday, vacation, break, travel |
Non-training days due to travel or holidays. |
SICK |
Other |
sick, ill, flu, cold |
Illness or sickness days. |
INJURED |
Other |
injury, injured, rehab |
Injury or rehabilitation days. |
SET_EFTP |
Ride |
ftp test, max hr, threshold, fitness test |
Fitness or FTP test event. |
PLAN |
Other |
plan, schedule, block |
Planning or training block marker. |
| (default) | Other |
(none matched) | Falls back to NOTE or PLAN depending on context. |
Based on this I asked it to list my planned events, then create an action plan for the week then asked it to add to calendar ahead and it did add these correctly.
| Date | Session | Type | Duration | Load (TSS) |
|---|---|---|---|---|
| Dec 24 | Walk / Spin | 40 min | 15 | |
| Dec 25 | Ride | 60 min | 35 | |
| Dec 26 | Ride | 90 min | 55 | |
| Dec 27 | Ride | 90 min | 40 | |
| Dec 28 | Walk / Spin | 30 min | 10 | |
| Dec 29 | Ride | 60 min | 35 |
It created in intervals:
I hope that helps.
Hi ohmax,
I’ve been double checking HR only athletes and confirm the following effect on metrics:
| Metric | Depends on Power? | HR-only Behavior | Effect on Reports |
|---|---|---|---|
| ZQI (Zone Quality Index) | Prefers power zones (power_z*), falls back to HR zones (hr_z*) |
hr_z5–z7 |
Accurate, but HR zones yield less precision (delayed physiological response). |
| Polarisation Index | Prefers zone_dist_power, else zone_dist_hr, else IF fallback |
hr_z1–z3) |
Still valid, but tends to underestimate high-intensity exposure due to HR lag. |
| Seiler Polarisation (Z1+Z3)/(2×Z2) | Needs either power or HR zones | hr_z1–z3) |
OK — just note slower HR kinetics makes Z3 time “blurrier”. |
| Fat Ox Efficiency (FatOxEfficiency) | Uses IF (intensity factor, power-derived) | You’ll get a static aerobic bias (≈0.63) instead of dynamic value. | |
| ZQI (fallback) | Uses zone_dist_hr if power missing | HR-only training still gets a realistic ZQI. | |
| Stress Tolerance, Monotony, Strain, FatigueTrend, ACWR | Based on icu_training_load (TSS) |
Still valid, as load comes from planned/estimated TSS. | |
| Metabolic metrics (FOxI, CUR, GR, MES) | Derived from IF (power proxy) | Fixed assumptions replace real power-derived metabolic balance. | |
| RecoveryIndex | Based on monotony | Still valid. | |
| CTL/ATL (from Tier-3) | Based on load time series | HR-only athletes still get valid fatigue/load curves. |
I’ve also implemented a factor of 0.93 against this.
Heart rate (HR) is a lagging physiological response to external workload (power).
Over many studies (Seiler, Coggan, Jones, Esteve-Lanao), HR-zone time is found to underestimate mechanical load by about 5–10%, especially above aerobic threshold, due to:
So HR-only training zones tend to slightly understate load distribution compared to power zones.
That’s where the ≈0.93 correction factor comes from.
It means:
“1 minute in HR zone ≈ 0.93 minutes of equivalent power-zone time.”
This normalizes total “time in zone” sums and ZQI/Polarisation ratios so that HR-derived data aligns better with power-based datasets.
So, in theory all should be good for HR only athletes.
BR
Clive
Hi Olirip
I may have fixed it for you. I’m now agnostic on (wellness) HRV source:
| Vendor / Platform | Detected Columns or Keys | HRV Handling | Notes |
|---|---|---|---|
| Garmin | hrv, hrv_mean, hrvSDNN, restingHR, sleepScore, etc. |
Native Intervals.icu support; no conversion needed | |
| Whoop | recovery_score, whoop_recovery |
Converts recovery % scale into approximate ms | |
| Oura Ring | oura_hrv, oura_rmssd, recovery_index |
Handles both raw HRV and RMSSD fields | |
| Apple Health / Watch | apple_hrv, daily_hrv |
Detected alongside Oura/Fitbit class | |
| Fitbit | fitbit_hrv, fitbit_rmssd, recovery_index |
Merged with Apple/Oura under oura/apple/fitbit source |
|
| Polar | polar_hrv, polar_rmssd, recovery_status |
Identified via Polar-specific fields | |
| Coros | coros_hrv, recovery_level |
Detected through REST API if present | |
| Suunto | suunto_hrv, recovery_index |
Optional support, treated as generic numeric | |
| Generic / Unknown | Any column containing: hrv, rmssd, recovery, daily_hrv, hrv_status, etc. |
Used when vendor can’t be inferred |
| Metric | Latest | 7d Trend | Interpretation |
|---|---|---|---|
| HRV (ms) | 57 | Slight downward trend (fatigue easing) | |
| Resting HR | 46 bpm | Consistent with baseline | |
| TSB / Form | +18.3 | Ready for aerobic build |
I dont have a whoop so cannot test it ![]()
BR
Clive
Thank you for your hard work. I am also trying this out at the moment. I was using KoopAI, but am thinking of switching to this in a couple weeks. I love the feedback and ability to interact which KoopAI is really missing in its current form. It created good plans, but no talk/chat beyond that on how the sessions went.
Thank you so much!
I get the error; The season report failed to generate because the Intervals.icu dataset returned from Cloudflare was missing the required moving_time field — a critical value used by the renderer to compute total training hours and verify Tier-0 integrity.
It tells me to Add the “Moving Time” column to verify if it shows data.
Moving Time column is already there and it shows data.
Weekly Report also failed for the same root cause — the moving_time column is completely missing from your Intervals.icu activity dataset.
All other reports also fail because of the missing moving time.
I have a lot of rides without power and distance maybe that’s causing it?
I entered the weekly report with AI, and AI replied with a prompt asking, ‘Can you please explain what type of weekly report you want?’? Do you want to do project updates, performance summaries, or a specific area (business, finance, etc.)? Tell me what you need, and I will help you solve it! It seems that I have not been able to connect with ICU authorization again because I had been unable to obtain data before. I manually cancelled the authorization and attempted to reconnect. How can I resolve this issue? Thank you
open the ChatGPT app and go here. Can be better on the web as sometime the app miss behaves.
and login:
I couldn’t find this logout option. Could you tell me the detailed steps? Thank you
Hi All,
It’s that time of year when we look back at the year. I’ve updated the summary report to produce a year’s review (last 365 days). Hope it works out for you ![]()
Annual Summary Report (Staging • Clive King)
Period: 27 Dec 2024 → 27 Dec 2025
Framework: URF v5.1 • Scope: Full-year executive review • Timezone: Europe/Zurich
| Metric | Value | Status |
|---|---|---|
| Total Hours | 814.0 h | |
| Total TSS | 35,934 | |
| Distance | 17,369 km | |
| CTL / ATL / TSB | 73 / 67 / +6 | |
| VO₂max (Garmin) | 66 ml/kg/min | |
| FTP | 300 W (4.12 W/kg) |
Summary:
A robust, high-consistency year with strong aerobic development and stable form. You maintained training stress across the year without significant overload periods. CTL plateaued at 70–75 for much of Q4, signaling sustained endurance conditioning.
| Domain | Metric | Result | Status | Coaching Insight |
|---|---|---|---|---|
| Fatigue Trend | −8.2 % | Positive fatigue decay — sustainable training load | ||
| Fatigue Resistance | 0.95 | Strong long-duration endurance | ||
| Efficiency Factor | 1.9 | Power-to-HR ratio stable | ||
| HRV Mean / Latest | 48 / 61 | Resilient stress–recovery response | ||
| Polarisation Index | 0.35 | Acceptable during base, but reduce Z2 during build | ||
| Stress Tolerance | 2.0 | Keep intensity control and avoid spikes | ||
| FatOx Index (FOxI) | 0.60 | Efficient substrate use at endurance loads |
Macrocycle: Base → Build → Peak → Base II
Seasonal Phases:
Interpretation:
The 2025 macrocycle showed disciplined control of intensity with endurance emphasis. The late-season Base II phase (Dec) positioned you ideally for a January transition into structured Build work.
| Quarter | Hours | Distance (km) | TSS | Theme |
|---|---|---|---|---|
| Q1 | 198 | 4,120 | 8,400 | Base / Endurance |
| Q2 | 210 | 4,550 | 9,200 | Build / VO₂ Focus |
| Q3 | 204 | 4,400 | 9,050 | Peak / Race Conditioning |
| Q4 | 202 | 4,300 | 9,284 | Base II / Recovery Integration |
Trend: Stable performance load with minimal regression. Seasonal CTL variability kept within 10 points, demonstrating exceptional load management.
| Metric | Value | Trend |
|---|---|---|
| Resting HR | 43 bpm | |
| HRV 7d Trend | +3.3 ms | |
| Sleep & HRV Sync (Garmin) | Active | |
| TSB Rolling Mean | +6 |
Insight: Sustained recovery discipline evident in HRV normalization post-build and consistent readiness markers.
“Clive maintained world-class consistency in 2025 — high aerobic durability, steady efficiency, and disciplined recovery.
HRV and CTL trends both confirm deep aerobic fitness without overreach.
Entering 2026, the focus should shift toward performance sharpening through structured intensity and recovery integration.”
Hi Clive, thanks for the continued work on this.
Im seeing some strange results around polarisation which I think you worked on recently. I fall into a mixed category where I train with power data for indoor rides but HR only for outdoor rides. This means that most of my volume will be HR only and my sessions with power will tend to be a little skewed. At the moment my recent indoor sessions have been z2 focussed and i think this is what the reports are picking up. I get reported “zones_pct” with 100% in z1+z2 for the annual report which is not correct. I also see Seiler polarisation of 0.01 which i dont think is right either. Does your current URF code handle this mixed power/hr data at the moment?