Last reviewed: September 16, 2026
What goes into the calculation
The engine works exercise by exercise and client by client. Every time the client finishes a session in the app, it takes these inputs and nothing else.
- The logged sets
- The weight and reps of every set marked as completed. A set with no weight or no reps (skipped, or from an unloaded exercise) does not count.
- The exercise's RIR
- One value per exercise: the reps in reserve the app asks for when the exercise ends. If the client does not report it, or the question is turned off, the calculation uses 0.
- Each week's template
- The reps and RIR the coach prescribed for every set of that week. These are the routine's original values, not what the engine wrote later.
- The exercise's minimum increment
- Read from the exercise library, in kilograms or pounds depending on the client's unit. If the exercise has none defined, the engine uses 1 unit.
- The exercise type
- Whether it carries load, whether it is measured in reps, time or distance, and whether it is flagged as principal or secondary within the session. Each combination follows a different rule.
- Recent history
- The client's last three executions of that exercise, in any routine, as long as they are less than 56 days old. They keep a single bad or good session from moving the whole prescription.
Method
These are the steps, in the order they run. All of them are deterministic arithmetic over a table: no language model is involved in any of them.
Reduce the session to one data point
The engine averages the weight of the completed sets (to two decimals) and averages the reps, rounding down. It attaches the RIR reported for the exercise. Three sets of 8 at 60 kg with RIR 4 become 60 kg, 8 reps, RIR 4.
Estimate the 1RM
Reps plus RIR give the equivalent reps: the ones the client would have done to failure. That number, capped at 20, is looked up in the coefficient table below. The estimated 1RM is the weight divided by the coefficient, to one decimal. With 60 kg and 12 equivalent reps the coefficient is 0.70 and the 1RM is 85.7 kg.
Smooth it with history
The 1RM used to prescribe is not just today's. It is the mean of the estimated 1RMs of the last three executions of that exercise, today's included, dropping any older than 56 days and any with no loaded sets. If there is no other execution, today's is used. An old execution never comes back in: after a long break, the first session rules on its own.
Compute the raw weight for each following week
For every week that follows, the engine takes that week's template reps and RIR, adds them, finds the matching coefficient and multiplies it by the 1RM. That is the raw weight, to one decimal. Because each week can carry its own prescribed RIR, the raw weight changes from week to week even when the 1RM does not.
Round to an increment that exists on the rack
The raw weight can almost never be loaded with plates. The engine compares it with the reference weight (the actual weight of the previous week's last completed set, or its target if it was not trained), divides the difference by the minimum increment and keeps only whole increments, always rounding toward the reference. The remainder is discarded, not carried. With a 4.3 kg difference and 2.5 kg plates, the weight goes up 2.5 kg.
If the weight cannot move, the reps do
When the difference does not reach a whole increment, the weight stays and the engine changes the rep target instead. On a principal exercise the new target is the previous total effort (reps done plus reported RIR) plus one, minus the template RIR, which is kept. On a secondary exercise it compares that total effort with the template's: if it exceeds it, RIR is set to 1 and the target is one rep below the total; if it falls short, RIR is set to 1 and one rep is added to the reps done.
Unloaded, timed and distance exercises
An unloaded exercise measured in reps copies the reps the client did into the following weeks, only when they differ from the template. An exercise measured in time or distance is not recalculated: the following weeks receive the logged values as they are, weight included if it had one.
Write only where it belongs
The result is saved only into the weeks after the trained one that are still pending and whose last author is the engine. It writes the weight and reps of each set and the week's target RIR. Rest, set technique (a dropset, for instance) and notes stay as they were.
The coefficient table
This is the relation between equivalent reps and fraction of 1RM the engine uses, derived from the NSCA chart. It is read both ways: to estimate a 1RM from a set and to go from a 1RM down to the weight of a prescription.
| Equivalent reps (reps + RIR) | Fraction of 1RM |
|---|---|
| 1 | 1.000 |
| 2 | 0.950 |
| 3 | 0.930 |
| 4 | 0.900 |
| 5 | 0.870 |
| 6 | 0.850 |
| 7 | 0.830 |
| 8 | 0.800 |
| 9 | 0.770 |
| 10 | 0.750 |
| 11 | 0.725 |
| 12 | 0.700 |
| 13 | 0.685 |
| 14 | 0.670 |
| 15 | 0.650 |
| 16 | 0.640 |
| 17 | 0.630 |
| 18 | 0.620 |
| 19 | 0.610 |
| 20 | 0.600 |
A worked example
Bench press, three sets of 8, minimum increment 2.5 kg. The template prescribes RIR 2 in weeks 1 and 2 and RIR 1 in week 3. In week 1 the client logs 60 kg on all three sets, 8 reps each, and reports RIR 4. There is no prior history on the exercise.
| Step | Arithmetic | Result |
|---|---|---|
| Performance | mean of 60, 60 and 60 kg; mean of 8, 8 and 8 reps; RIR 4 | 60 kg, 8 reps, RIR 4 |
| Equivalent reps | 8 + 4, capped at 20 | 12, coefficient 0.70 |
| Estimated 1RM | 60 / 0.70 | 85.7 kg |
| Baseline | no other executions within 56 days | 85.7 kg |
| Week | Template | Raw weight | Reference | Prescription |
|---|---|---|---|---|
| 2 | 8 reps, RIR 2 (10 equivalent, 0.75) | 85.7 × 0.75 = 64.3 kg | 60 kg (actual from week 1) | 62.5 kg × 8, RIR 2 |
| 3 | 8 reps, RIR 1 (9 equivalent, 0.77) | 85.7 × 0.77 = 66.0 kg | 62.5 kg (week 2 target) | 65 kg × 8, RIR 1 |
In week 2 the gap between raw and reference is 4.3 kg: one whole 2.5 kg increment, and the remaining 1.8 kg is discarded. In week 3 the gap is 3.5 kg over the 62.5 kg already prescribed, another whole increment.
Had the same client reported RIR 3 instead of 4, the 1RM would be 82.8 kg and the week 2 raw weight 62.1 kg. The gap to the 60 kg reference is 2.1 kg, less than an increment, so the weight stays at 60 kg and the rep target becomes 8 + 3 + 1 − 2 = 10. Week 2 would read 60 kg × 10, RIR 2.
The same case with a 1 kg minimum increment (the default when the exercise defines none) would give 64 kg in week 2: four whole increments inside the 4.3 kg gap.
Limits
What the engine does not do, because the code does not cover it. All of this is still the coach's work.
- It does not program deloads. A routine's prescribed RIR can drop week by week because the template says so, but there is no logic that detects accumulated fatigue and lowers load or volume.
- It does not change the number of sets or the rest times. It only writes weight, reps and target RIR.
- It reads weight, reps and RIR only. No RPE, sleep, adherence, pain, client notes or any other signal.
- If RIR is missing it is taken as 0. That is the most conservative reading possible: it assumes the set went to failure and underestimates the 1RM.
- Rounding is always toward the reference weight: it never prescribes above the raw weight and never carries a remainder from one week to the next. An improvement smaller than an increment turns into reps, not weight.
- Accuracy drops with reps. The table assumes a fixed relation between reps and fraction of 1RM; past 10 equivalent reps the estimate is a reference, not a measurement.
- It does not touch the trained week or earlier ones, and it never touches again a week the coach or the client edited.
- Timed and distance exercises are carried forward, not recalculated. And a new exercise, with no history, is prescribed from today's session alone.
What the coach decides
The arithmetic is automated; the judgment is not. These are the controls that exist in the product, verified in the same code.
- A global switch and a per-client one. With progression off, the following weeks receive the values logged in the last session, with no 1RM recalculation.
- The RIR question can be turned on or off globally and per client. Turning it off does not stop the calculation: it makes it conservative, because RIR becomes 0.
- Any week the coach edits leaves the engine's scope permanently. The whole routine opens as a table where weight, reps and RIR can be edited week by week.
- A generated routine reaches the client when the coach sends it. Until then it is a draft.
- There is no approval inbox: in the weeks nobody touched, the load is written on its own when the client closes the session.
Methodology notes
- Last reviewed: September 16, 2026.
- Source: kaizer-backend production code, progression feature (1RM estimation, the load updater and its entry point when a session is closed), reviewed on 2026-09-16. This page describes what that code does, not what documentation promises.
- The coefficient table derives from the NSCA reps and percentage of 1RM chart. This site's public 1RM calculator uses Epley and Brzycki for illustration; the engine uses neither.
- The calculation runs at two moments: when the client closes a session and when the coach extends the weeks of a routine. In both cases it writes only future weeks that are pending and engine-written.
- When the algorithm changes, this page and its review date change with it. If a number here does not match what you see in the product, the date tells you which of the two is older.
