Estimated max-reps policy
barbelic.max-reps@2.0.0 estimates how many repetitions a user could have completed under the same exact exercise identity and zero-external-load condition. It does not apply the Nuzzo kg curve: the estimate is the actual completed repetitions plus the RIR implied by the entered RPE (10 − RPE, issue #1237). RPE ≥ 6.0 gives a closed point estimate; RPE < 6.0 gives only an open lower bound; the retired five-band effort scale was converted once as RPE = level + 5. The effective recording profile must contain reps; a historical session snapshot wins over the catalog profile, and the legacy measurement type is used only when neither profile is available. Distance/time exercises can therefore never become dummy max-rep observations.
Actual repetitions and estimates remain separate. A positive-repetition failure is an observed momentary maximum, while a completed set with missing RPE provides only an open observed floor such as 12+. Estimated values never create a measured PR; best_reps is derived only from actual eligible repetitions and ignores target repetitions.
Each observation copies nullable session.body_weight_kg and the historical session_exercise_part.bodyweight_factor. They describe the condition at that session but do not normalize the repetition estimate. A missing historical weight stays null and is never replaced with the user's later profile weight.
The machine-readable contract is v2/policy.json; the retired five-band contract stays at v1/policy.json.