Skip to content

e1RM policy changelog

3.0.0 — 2026-09-04

Breaking update that keeps the pinned Nuzzo 2024 curve and replaces the five-band perceived-effort input with a single RPE number (issue #1237).

  • The effort input is exercise_sets.perceived_rpe (1.0..10.0, one decimal). The lift-guild.perceived-effort@1.0.0 five-level wire contract is retired; stored levels were converted once as RPE = level + 5.
  • RIR is derived directly as 10 − RPE. RPE ≥ 6.0 is a closed RIR (medium confidence inside support); RPE < 6.0 keeps an open upper bound (low confidence); a missing RPE keeps the conservative RIR 0 open estimate.
  • Half steps (8.5 → RIR 1.5) feed effective repetitions directly through the source-knot inverse interpolation.
  • Legacy difficulty (June–July 1..10 numbers) was converted once at cutover (≤3→7, ≤6→8, ≤8→9, else 10) and the column was dropped; raw values stay in raw_payload.legacy_difficulty.
  • Requires a full historical strength-projection replay.

2.0.0 — 2026-08-12

Breaking update that keeps the pinned Nuzzo 2024 curve and changes how observed repetition failures contribute strength evidence.

  • Positive-repetition failures now use actual completed repetitions with observed RIR 0 and participate as medium-confidence e1RM candidates inside the supported range.
  • Subjective effort is ignored for failed sets because the failed next repetition is the stronger effort observation.
  • Zero-repetition failures remain non-voting censored_high observations and retain the attempted load as a finite upper bound.
  • Measured 1..20RM facts remain based on actual completed repetitions and stay separate from e1RM and PR notifications.
  • Requires a full historical strength-projection replay.

1.0.0 — 2026-07-24

Breaking hard cutover from the legacy universal Epley estimate to the pinned Nuzzo 2024 general inverse population curve.

  • Added the application-owned 100%1RM = 1 repetition anchor.
  • Added direct inverse piecewise-linear lookup from source knots, including fractional effective reps.
  • Added the five-level RIR range contract, missing/legacy safeguards, aggregation and stale rules.
  • Added explicit training | rm_test session intent without changing the v1 estimation formula.
  • Defined failed attempts as low/censored e1RM evidence while preserving positive actual completed repetitions as measured NRM facts; zero-repetition failures create no NRM.
  • Kept e1RM separate from measured 1..20RM PR state/events and required a full replay.