185
181
if List.mem s.exercise_name acc then acc else acc @ [ s.exercise_name ])
186
182
[] sets
187
183
184
+
Added:
(* The sets that promote to canonical evidence. A drop set is not one clean
185
+
Added:
drive to failure — HD1 knows only forced reps, negatives, and a static hold
186
+
Added:
past failure, never a strip set — so a [Dropset] row is non-evidence, dropped
187
+
Added:
the way a warmup is. What remains is the set taken to failure, which is what
188
+
Added:
the doctrine counts. Every downstream decision — blockers, observations,
189
+
Added:
provenance — reads this, so a drop set neither blocks a workout nor records
190
+
Added:
an observation. *)
191
+
Added:
let promotable_sets w =
192
+
Added:
List.filter (fun (s : source_set) -> s.set_type <> Dropset) w.sets
193
+
Added:
188
194
let blockers w =
189
-
Removed:
if w.sets = [] then [ No_sets ]
195
+
Added:
let sets = promotable_sets w in
196
+
Added:
if sets = [] then [ No_sets ]
190
197
else
191
-
Removed:
let dropset_rows =
192
-
Removed:
List.filter_map
193
-
Removed:
(fun (s : source_set) ->
194
-
Removed:
if s.set_type = Dropset then Some s.row else None)
195
-
Removed:
w.sets
196
-
Removed:
in
197
-
Removed:
let dropset_blocker =
198
-
Removed:
if dropset_rows = [] then [] else [ Dropset_present dropset_rows ]
199
-
Removed:
in
200
198
let unmapped =
201
-
Removed:
distinct_names w.sets
199
+
Added:
distinct_names sets
202
200
|> List.filter (fun name -> not (List.mem_assoc name w.mappings))
203
201
|> List.map (fun name -> Unmapped_exercise name)
204
202
in
205
203
let normal_blocker =
206
204
if
207
-
Removed:
List.exists (fun (s : source_set) -> s.set_type = Normal) w.sets
205
+
Added:
List.exists (fun (s : source_set) -> s.set_type = Normal) sets
208
206
&& w.acknowledgement = None
209
207
then [ Normal_sets_unconfirmed ]
210
208
else []
211
209
in
212
-
Removed:
dropset_blocker @ unmapped @ normal_blocker
210
+
Added:
unmapped @ normal_blocker
213
211
214
212
(* {1 Promotion} *)
215
213