Reject a numeric intensity metric; record why

Intensity in Mentzer's sense is the percentage of momentary ability exerted, which at failure is 100% by definition — Yates: "all I know is 0 and 100". It is therefore categorical, not scalar, and is already discharged structurally: a working set cannot exist without reaching failure, and going further is expressed qualitatively as Beyond_failure. An AIF/RIF metric (volume / duration, and its ratio to the previous session) would measure work density, not intensity, and a value like 1.2 would imply "120% of failure", which is meaningless. It would also require per-set time under tension, which is impractical to collect during a superset. Kept instead, each honest about what it measures: - intensity: categorical, via Set.Working.outcome - overload: the progress signal, band-aware (Progression.beats) - volume: diagnostic only; rising volume is a warning - duration: framed as brevity, since HD prescribes brief workouts Documentation-only change; no signatures altered.

Commit
71424318041cd36222823ea0260554cbcbd8bd73
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
lib/core/progression.mli
index e075c266..eac60c53 100644..100644
@@ -50,5 +50,6 @@
50 50 (** {1 Metrics} *)
51 51
52 52 val volume : sample list -> float
53 Removed: (** Σ (load × reps), in kilogram-reps. Tracked as a diagnostic: under Heavy Duty
54 Removed: rising volume is a warning, not an achievement. *)
53 Added: (** Σ (load × reps), in kilogram-reps. A diagnostic, never a target: under Heavy
54 Added: Duty rising volume is a warning, not an achievement. Progress is overload
55 Added: ({!beats}); volume merely describes how much work it took. *)
lib/core/set.mli
index 2cccfa40..5f906a43 100644..100644
@@ -2,7 +2,12 @@
2 2
3 3 Warm-up and working sets are distinct, incompatible types. A working set
4 4 always reaches failure — that is its definition — so the type records only
5 Removed: {e how} failure was reached, never whether. *)
5 Added: {e how} failure was reached, never whether.
6 Added:
7 Added: Intensity is therefore categorical, not a scalar: at failure a set is by
8 Added: definition maximal, and going further is expressed qualitatively as
9 Added: {!Working.Beyond_failure}. There is deliberately no numeric intensity
10 Added: metric. *)
6 11
7 12 (** A warm-up set: preparation, never taken to failure. *)
8 13 module Warm_up : sig
lib/core/workout.mli
index e9793670..afe41ffd 100644..100644
@@ -39,7 +39,8 @@
39 39 (** Σ (load × reps) across all working sets. Diagnostic, not a target. *)
40 40
41 41 val duration : t -> Recovery.duration option
42 Removed: (** Wall-clock time, once finished. *)
42 Added: (** Wall-clock time, once finished. Heavy Duty prescribes brief workouts, so a
43 Added: shorter session at equal or better overload is favourable. *)
43 44
44 45 val pp : Format.formatter -> t -> unit
45 46 end