Skip to main content

Fatigue & Risk Index (FRI)

Fatigue and Risk indexes in Skillo​

We calculate the Fatigue Index and Risk Index for each shift.

We use the same algorithm as the HSE Fatigue and Risk Index Calculator — the rr446cal.xls tool (version 2.3) supplied by QinetiQ for HSE alongside research report RR446 — in the copy hosted by Network Rail: HSE-Fatigue-and-Risk-Index-FRI-Calculator.xlsm.

Skillo enforces day FRI 35+, night FRI 45+ and risk 1.6+ as described in the fatigue reduction triggers and the rail fatigue compliance guide.

We did not and do not alter the algorithm in any way.

The Fatigue and Risk index algorithm​

The HSE FRI is an advanced tool designed to calculate the Fatigue Index and Risk Index of employee shift schedules.

Unlike basic calculators that simply look at the number of hours an employee works or how many hours of rest they get, this algorithm acts as a biomathematical model: it combines components fitted to field data, including a fixed circadian (body-clock) term, to estimate how sleepy a worker is likely to be on a given shift.

The Biological Clock and Circadian Rhythm​

The most crucial feature of this algorithm is how it handles the Circadian Rhythm (our body's internal 24-hour clock). Human biology dictates that we are meant to be awake during the day and asleep at night.

Because of this, the algorithm heavily penalizes schedules that force a worker to fight their biology. For example, if an employee switches from a day shift to a night shift, their Fatigue and Risk scores will spike dramatically—even if they are given a perfectly legal, long break between the shifts.

This happens for two reasons:

  1. Truncated Recovery: If a night-shift worker goes to bed at 7:00 AM, their biological clock will wake them up after only a few hours of sleep, meaning they cannot fully recover. The algorithm recognizes this and calculates a "sleep debt".
  2. The "Witching Hour": Working during the circadian low — roughly between 2:00 AM and 6:00 AM — mathematically triggers an automatic increase in risk and alertness failure within the algorithm, regardless of how rested the worker is. The research behind the model puts the lowest performance at 3:00-6:00 AM; in the algorithm the Risk Index's time-of-day peak sits close to midnight and the Fatigue Index's about five hours later, in the early morning.

In short, this algorithm measures not just HOW MUCH time off a worker gets, but WHEN that time off occurs.

What the indexes do not know

The FRI is a screening model built on average data. It does not know how long or how well a candidate actually slept, it does not account for individual differences, and it assumes the body clock has not adapted to night work — the research report notes the Fatigue Index can be inappropriate for permanent night workers whose clocks do adjust. HSE publishes no pass/fail thresholds for the raw index values: the trigger levels used in Skillo (day Fatigue Index 35, night Fatigue Index 45, Risk Index 1.6) come from the Network Rail standard, not from HSE. Use the indexes to compare and diagnose patterns, not as an absolute verdict on an individual.

The three components​

The algorithm calculates the Fatigue Index and Risk Index per duty (shift) by evaluating three distinct components, described below.

Within the duty-timing estimate, three effects fitted to field data from aircrew and train-driver studies are combined: the duty's start time, the circadian time-of-day rhythm, and duty length (time on task). The result is expressed on a Karolinska Sleepiness Scale (KSS) basis — the Fatigue Index is the probability, times 100, of a high KSS score (8 or 9), which is known to be associated with microsleeps.

Each component produces a fatigue value and a risk value. Those six values are then combined into the two indexes — see How the indexes are calculated.

If one of your indexes looks high, the component breakdown tells you where the problem is — and each component responds to a different set of levers.

Duty Timing Component​

What it measures: the fatigue and risk that come purely from when the duty starts and how long it lasts, assuming a standard baseline workload. It steps through the duty in 15-minute slices, combining the start-time effect, the circadian time-of-day effect and time on task, and estimates sleepiness for each slice.

What drives it up:

  • Duty length. The risk part of this component is essentially flat for duties of up to about 8 hours and then rises steeply — a 10 or 11 hour duty is much riskier than an 8 hour one.
  • Time of day. The risk calculation uses a 24-hour sine wave that inflates the risk the more the duty overlaps the night hours. Note that this risk term peaks close to midnight — earlier than the fatigue peak and the body's own circadian low (see the "Witching Hour" below). A duty that runs through the small hours of the morning (especially ending near dawn) still scores far higher than the same duty worked in daylight.
  • Commuting. The commute stretches the effective exposure window, so duties with a long commute score slightly higher than the same duties with a short commute.

This is the component that makes night work inherently more expensive — no amount of rest can fully cancel it, only the shape of the shift itself can.

Breaks Component​

What it measures: how much fatigue builds up within the shift because of the workload, the attention demands and the break pattern. The algorithm tracks a recovery factor (Rr) that grows with every stretch of continuous work and is partially reset by each break.

What drives it up:

  • Demanding workload / attention frequency. The more demanding the work is rated and the more attention it requires, the faster fatigue accumulates.
  • Long stretches of continuous work. The longer each work stretch between breaks, the less recovery happens.
  • Short or infrequent breaks. Break length matters a lot, and the recovery curve is steep in the middle: a 10-minute break recovers only about a fifth of the built-up risk, 15 minutes about two-thirds, 20 minutes about 90%, and 30 minutes or more essentially all of it.

Note that in Skillo the break pattern sent to the algorithm is derived from the recorded break allowance — we spread it evenly across the shift, as many breaks as possible while every break stays at least 20 minutes (see Smarter break modelling).

Cumulative Component​

What it measures: the fatigue and risk carried over from previous duties — sleep opportunity, sleep debt and how both build up day after day. It is the most complex factor and typically dominates the final indexes.

It is driven entirely by the real duty calendar — the days worked and each duty's start and end times. Internally the algorithm also reserves a fixed 30 minutes of travel time at the start and end of every duty. Nothing else that is sent to the algorithm changes it — not commuting time, not workload, not attention frequency, and not the break pattern (that one only affects the Breaks Component).

What drives it up:

  • Rest between duties is the strongest lever. The algorithm reserves about an hour of the rest for travel (30 minutes at each end). Below roughly 9 hours of remaining rest — that is, below about 10 hours of real rest — every duty adds risk (exactly 0.06 per missing hour) and every missing hour becomes a modeled hour of lost sleep for that day (bounded by the model's separate late-start sleep-loss term, whichever is smaller). Above that threshold the build-up slows but does not stop: the model still adds a smaller amount for each duty until there is a full day off. Network Rail's standard requires at least 12 hours of rest between shifts (see Fatigue Reduction) and the research behind the index suggests at least 16 hours between consecutive night shifts — so aim for 12 hours or more.
  • Days off let the score recover. Once the rest between duties passes 24 hours (a full day off), the carried-over part of both indexes starts decaying back toward its baseline — see Days off in numbers below.
  • Late ends cost sleep. The later a duty ends, the later the modeled bedtime and the less sleep is credited. Sleep is modeled as full for duties ending by about 18:00 and starts dropping after that — roughly 0.1 hours lost for an 18:30 end, 0.4 hours for a 20:00 end and over an hour by midnight. Duties ending in the small hours keep losing more sleep overall, but that extra loss is charged through the late start rather than through an even later bedtime.
  • Very late starts push everything later. A duty starting after roughly 22:45 moves the whole shift into the small hours, and from that point the modeled sleep loss is driven smoothly by how late the shift runs — a later end means a later bedtime and less credited sleep. There is no separate steep penalty stacked on top: the model's early-wake (bedtime) term caps the late-start sleep loss, it never adds to it.
  • Consecutive days compound. Sleep debt carries over from one day to the next, so a run of back-to-back duties keeps pushing the score up even when each individual day looks acceptable.

Days off in numbers​

How much of the carried-over part comes back with consecutive full days off (approximate modeled values — the exact figures shift a little with the start and end times of the duties around the break):

Consecutive full days offCarried-over riskCarried-over fatigue
1no decay yet with ordinary day-hour duties — the day simply adds nothing newabout half of the remaining deficit recovered
2 (a weekend)about two-thirds of the excess goneabout three-quarters recovered
3about 90% goneabout 90% recovered
4-5practically back to baseline97% or more recovered

Worth knowing:

  • The risk decay only starts from the second consecutive day off — and that assumes ordinary day-hour duties on both sides. If the duties around the break start before about 07:30, or finish in the small hours, the risk already decays on the first day off: for a pattern starting at 06:00 a single day off removes about 60% of the carried-over excess.
  • Each additional day off roughly halves whatever fatigue deficit is left — the fatigue side starts recovering from the very first day off, but a weekend or a 3-day break does most of the work.
  • These percentages describe the carried-over part only. The duty that follows the days off is still scored on its own timing and breaks, so a night shift right after a long weekend will not come back to zero — the indexes converge toward the level of the pattern as a whole.
  • Days off only recover what is actually carrying over — if the scores are already low, there is little for a day off to bring down.
  • These percentages come from the model itself, not from field measurements. The research report states there is no field data on how quickly risk recovers after a run of consecutive shifts, so its recovery curve was designed to follow the Fatigue Index's. Network Rail's own guidance points the same way: two full nights' sleep after a block of nights, and avoid single days off where possible.

In short: the Cumulative Component rewards steady rhythms — enough rest between duties and full days off. There is no data tweak that can replace that; the only input that matters is the real schedule.

To model "Truncated Recovery" (the biological difficulty of sleeping during the day), the amount of restorative sleep is calculated using a logistic (sigmoid) function based on the worker's BedTime:

RKFit = -2.28827436527851 + 11.7995318577367 /
(1 + 0.472949055173571 * Math.Exp(-1.77393493516727 + 0.16244804759197 * (BedTime - 20)));

The highly precise decimal values are not universal constants, but empirical coefficients fitted to reported sleep durations from sleep diaries — aircrew diary studies and shiftworkers' diaries as summarised in the HSE research report (RR446). In the calculator the fitted curve is a logistic (sigmoid) function of bedtime, which maps the non-linear drop-off in sleep duration as a worker goes to bed later into the morning.

How the indexes are calculated​

Fatigue Index​

The Fatigue Index is a probabilistic combination of the three components:

FatigueIndex = 100 * (1 - (1 - CumulativeComponentFatigue) * (1 - DutyTimingComponentFatigue - BreaksComponentFatigue))

Within the Cumulative component, a KSS value (pKss) is derived to estimate sleepiness from the modeled sleep debt and the circadian timing of the duty.

Risk Index​

The Risk Index is a straightforward multiplier of the three components:

RiskIndex = CumulativeComponentRisk * DutyTimingComponentRisk * BreaksComponentRisk

The Duty Timing risk includes a 24-hour sine wave that inflates the multiplier the more the OnDuty hours overlap the night hours — its peak sits close to midnight, a few hours before the fatigue side peaks in the early morning.

Bringing the Fatigue and Risk Index back down​

Which lever to pull depends on which component is high. In Skillo you can see the component breakdown per shift, so use it as a diagnosis:

If the Duty Timing Component is high​

  • Shorten the duty. The risk curve is essentially flat up to about 8 hours and then rises steeply — trimming a duty from 11 to 8-9 hours makes a real difference.
  • Reshape night duties. A duty that runs through the early hours of the morning scores much higher than the same hours worked in daylight. Where the work allows it, start a night duty earlier so it ends before dawn, rather than stretching it to a late finish.
  • Mind the commute. Commuting stretches the exposure window. A shorter commute or a site closer to the candidate's home helps.

If the Breaks Component is high​

  • Add a break to the shift — this is the single most effective action for this component.
  • Make the break count. The recovery curve reaches half its effect at about 13-15 minutes and is essentially complete by 30 minutes, so a 10-minute break recovers only about a fifth of the built-up risk while a 20-minute one recovers about 90%. That is why Skillo never models a break below 20 minutes — and why one 40-minute break beats two 10-minute ones.
  • Keep the work stretches short. The recovery factor grows with every stretch of continuous work, so the same break allowance split evenly across the shift scores better than one big break in the middle of a long stretch.
  • Check the workload and attention frequency ratings. If a duty is marked "Extremely demanding" / "All or nearly all of the time" but the work is really moderate, correcting the rating will bring the index down.

If the Cumulative Component is high​

  • Give at least 12 hours of rest between duties. About 10 hours is where the algorithm's own penalty starts, but 12 hours is the Network Rail standard (see Fatigue Reduction) — and blocks of nights need more.
  • Give full days off — consecutively. Two consecutive rest days is where the real recovery starts (the carried-over risk loses about two-thirds of its excess, the fatigue deficit closes by about three-quarters); three days off bring it back roughly 90% of the way (see Days off in numbers).
  • Break up long runs of consecutive duties. Sleep debt compounds day by day, so inserting a rest day in the middle of a run helps more than adding it at the end.
  • Bring duty end times earlier. End times drive the modeled bedtime and the sleep credited for that night; very late starts (after roughly 22:45) cost sleep mainly by pushing the end later.
  • Avoid switching sharply between day and night work. The circadian penalty applies to the pattern, so steadier rotations score better than frequent flip-flops.
A high index is information, not a punishment

📌 The Fatigue and Risk Indexes are a diagnostic: they tell you which part of the schedule is costing the candidate recovery. Fix the schedule and the indexes follow.

What we send to the algorithm​

We send in the same information that you would put in the excel file.

There are 4 parameters for the algorithm describing the shift break pattern.

We did not want to create as much friction in Skillo so we simplified things a bit.

Described below.

🔵 day

  • The day the shift starts on

🔵 on duty

  • Shift start time

🔵 off duty

  • Shift end time

🔵 commuting time

  • The total of the departure plus arrival time divided by 2

🔵 breaks frequency

  • The length of one work stretch between breaks: the total duration of the shift, minus the break, divided by the number of breaks + 1.

  • We spread the break allowance evenly across the shift — as many breaks as possible while every break stays at least 20 minutes.

  • If you have a 9 hrs shift with a 1hr break this will be 3 breaks of 20 minutes, so (9 - 1) / (3 + 1) = 2 hrs of continuous work.

🔵 breaks average

  • The average break length: the break duration divided by the number of breaks.

  • For the 9 hrs shift with a 1hr break this will be 60 / 3 = 20 minutes.

🔵 longest work

  • Same as breaks frequency — the longest stretch of continuous work.

🔵 breaks after longest work

  • Same as breaks average — the break that follows the longest stretch of work.

If the recorded break is shorter than 40 minutes it cannot be split into effective 20-minute breaks, so we keep describing it as a single break in the middle of the shift, exactly as before. On very short shifts we also never model a work stretch below 30 minutes.

Spreading the break this way keeps the same total break time but lowers the Risk Index — see Smarter break modelling for the why and the numbers. (A single long break is marginally better for the fatigue component; the risk reduction is the reason we spread them.)

🔵 workload

  • One of the following:

    • Extremely demanding, no spare capacity

    • Moderately demanding, little spare capacity

    • Moderately undemanding, some spare capacity

    • Extremely undemanding, lots of spare capacity

🔵 attention frequency

  • One of the following:

    • All or nearly all of the time

    • Most of the time

    • Some of the time

    • Rarely or nearly none of the time

Have more information about the FRI algorithm?

📌 If you have additional information, insights, research, or details regarding how the Fatigue and Risk Index algorithm works, we would love to hear from you!

Please reach out and send your suggestions or information to team@skillo.co.uk.