@aneuhold/core-ts-db-lib 4.0.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/lib/browser.d.ts +36 -4
  3. package/lib/browser.d.ts.map +1 -1
  4. package/lib/browser.js +23 -2
  5. package/lib/browser.js.map +1 -1
  6. package/lib/browser.ts +126 -4
  7. package/lib/documents/BaseDocument.d.ts +8 -0
  8. package/lib/documents/BaseDocument.d.ts.map +1 -1
  9. package/lib/documents/BaseDocument.js +10 -0
  10. package/lib/documents/BaseDocument.js.map +1 -1
  11. package/lib/documents/BaseDocument.ts +18 -0
  12. package/lib/documents/common/User.d.ts +1 -0
  13. package/lib/documents/common/User.d.ts.map +1 -1
  14. package/lib/documents/common/User.js +4 -2
  15. package/lib/documents/common/User.js.map +1 -1
  16. package/lib/documents/common/User.ts +4 -2
  17. package/lib/documents/dashboard/NonogramKatanaItem.d.ts +1 -1
  18. package/lib/documents/dashboard/NonogramKatanaItem.js +1 -1
  19. package/lib/documents/dashboard/NonogramKatanaItem.js.map +1 -1
  20. package/lib/documents/dashboard/NonogramKatanaItem.ts +1 -1
  21. package/lib/documents/dashboard/NonogramKatanaUpgrade.d.ts +1 -1
  22. package/lib/documents/dashboard/NonogramKatanaUpgrade.js +1 -1
  23. package/lib/documents/dashboard/NonogramKatanaUpgrade.js.map +1 -1
  24. package/lib/documents/dashboard/NonogramKatanaUpgrade.ts +1 -1
  25. package/lib/documents/dashboard/Task.d.ts +4 -4
  26. package/lib/documents/dashboard/UserConfig.d.ts +4 -4
  27. package/lib/documents/workout/README.md +557 -0
  28. package/lib/documents/workout/WorkoutEquipmentType.d.ts +22 -0
  29. package/lib/documents/workout/WorkoutEquipmentType.d.ts.map +1 -0
  30. package/lib/documents/workout/WorkoutEquipmentType.js +31 -0
  31. package/lib/documents/workout/WorkoutEquipmentType.js.map +1 -0
  32. package/lib/documents/workout/WorkoutEquipmentType.ts +40 -0
  33. package/lib/documents/workout/WorkoutExercise.d.ts +82 -0
  34. package/lib/documents/workout/WorkoutExercise.d.ts.map +1 -0
  35. package/lib/documents/workout/WorkoutExercise.js +124 -0
  36. package/lib/documents/workout/WorkoutExercise.js.map +1 -0
  37. package/lib/documents/workout/WorkoutExercise.ts +143 -0
  38. package/lib/documents/workout/WorkoutExerciseCalibration.d.ts +43 -0
  39. package/lib/documents/workout/WorkoutExerciseCalibration.d.ts.map +1 -0
  40. package/lib/documents/workout/WorkoutExerciseCalibration.js +45 -0
  41. package/lib/documents/workout/WorkoutExerciseCalibration.js.map +1 -0
  42. package/lib/documents/workout/WorkoutExerciseCalibration.ts +74 -0
  43. package/lib/documents/workout/WorkoutMesocycle.d.ts +49 -0
  44. package/lib/documents/workout/WorkoutMesocycle.d.ts.map +1 -0
  45. package/lib/documents/workout/WorkoutMesocycle.js +84 -0
  46. package/lib/documents/workout/WorkoutMesocycle.js.map +1 -0
  47. package/lib/documents/workout/WorkoutMesocycle.ts +102 -0
  48. package/lib/documents/workout/WorkoutMicrocycle.d.ts +27 -0
  49. package/lib/documents/workout/WorkoutMicrocycle.d.ts.map +1 -0
  50. package/lib/documents/workout/WorkoutMicrocycle.js +42 -0
  51. package/lib/documents/workout/WorkoutMicrocycle.js.map +1 -0
  52. package/lib/documents/workout/WorkoutMicrocycle.ts +55 -0
  53. package/lib/documents/workout/WorkoutMuscleGroup.d.ts +22 -0
  54. package/lib/documents/workout/WorkoutMuscleGroup.d.ts.map +1 -0
  55. package/lib/documents/workout/WorkoutMuscleGroup.js +25 -0
  56. package/lib/documents/workout/WorkoutMuscleGroup.js.map +1 -0
  57. package/lib/documents/workout/WorkoutMuscleGroup.ts +34 -0
  58. package/lib/documents/workout/WorkoutSession.d.ts +39 -0
  59. package/lib/documents/workout/WorkoutSession.d.ts.map +1 -0
  60. package/lib/documents/workout/WorkoutSession.js +66 -0
  61. package/lib/documents/workout/WorkoutSession.js.map +1 -0
  62. package/lib/documents/workout/WorkoutSession.ts +79 -0
  63. package/lib/documents/workout/WorkoutSessionExercise.d.ts +39 -0
  64. package/lib/documents/workout/WorkoutSessionExercise.d.ts.map +1 -0
  65. package/lib/documents/workout/WorkoutSessionExercise.js +66 -0
  66. package/lib/documents/workout/WorkoutSessionExercise.js.map +1 -0
  67. package/lib/documents/workout/WorkoutSessionExercise.ts +79 -0
  68. package/lib/documents/workout/WorkoutSet.d.ts +41 -0
  69. package/lib/documents/workout/WorkoutSet.d.ts.map +1 -0
  70. package/lib/documents/workout/WorkoutSet.js +69 -0
  71. package/lib/documents/workout/WorkoutSet.js.map +1 -0
  72. package/lib/documents/workout/WorkoutSet.ts +90 -0
  73. package/lib/embedded-types/dashboard/task/FilterSettings.d.ts +6 -6
  74. package/lib/embedded-types/dashboard/task/FilterSettings.d.ts.map +1 -1
  75. package/lib/embedded-types/dashboard/task/FilterSettings.js +4 -2
  76. package/lib/embedded-types/dashboard/task/FilterSettings.js.map +1 -1
  77. package/lib/embedded-types/dashboard/task/FilterSettings.ts +5 -3
  78. package/lib/embedded-types/dashboard/task/SortSettings.d.ts +6 -6
  79. package/lib/embedded-types/dashboard/task/SortSettings.js +1 -1
  80. package/lib/embedded-types/dashboard/task/SortSettings.js.map +1 -1
  81. package/lib/embedded-types/dashboard/task/SortSettings.ts +1 -1
  82. package/lib/embedded-types/workout/Fatigue.d.ts +16 -0
  83. package/lib/embedded-types/workout/Fatigue.d.ts.map +1 -0
  84. package/lib/embedded-types/workout/Fatigue.js +34 -0
  85. package/lib/embedded-types/workout/Fatigue.js.map +1 -0
  86. package/lib/embedded-types/workout/Fatigue.ts +41 -0
  87. package/lib/embedded-types/workout/Rsm.d.ts +17 -0
  88. package/lib/embedded-types/workout/Rsm.d.ts.map +1 -0
  89. package/lib/embedded-types/workout/Rsm.js +34 -0
  90. package/lib/embedded-types/workout/Rsm.js.map +1 -0
  91. package/lib/embedded-types/workout/Rsm.ts +42 -0
  92. package/lib/services/DocumentService.d.ts +19 -0
  93. package/lib/services/DocumentService.d.ts.map +1 -1
  94. package/lib/services/DocumentService.js.map +1 -1
  95. package/lib/services/DocumentService.ts +20 -0
  96. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.d.ts +35 -0
  97. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.d.ts.map +1 -0
  98. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.js +74 -0
  99. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.js.map +1 -0
  100. package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.ts +90 -0
  101. package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts +55 -0
  102. package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts.map +1 -0
  103. package/lib/services/workout/Exercise/WorkoutExerciseService.js +133 -0
  104. package/lib/services/workout/Exercise/WorkoutExerciseService.js.map +1 -0
  105. package/lib/services/workout/Exercise/WorkoutExerciseService.ts +173 -0
  106. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts +35 -0
  107. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts.map +1 -0
  108. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js +42 -0
  109. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js.map +1 -0
  110. package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.ts +45 -0
  111. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts +90 -0
  112. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts.map +1 -0
  113. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js +131 -0
  114. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js.map +1 -0
  115. package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.ts +159 -0
  116. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts +52 -0
  117. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts.map +1 -0
  118. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js +180 -0
  119. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js.map +1 -0
  120. package/lib/services/workout/Mesocycle/WorkoutMesocycleService.ts +274 -0
  121. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts +28 -0
  122. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts.map +1 -0
  123. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js +172 -0
  124. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js.map +1 -0
  125. package/lib/services/workout/Microcycle/WorkoutMicrocycleService.ts +236 -0
  126. package/lib/services/workout/Session/WorkoutSessionService.d.ts +49 -0
  127. package/lib/services/workout/Session/WorkoutSessionService.d.ts.map +1 -0
  128. package/lib/services/workout/Session/WorkoutSessionService.js +95 -0
  129. package/lib/services/workout/Session/WorkoutSessionService.js.map +1 -0
  130. package/lib/services/workout/Session/WorkoutSessionService.ts +136 -0
  131. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts +45 -0
  132. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts.map +1 -0
  133. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js +69 -0
  134. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js.map +1 -0
  135. package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.ts +77 -0
  136. package/lib/services/workout/Set/WorkoutSetService.d.ts +36 -0
  137. package/lib/services/workout/Set/WorkoutSetService.d.ts.map +1 -0
  138. package/lib/services/workout/Set/WorkoutSetService.js +90 -0
  139. package/lib/services/workout/Set/WorkoutSetService.js.map +1 -0
  140. package/lib/services/workout/Set/WorkoutSetService.ts +153 -0
  141. package/lib/services/workout/util/SFR/WorkoutSFRService.d.ts +29 -0
  142. package/lib/services/workout/util/SFR/WorkoutSFRService.d.ts.map +1 -0
  143. package/lib/services/workout/util/SFR/WorkoutSFRService.js +50 -0
  144. package/lib/services/workout/util/SFR/WorkoutSFRService.js.map +1 -0
  145. package/lib/services/workout/util/SFR/WorkoutSFRService.ts +61 -0
  146. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts +48 -0
  147. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts.map +1 -0
  148. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js +261 -0
  149. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js.map +1 -0
  150. package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.ts +339 -0
  151. package/package.json +5 -4
@@ -55,19 +55,19 @@ export declare const DashboardTaskSchema: z.ZodObject<{
55
55
  grandChildrenTasks: z.ZodDefault<z.ZodObject<{
56
56
  show: z.ZodBoolean;
57
57
  }, z.core.$strip>>;
58
- startDate: z.ZodObject<{
58
+ startDate: z.ZodDefault<z.ZodObject<{
59
59
  showFutureTasks: z.ZodDefault<z.ZodBoolean>;
60
- }, z.core.$strip>;
60
+ }, z.core.$strip>>;
61
61
  tags: z.ZodDefault<z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
62
62
  show: z.ZodBoolean;
63
63
  }, z.core.$strip>>>;
64
64
  }, z.core.$strip>>>;
65
65
  sortSettings: z.ZodDefault<z.ZodRecord<z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>> & z.core.$partial, z.ZodObject<{
66
66
  userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
67
- sortList: z.ZodArray<z.ZodObject<{
67
+ sortList: z.ZodDefault<z.ZodArray<z.ZodObject<{
68
68
  sortBy: z.ZodEnum<typeof import("../../embedded-types/dashboard/task/SortSettings.js").DashboardTaskSortBy>;
69
69
  sortDirection: z.ZodEnum<typeof import("../../embedded-types/dashboard/task/SortSettings.js").DashboardTaskSortDirection>;
70
- }, z.core.$strip>>;
70
+ }, z.core.$strip>>>;
71
71
  }, z.core.$strip>>>;
72
72
  _id: z.ZodPipe<z.ZodDefault<z.ZodUUID>, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
73
73
  userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
@@ -25,10 +25,10 @@ export declare const DashboardUserConfigSchema: z.ZodObject<{
25
25
  }, z.core.$strip>>>;
26
26
  taskListSortSettings: z.ZodDefault<z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
27
27
  userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
28
- sortList: z.ZodArray<z.ZodObject<{
28
+ sortList: z.ZodDefault<z.ZodArray<z.ZodObject<{
29
29
  sortBy: z.ZodEnum<typeof import("../../embedded-types/dashboard/task/SortSettings.js").DashboardTaskSortBy>;
30
30
  sortDirection: z.ZodEnum<typeof import("../../embedded-types/dashboard/task/SortSettings.js").DashboardTaskSortDirection>;
31
- }, z.core.$strip>>;
31
+ }, z.core.$strip>>>;
32
32
  }, z.core.$strip>>>;
33
33
  taskListFilterSettings: z.ZodDefault<z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
34
34
  userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
@@ -38,9 +38,9 @@ export declare const DashboardUserConfigSchema: z.ZodObject<{
38
38
  grandChildrenTasks: z.ZodDefault<z.ZodObject<{
39
39
  show: z.ZodBoolean;
40
40
  }, z.core.$strip>>;
41
- startDate: z.ZodObject<{
41
+ startDate: z.ZodDefault<z.ZodObject<{
42
42
  showFutureTasks: z.ZodDefault<z.ZodBoolean>;
43
- }, z.core.$strip>;
43
+ }, z.core.$strip>>;
44
44
  tags: z.ZodDefault<z.ZodRecord<z.ZodString & z.core.$partial, z.ZodObject<{
45
45
  show: z.ZodBoolean;
46
46
  }, z.core.$strip>>>;
@@ -0,0 +1,557 @@
1
+ # MesoPro Data Model + System Description
2
+
3
+ ## Document Diagram
4
+
5
+ ```mermaid
6
+ classDiagram
7
+ class WorkoutMesocycle {
8
+ + _id: UUID
9
+ + title?: string
10
+ + calibratedExercises: UUID[]
11
+ + cycleType: CycleType
12
+ + plannedSessionCountPerMicrocycle: number
13
+ + plannedMicrocycleLengthInDays: number
14
+ + plannedMicrocycleRestDays: number[]
15
+ + plannedMicrocycleCount: number?
16
+ + completedDate: Date?
17
+ }
18
+
19
+ class WorkoutMicrocycle {
20
+ + _id: UUID
21
+ + workoutMesocycleId: UUID?
22
+ + startDate: Date
23
+ + endDate: Date
24
+ + sessionOrder: UUID[]
25
+ }
26
+
27
+ class WorkoutSession {
28
+ + _id: UUID
29
+ + workoutMicrocycleId: UUID?
30
+ + title: string
31
+ + description: string?
32
+ + startTime: Date
33
+ + complete: boolean
34
+ + sessionExerciseOrder: UUID[]
35
+ + rsm: Rsm?
36
+ + fatigue: Fatigue?
37
+ }
38
+
39
+ class WorkoutSessionExercise {
40
+ + _id: UUID
41
+ + workoutSessionId: UUID
42
+ + workoutExerciseId: UUID
43
+ + setOrder: UUID[]
44
+ + rsm: Rsm?
45
+ + fatigue: Fatigue?
46
+ + sorenessScore: number?
47
+ + performanceScore: number?
48
+ + isRecoveryExercise: boolean
49
+ }
50
+
51
+ class WorkoutSet {
52
+ + _id: UUID
53
+ + workoutExerciseId: UUID
54
+ + workoutSessionId: UUID
55
+ + workoutSessionExerciseId: UUID
56
+ + plannedReps: number?
57
+ + plannedWeight: number?
58
+ + plannedRir: number?
59
+ + actualReps: number?
60
+ + actualWeight: number?
61
+ + rir: number?
62
+ + exerciseProperties: object?
63
+ }
64
+
65
+ class WorkoutExercise {
66
+ + _id: UUID
67
+ + exerciseName: string
68
+ + workoutEquipmentTypeId: UUID
69
+ + notes: string?
70
+ + restSeconds: number?
71
+ + customProperties: ExerciseProperty[]?
72
+ + repRange: ExerciseRepRange
73
+ + preferredProgressionType: ExerciseProgressionType?
74
+ + primaryMuscleGroups: UUID[]
75
+ + secondaryMuscleGroups: UUID[]
76
+ + initialFatigueGuess: Fatigue
77
+ }
78
+
79
+ class WorkoutMuscleGroup {
80
+ + _id: UUID
81
+ + name: string
82
+ + description?: string
83
+ }
84
+
85
+ class WorkoutEquipmentType {
86
+ + _id: UUID
87
+ + title: string
88
+ + weightOptions: number[]?
89
+ }
90
+
91
+ class WorkoutExerciseCalibration {
92
+ + _id: UUID
93
+ + workoutExerciseId: UUID
94
+ + exerciseProperties: object?
95
+ + reps: number
96
+ + weight: number
97
+ + dateRecorded: Date
98
+ }
99
+
100
+ class ExerciseProperty {
101
+ <<interface>>
102
+ + name: string
103
+ + type: ExercisePropertyType
104
+ }
105
+
106
+ class ExercisePropertyType {
107
+ <<enumeration>>
108
+ + Weight
109
+ + Text
110
+ + "Yes/No"
111
+ + Number
112
+ }
113
+
114
+ class ExerciseProgressionType {
115
+ <<enumeration>>
116
+ + Rep
117
+ + Load
118
+ }
119
+
120
+ class ExerciseRepRange {
121
+ <<enumeration>>
122
+ + Heavy
123
+ + Medium
124
+ + Light
125
+ }
126
+
127
+ class Rsm {
128
+ <<interface>>
129
+ + mindMuscleConnection: number
130
+ + pump: number
131
+ + disruption: number
132
+ }
133
+
134
+ class Fatigue {
135
+ <<interface>>
136
+ + jointAndTissueDisruption: number
137
+ + perceivedEffort: number
138
+ + unusedMusclePerformance: number
139
+ }
140
+
141
+ class CycleType {
142
+ <<enumeration>>
143
+ + MuscleGain
144
+ + Resensitization
145
+ + Cut
146
+ + FreeForm
147
+ }
148
+
149
+ WorkoutEquipmentType "1" --> "*" WorkoutExercise
150
+ WorkoutExercise "1" --> "*" WorkoutSessionExercise
151
+ WorkoutSession "1" --> "*" WorkoutSessionExercise : has many
152
+ WorkoutSessionExercise "1" --> "*" WorkoutSet : has many
153
+ WorkoutExercise "1" --> "0..*" WorkoutExerciseCalibration
154
+ WorkoutMicrocycle "1" --> "*" WorkoutSession : has many
155
+ WorkoutMesocycle "1" --> "*" WorkoutMicrocycle : has many
156
+ WorkoutMesocycle "0..*" --> "0..*" WorkoutExerciseCalibration
157
+ WorkoutMesocycle o-- CycleType
158
+ WorkoutExercise o-- ExerciseProperty
159
+ WorkoutExercise "0..*" --> "0..*" WorkoutMuscleGroup
160
+ ```
161
+
162
+ > Note: Where an interface is defined, and associated to a particular document, that is meant to be an embedded definition of the class that defines it. This is a limitation of mermaid, so imagine those interfaces as just an embedded object definition.
163
+
164
+ Model Notes:
165
+
166
+ - `WorkoutExercise` is meant to be specific to a particular way of doing an exercise. For example there should be separate exercises for Barbell Bench Press (Straight Sets), Barbell Bench Press (Myoreps), Dumbbell Bench Press (Straight Sets, Eccentric Focus, 3s Down, 1s Pause). It needs to be ultra specific, because even a different hand position will result in a different exercise, and should be tracked separately. This even includes the ExerciseRepRange, when all else would be exactly the same. Because of this, when creating a calibration, the UI should offer to add the same calibration (which would be duplicated), to another exercise.
167
+ - `WorkoutEquipmentType` is used to assist in algorithms where weight needs to be incremented or decremented for a schedule. But also helps dramatically to ease entering data for the user. This will be calculated in a view for the user where they can set a minimum weight (such as the bar) and possible increments, then the possible weights will be generated for them. Otherwise it is just a list of their dumbbell weights.
168
+ - `exerciseProperties` in `WorkoutSet` and `WorkoutExerciseCalibration` are populated from `WorkoutExercise.customProperties` at creation time. Then whenever customProperties are changed, they are changed among every single existing WorkoutSet with that WorkoutExercise linked to it.
169
+ - `calibratedExercises` in `WorkoutMesocycle` is an array of UUIDs referencing `WorkoutExerciseCalibration` documents. This locks which calibration was used for a mesocycle so historical 1RM values remain accurate even if calibrations are changed later. This is purposefully not an object with a reference to both the exercise and the calibration, because you can get the exercise from the calibration.
170
+ - `WorkoutExerciseCalibration` documents are meant to store the lowest amount of reps the person can do for that exercise with the highest amount of weight they can. See the section in the notes on 1RM calculations for more detail.
171
+ - `setOrder` on `WorkoutSession` was chosen as a compromise for querying efficiency in order to quickly get metrics like "Last time you did this exercise when it was preceded by these 4 other exercises, you did this".
172
+ - `restSeconds` on `WorkoutExercise` is used for a timer that will be built into the app for each exercise. No tracking will be done of the timer, it will be purely client-side.
173
+ - `WorkoutMesocycle.completedDate` should be set after the user gets a "success" completion screen of some kind and they have buttoned up any last prompts. This should guide them into the next mesocycle.
174
+ - `CycleType` when set to MuscleGain, Resensitization, or Cut means that automatic recommendations will be made. If it is set to FreeForm, then recommendations go away. FreeForm will not be selectable by the user, rather it is an escape hatch if something goes south during the mesocycle.
175
+
176
+ ## Service Diagram
177
+
178
+ ```mermaid
179
+ classDiagram
180
+ class WorkoutSessionService {
181
+ + getRsmTotal(session: WorkoutSession): number?
182
+ + getFatigueTotal(session: WorkoutSession): number?
183
+ + getSFR(session: WorkoutSession): number?
184
+ }
185
+
186
+ class WorkoutExerciseCalibrationService {
187
+ + get1RM(calibration: WorkoutExerciseCalibration): number
188
+ + getTargetWeight(calibration: WorkoutExerciseCalibration, targetReps: number, equipmentType: WorkoutEquipmentType): number
189
+ }
190
+
191
+ class WorkoutMesocycleService {
192
+ + generateInitialPlan(mesocycle: WorkoutMesocycle, calibrations: WorkoutExerciseCalibration[], exercises: WorkoutExercise[], equipmentTypes: WorkoutEquipmentType[]): GenerateInitialPlanOutput
193
+ }
194
+
195
+ class GenerateInitialPlanOutput {
196
+ <<interface>>
197
+ + mesocycleUpdate: Partial~WorkoutMesocycle~?
198
+ + microcycles: DocumentOperations~WorkoutMicrocycle~?
199
+ + sessions: DocumentOperations~WorkoutSession~?
200
+ + sessionExercises: DocumentOperations~WorkoutSessionExercise~?
201
+ + sets: DocumentOperations~WorkoutSet~?
202
+ }
203
+
204
+ class DocumentOperations~T~ {
205
+ <<interface>>
206
+ + insert: T[]?
207
+ + update: Partial~T~[]?
208
+ + delete: UUID[]?
209
+ }
210
+ ```
211
+
212
+ Service Notes:
213
+
214
+ - `WorkoutMesocycleService.generateInitialPlan()` creates the complete default plan for a mesocycle before any user adjustments or feedback
215
+
216
+ ## System Requirements
217
+
218
+ These are requirements that were developed after taking all the notes in the more educational sections in this markdown documents. So they are based on those notes above all else.
219
+
220
+ - The user should no longer get automatic recommendations if they make any of the following changes during a mesocycle. Automatic recommendations / planning will happen again upon starting a new mesocycle:
221
+ - Reordering sessions within a mesocycle: The progression algorithm depends on soreness / performance per muscle group in order. Changing this makes the recommendations not mean much.
222
+ - Changing exercises mid-mesocycle: This is breaking a cardinal rule in a way. We won't have baseline for load / volume progression, and can't track if we are making progress anymore.
223
+ - Removing a muscle group assignment (or adding one) to exercises that are in a current mesocycle. This only matters if the muscle groups are being tracked. For example, if no exercise had rear delts assigned before, and suddenly it is added to an existing exercise that is being used, that shouldn't be a big deal. But if one is removed, like squats has quads removed, we lose an understanding of what is happening over the mesocycle.
224
+ - Session frequency: This one sucks that it can't be changed after the mesocycle starts, but again, it comes down to tracking. If you need to do less sets, then the algorithm should reduce the sets for you. If you need to wait a few days before doing your next session because something came up, that should be okay too.
225
+ - Skipping a session: Again, sucks that this can't be done, but same notes as above. If the time that was scheduled for a session has passed when the user opens the app back up, it should ask them if they want to move the session forward (within reason, such as a week), start a deload, or conclude that mesocycle for now. Otherwise, if they try to continue the workout, the workouts should be separated from a mesocycle, that way they aren't tied to a particular microcycle in a mesocycle progression for analytics purposes.
226
+ - The user should still get automatic recommendations if they do any of the following, the system should accommodate the user:
227
+ - Move a session to a different day, as long as the order is maintained. If the number of rest days gets shorter though, then warn the user at least.
228
+ - Doing something different than the expected reps / weight. This is a basic capability and the algorithm should be able to adjust as long as we have good RIR and fatigue values from the user. Might just give them a heads up that if they are getting too close to 0 RIR early on in a mesocycle, then they will burn out too fast to complete it.
229
+ - Early deload: The system should be able to suggest if this needs to happen, so if the user does this explicitly, it should be just fine. No worries.
230
+ - The user should be able to track workouts outside of a mesocycle / microcycle. There is a reason that those foreign ID references are optional. There just won't be any automatic suggestions for the user. They can free-form as much as they like and use the app more like a workout tracker and not a plan builder. They can use individual sessions, and microcycles completely freely. Having a mesocycle is the determination if we use more advanced logic.
231
+
232
+ ## Book Reference
233
+
234
+ [Here is a link to the NotebookLM notebook that has the book in it's source set](https://notebooklm.google.com/notebook/89ca292a-0f03-4f8d-a386-73ab8a048c0f) (There is a limit of 50 queries per day)
235
+
236
+ ## Terms
237
+
238
+ - **Stimulus**: Stimulus is generally the amount of stress we are applying to a muscle over a particular time frame.
239
+ - **Delayed Onset Muscle Soreness (DOMS)**
240
+ - **Effective Stimulus Range** (pg 28-29): The effective stimulus range is the range between very low stimulus, and just after the amount of stimulus that causes peak muscle growth, just where more stimulus would start resulting in muscle loss.
241
+ - **Cell Swelling** (pg 26): "The Pump" 💪
242
+ - **Relative Effort** (pg 23): Relative Effort is a measure of how close to failure you are on a lift or how difficult the lift is for you with respect to your current capacity.
243
+ - **Reps in Reserve (RIR)** (pg 30): Reps in Reserve are the set's proximity to muscle failure. In other words, how many reps do you have left before you completely fail to produce the movement.
244
+ - **Effective Sets** (pg 33): Effective sets are a set that is done within 5-30 reps, and within 0-5 RIR.
245
+ - **Volume** (pg 34+): From page 34 and onwards, the book discusses volume as the number of effective sets. Even though this isn't the technical definition, everything averages out as long as you are using effective sets.
246
+ - **Minimum Effective Volume (MEV)** (pg. 34): The minimum volume which leads to muscle growth. This varies by age, training experience, and existing muscle mass. As you get stronger / bigger, this gets higher.
247
+ - **Maximum Recoverable Volume (MRV)** (pg. 34,117): The maximum volume that can be done before muscle loss begins.
248
+ - **Raw Stimulus Magnitude (RSM)** (pg. 50-53): RSM is the amount of muscle growth stimulus any given Workout Session gives.
249
+ - **Microcycle**: The shortest cycle of training that includes all workout sessions and rest days and is repeated. Typically, but not always, this is a week.
250
+ - **Mesocycle**: An organized sequence of microcycles ordered to elicit a set of distinct training adaptations. The typical mesocycle is composed of two distinct phases: an accumulation phase, and a shorter deload phase.
251
+ - **Stimulus to Fatigue Ratio (SFR)** (pg. 89,91-94): The relationship between stimulus and fatigue for any training input. This can be thought of as Hypertrophy Stimulated (proxied by RSM) / Fatigue Generated.
252
+ - **Stimulus, Recovery, and Adaptation (SRA)** (pg. 123): SRA dictates when we should stimulate and when we should recover for best adaptation.
253
+
254
+ ## Key Concepts
255
+
256
+ ### Training Stimulators (pg. 19-20)
257
+
258
+ The key stimulators at the cellular level that occur in response to training and are predictive of hypertrophy are:
259
+
260
+ - Tension
261
+ - Metabolite Accumulation
262
+ - Cell Swelling
263
+
264
+ During training, and while designing a program, we focus on the following stimulators, in order of importance, in order to cause the above 3 in the optimal way:
265
+
266
+ 1. Tension
267
+ 2. Volume
268
+ 3. Relative Effort
269
+ 4. Range of Motion (ROM)
270
+ 5. Metabolite Accumulation
271
+ 6. Cell Swelling
272
+ 7. Mind-Muscle Connection
273
+ 8. Movement Velocity
274
+ 9. Muscle Damage
275
+
276
+ ### Effective Reps (pg. 30-32)
277
+
278
+ The number of "effective reps" you have done are the number of reps between 5 RIR and 0 RIR. So if you got to 0 RIR, then you did 5 "effective reps". This is not to say that reps before 5 RIR are not useful, they are, just less so.
279
+
280
+ The catch to this is that lower RIR is much more fatigue, and in the grand scheme of things, always going to 0 RIR can cause muscle loss. So a more balanced average of 2-3 RIR is best.
281
+
282
+ Further, notable growth happens between 30% 1RM and 85% 1RM per repetition. Any less, doesn't give enough stimulus, any more and fatigue + injury risk increase exponentially. Note this is <u>per rep</u>, which means you must keep hitting that weight throughout the set. See the book for a further analysis, but this seems like the most key takeaway.
283
+
284
+ See Effective Sets for more info.
285
+
286
+ ### Effective Sets (pg. 33,62,166-167)
287
+
288
+ Effective sets, are an extension of the effective reps, and basically widen the view a bit more. If only taking effective reps into account, one could conclude that a set with 2 RIR and one with 3 RIR is the same as one with 0 RIR. But that doesn't include the reps that were done before the effective reps. So overall the two sets will confer about twice the growth. More sets is virtually always better if they fit the parameters above and have at least 1 effective rep.
289
+
290
+ Sets anywhere between 5 - 30 reps are great, as long as they have at least 1 effective rep. Note that for mind-muscle connection, 10 - 20 reps is normally ideal for most people. Too little and you are straining too much too focus, too much and fatigue comes in which also doesn't help with focus. You can use this variation to your advantage for muscle groups and in a particular session. For example, the heavier sets are not practical at 30 reps, such as deadlifts, and it is generally unsafe to do enough weight to properly do 5 reps of flys. Because of this, I (personally) am making up a definition of "heavy", "medium", and "light" exercises. Which can be defined as:
291
+
292
+ - "Heavy exercises": Normally done in the 5-15 rep range
293
+ - "Medium exercises": Normally done in the 10-20 rep range (This should be the most common)
294
+ - "Light exercises": Normally done in the 15-30 rep range
295
+
296
+ You want to try and put the heavy exercises towards the beginning of the week if possible, and the lighter ones towards the end so that it is easier when your muscles are tired. But in general you also want to get the full range for each muscle group. This is part of the challenge with making a program. (pg. 166-167)
297
+
298
+ If you are trying to hit a target rep range of 10-20, and start at 16, 14, 12, 10, but need to add a fifth set the next week, it will need to be a drop set. So go down a bit of weight on the fifth set in order to keep your target reps of 10. (pg. 62)
299
+
300
+ Because of the averages and guidelines (roughly 2-3 RIR per set, and 5 - 30 reps per set), you can generally judge any workout program by the number effective sets in this way.
301
+
302
+ #### Checklist between Sets (pg. 39)
303
+
304
+ - Are my pecs still burning from the last set?
305
+ - Are my front delts and triceps ready to support my chest in another set?
306
+ - Do I feel mentally and physically like I can push hard with my chest again?
307
+ - Is my breathing more or less back to normal?
308
+
309
+ If you can answer yes on the recovery side for all of these, then you are good to go.
310
+
311
+ ### Raw Stimulus Magnitude (RSM) (pg. 50-53)
312
+
313
+ RSM is the amount of muscle growth stimulus any given Workout Session gives. It is very well proxied by some combination of mind-muscle connection, pump, and disruption.
314
+
315
+ The following questions can quantify RSM for a given workout session, the results of which are valuable and can be used in various ways:
316
+
317
+ #### Mind Muscle Connection
318
+
319
+ On a scale of 0-3 how much did the training challenge your target muscles?
320
+
321
+ - 0: You felt barely aware of your target muscles during the exercise
322
+ - 1: You felt like your target muscles worked, but mildly
323
+ - 2: You felt a good amount of tension and/or burn in the target muscles
324
+ - 3: You felt tension and burn close to the limit in your target muscles
325
+
326
+ #### The Pump
327
+
328
+ On a scale of 0-3 how much pump did you experience in the target muscles?
329
+
330
+ - 0: You got no pump at all in the target muscles
331
+ - 1: You got a very mild pump in the target muscles
332
+ - 2: You got a decent pump in the target muscles
333
+ - 3: You got close to maximal pump in the target muscles
334
+
335
+ #### Muscle Disruption
336
+
337
+ On a scale of 0-3 how much did the training disrupt your target muscles?
338
+
339
+ - 0: You had no fatigue, perturbation, or soreness in the target muscles
340
+ - 1: You had some weakness and stiffness after the session in the target muscles, but recovered by the next day
341
+ - 2: You had weakness and stiffness after the session and experienced soreness the following day
342
+ - 3: You got much weaker and felt perturbation in the target muscles right after the session and also had soreness for a few days or more
343
+
344
+ #### Result
345
+
346
+ Add these scores together to get your RSM between 0-9.
347
+
348
+ ### Mesocycles (pg. 58-61)
349
+
350
+ Mesocycles consist of two phases, the accumulation phase, and the shorter deload phase.
351
+
352
+ In general, DO NOT change exercises part way through a mesocycle. Not only does it prevent accurate tracking, but on page 174, it goes in depth that it can also prevent meaningful technique and load progression.
353
+
354
+ #### Accumulation Phase
355
+
356
+ The goal of this phase is to start at your MEV, and then progress towards your MRV. In order to do that, we need to know what your MEV is. The first time you will need to gauge this. But you may be able to go a few mesocycles before gauging it again. You can gauge it again whenever you like, or just use the data that you have recorded to project into the future.
357
+
358
+ To get your MEV, do the RSM calculation for the first 2-3 days of the mesocycle. Use that information to judge the following:
359
+
360
+ <!-- prettier-ignore -->
361
+ | Total Score | Proximity to MEV | Recommendation |
362
+ |---:|---|---|
363
+ | 0–1 | Stimulus likely below MEV | Increase volume the following week by two to four sets |
364
+ | 2–3 | Stimulus likely at or below MEV | Increase volume the following week by two to four sets |
365
+ | 4–6 | Stimulus likely at or just above MEV (a great place to start your mesocycle) | Progress normally |
366
+ | 7–9 | Stimulus likely between MEV and MRV, possibly exceeding MRV | Drop volume the following week |
367
+
368
+ After you get this information, go ahead and finish out the first week at MEV, then calculate how you should progress by answering the following questions:
369
+
370
+ On a scale of 0-3 how sore did you get in the target muscles?
371
+
372
+ - 0: You did not get at all sore in the target muscles
373
+ - 1: You got stiff for a few hours after training and had mild soreness in the target muscles that resolved by next session targeting the same muscles
374
+ - 2: You got DOMS in the target muscles that resolved just in time for the next session targeting the same muscles
375
+ - 3: You got DOMS in the target muscles that remained for the next session targeting the same muscles
376
+
377
+ On a scale of 0-3 how was your performance?
378
+
379
+ - 0: You hit your target reps, but either had to do 2 more reps than planned to hit target RIR or you hit your target reps at 2 or more reps before target RIR
380
+ - 1: You hit your target reps, but either had to do 0-1 more reps than planned to hit target RIR or you hit your target reps at 1 rep before target RIR
381
+ - 2: You hit your target reps after your target RIR
382
+ - 3: You could not match last week's reps at any RIR
383
+
384
+ Then use the following table to determine how many sets to add the next week generally, or if you need to employ recovery sessions.
385
+
386
+ <!-- prettier-ignore -->
387
+ | Soreness Score ↓ \ Performance Score → | 0 | 1 | 2 | 3 |
388
+ |---|---|---|---|---|
389
+ | **0** | Add 1–3 sets | Add 0–2 sets | Do not add sets | Employ recovery sessions (see Fatigue Management) |
390
+ | **1** | Add 1–2 sets | Add 0–1 sets | Do not add sets | Employ recovery sessions (see Fatigue Management) |
391
+ | **2** | Do not add sets | Do not add sets | Do not add sets | Employ recovery sessions (see Fatigue Management) |
392
+ | **3** | Do not add sets | Do not add sets | Do not add sets | Employ recovery sessions (see Fatigue Management) |
393
+
394
+ > The overall goal should be on set progression. Try not to increase load too much unless you really need to. Volume will give you more results than load as far as muscle growth.
395
+
396
+ You should have at least 4 weeks as your goal for the accumulation phase, and at the very most, 8 weeks. You know it's time to stop and go into deload when you are hitting 0 RIR, 85% 1RM. (pg. 184)
397
+
398
+ As far as an initial calculation, before adjustments are introduced, you want to begin volume at 2-4 sets per muscle group per session (starting at 2 sets if no data exists), and project an increase of 1-2 sets per muscle group per week. If literally no data exists, then an increase of 1 set per week is great. As far as rep range, it ends up being pretty basic. You use the target rep range for that exercise (for example, a "Heavy" exercise is 5-15), then use the RIR. So in week 1, and a heavy exercise, this will always be a target of 11 reps for the first set where the load uses the targetPercentage formula, targeting 15 reps for the first set, then use the same weight for the subsequent sets.
399
+
400
+ The user can choose how they want to progress between two types of progression for a particular exercise:
401
+
402
+ - Load Progression: Add the lowest increment available for the weight that the exercise uses each week, within reason. Like if someone is lifting 300lbs, then perhaps increase by 10 lbs instead of 5lbs. A good rule of thumb is if the weight increase is less than 2% of the overall weight, then use the next higher increment available to get at, or above a 2% increase in the weight.
403
+ - Rep Progression (Default): Add 2 reps per week to each set that is being executed. The reps should be above the previous week's by 2 once data starts coming in. Don't adjust the weight unless the target reps goes above the maximum for that exercise, in which case increase by the lowest increment available.
404
+
405
+ So, with this in mind, the default projection might look like this:
406
+
407
+ - Week 1: 4 RIR, 2 sets per exercise
408
+ - Week 2: 3 RIR, 3 sets for the first exercise / session for each muscle group, and 2 sets for each subsequent exercise for that muscle group / session (if there's more than 1)
409
+ - Week 3: 2 RIR, 3 sets for the first + second exercise for each muscle group, or 4 sets if there's only 1 exercise for that session
410
+ - Week 4: 1 RIR, 4 sets for the first, 3 sets for the second, or 5 sets if there's only 1 exercise
411
+ - Week 5: 0 RIR, 4 sets for the first, 4 sets for the second, or 6 sets if there's only 1 exercise
412
+ - Week 6: Deload
413
+
414
+ #### Deload Phase (pg. 100,110-112)
415
+
416
+ The goal with the deload phase is that we do it right when our progression has a hit a high. Such as 85% 1RM, 0 RIR, and right at MRV. We want to give ourselves enough weeks of progression to make the deload worth it. For example if we hit that on week 2, then we would need 1 week of deload after week 2 and only get 2 weeks of progression for every 3. But if we do 4 weeks of progression, and 1 week of deload, we get a better ratio of muscle growth over the year.
417
+
418
+ When to take a deload?
419
+
420
+ - When you have hit MRV and it is scheduled
421
+ - More than half of your muscles have required a recovery session in the last two weeks (even if for the first time)
422
+ - Take one after you have had a sickness that takes more than 3 days to recover (see Fatigue Management section).
423
+
424
+ How to take a deload?
425
+
426
+ - How to choose the exercises: This can be done in 3 different ways, which are choosing the current mesocycle's exercises, the next mesocycle's, or specifically low stress exercises. To keep things simple for the purposes of my own program, I am just going to go with the first option. It is safest, and easiest to calculate.
427
+ - How much stimulus to impose: Similar to recovery sessions, for the first half of the week, cut the last microcycle's sets and reps in half, but keep the same weight. The the second half of the week, cut the weight in half as well.
428
+
429
+ #### Phase Potentiation (pg. 181-191)
430
+
431
+ This is a more advanced concept, and could be explored further later on. Basically, it is a way to organize mesocycles, outside of the periodic active rest periods, to get better performance. This seems to be characterized by a maintenance training phase which is an entire mesocycle training at MV (so very low volumes), but with high weight.
432
+
433
+ Page 190 talks about the muscle-gain block -> maintenance block -> fat loss block macrocycle. This seems like the golden standard to look up to. It involves 2-4 mesocycles of gaining muscle through MEV-MRV training and hypercaloric eating, then a 1-2 mesocycle block of MV training and maintenance eating, then a 1-2 mesocycle block of fat loss with MEV-MRV training and hypocaloric eating. You would typically eat up to 20% body fat for males and 30% for females, then go back down. Again, this is the golden standard though that seems to be for professionals. I need to think through how to do this for more recreational purposes. But I do know this works.
434
+
435
+ A clean middle-ground might be to just take a resensitization phase every 3-4 mesocycles, in addition to the active break once a year. So that would be 1-2 months of MV training basically. But a month is most likely all you need. See page 194 for more info.
436
+
437
+ Identifying the type of mesocycle that is happening in the data model may be helpful to provide even more context. For example, a strength gain mesocycle will likely always be more productive than a cutting mesocycle. There are some great tips on how to track progress during a cutting mesocycle and how to track on page 220-221. What it comes down to is trying to stay around MEV for as long as possible until your cut is complete. You don't want your cut to ever last longer than a single mesocycle, so for example, instead of progressing from 5 sets to 9 sets over four weeks, you might go from 5 to 7 sets over six weeks. You still take the deload at the end of course, and progress with the roughly normal (but reduced) set and rep progression algorithm.
438
+
439
+ ### Fatigue (pg. 87-89)
440
+
441
+ There are different types of fatigue outlined below:
442
+
443
+ - Systemic Fatigue: This impacts the whole body irrespective of where or how it was generated. Psychological stress also increases systemic fatigue and that can affect your rate of muscle growth. In fact, the symptoms of physically based systemic fatigue and psychologically based fatigue are often indistinguishable.
444
+ - Local Fatigue: This is just the fatigue you feel in a muscle just after doing an exercise, or after a workout has concluded on that muscle.
445
+
446
+ Fatigue as it builds up can cause many issues. Starting with losing uncomfortable sessions, to reductions in performance, to full injury. Fatigue must be managed, and the balance of stimulus to fatigue is the biggest challenge in program design because you want the most stimulus you can get for the least fatigue.
447
+
448
+ #### Stimulus to Fatigue Ratio (SFR) (pg. 91-95)
449
+
450
+ Because of the above info about fatigue, we get a handy term: Stimulus to Fatigue Ratio or SFR. This can be thought of as Hypertrophy Stimulated (RSM) / Fatigue Generated. To estimate fatigue we can use the following questions:
451
+
452
+ Joint and Connective Tissue Disruption: On a scale of 0-3 how much did the training disrupt your joints and connective tissues?
453
+
454
+ - 0: You had minimal to no pain or perturbation in your joints or connective tissues
455
+ - 1: You had some pain or perturbation in your joints and connective tissues but recovered by the next day
456
+ - 2: You had some persistent pain or tightness in your connective tissues that lasted through the following day or several days
457
+ - 3: You develop chronic pain in the joints and connective tissues that persists across days to weeks or longer
458
+
459
+ Perceived Exertion / Perceived Effort Per Set: On a scale of 0-3 how much perceived effort went into the training?
460
+
461
+ - 0: Training felt very easy and hardly taxed you psychologically
462
+ - 1: You put effort into the training, but felt recovered by the end of the day
463
+ - 2: You put a large effort into the training and felt drained through the next day
464
+ - 3: You put an all-out effort into the training and felt drained for days
465
+
466
+ Unused Muscle Performance: On a scale of 0-3 how much performance falloff did you see in unused muscles?
467
+
468
+ - 0: Performance on subsequent exercises targeting unused muscles was better than expected
469
+ - 1: Performance on subsequent exercises targeting unused muscles was as expected
470
+ - 2: Performance on subsequent exercises targeting unused muscles was worse than expected
471
+ - 3: Your performance on subsequent exercises targeting unused muscles was hugely deteriorated
472
+
473
+ Then to get your SFR, you just divide RSM by Fatigue.
474
+
475
+ To improve SFR:
476
+
477
+ - Change the exercise (if there is a clear winner as far as stimulus to the target muscle and less or equal fatigue, for example partial low-bar squats vs deep squats, where deep squats is a clear winner). Some of the best SFR exercises allow for:
478
+ - The application of high forces through the largest ranges of motion
479
+ - Minimal involvement of non-target muscles
480
+ - The lowest possible energy expenditure to keep systemic fatigue low
481
+ - The lowest axial loading (loading on the spine) to keep axial fatigue low
482
+ - Focus harder on form by:
483
+ - Using a full range of motion
484
+ - Focusing on mind-muscle connection with the target muscles (surprisingly effective)
485
+ - Controlling eccentric and concentric movements to enhance stimulus and reduce joint stress
486
+ - Avoiding swinging, momentum, or using unnecessary muscles to move the weight
487
+ - Executing the movement so that it biomechanically targets the intended muscle best (for example, placing your feet low on the leg press to target quads instead of placing them high to push more weight)
488
+ - Executing the movement so that wear and tear is reduced (not squatting on your toes, which would give your knees needless strain)
489
+ - Doing all of the above in an individually tailored way for your body
490
+
491
+ #### Fatigue Management (pg. 101-111)
492
+
493
+ In addition to the above, which help improve the SFR, which can also help reduce fatigue during an exercise, this section is for managing fatigue specifically.
494
+
495
+ - Train within your volume landmarks (between MEV and MRV). If you find yourself hitting your limit, and falling in reps than what you did the previous week, you NEED to stop and take a rest week. This means you are already past your MRV which is bad. The rest of the suggestions below are assuming you are working out correctly between MEV and MRV.
496
+ - Take a rest day. Try to fit 1 rest day per week, and optimally, 2 in a row (due to general word-of-mouth among bodybuilders it seems, 2 in a row is really good).
497
+ - Take recovery sessions: When rest days would throw off your schedule, but you still need to reduce the load because you are tracking to go over MRV before the deload week, that is when a recovery session comes in handy. If you have your MEV and MRV on pat, then this normally shouldn't be necessary. But that is very unlikely when first starting programs.
498
+ - Recovery sessions should target the affected muscle group. In bad cases, you may need to take it easy for the entire session, but it is better if just the impacted muscle group has lower volume.
499
+ - To actually take a recovery session, simply cut the planned reps and sets in half. So if you planned to do 5 sets of 20 reps roughly, then do 2 sets of 10 reps. Use the same weight though. If you feel that you can't do any reps at the same weight, then cut the weight and sets in half, but leave the reps the same.
500
+ - Note that cutting things in half may seem like overkill. But what you want to avoid is only reducing the number of sets by 1, or number of reps by a couple and calling that a recovery. That just reduces stimulation AND doesn't reduce fatigue. Making both problems worse.
501
+ - Active rest periods (pg. 112): This happens once per year and lasts 1-4 weeks. Take the time completely off and try not to binge eat lol. Normally this is done right after a deload, and works well with holidays. This is actually not needed for recreational hypertrophy training because the training is a hobby and not a career and the amount of stresses on the body is much less, but it is encouraged.
502
+
503
+ If you are sick, and it is a fever or bad sickness, then take as many rest days as you need to fully recover. You don't want to exacerbate the problem by training early which will make it take even longer to recover and lose more time. After a sickness that takes more than a few days to recover, you need to take a deload and then start a new mesocycle.
504
+
505
+ ### Exercise and Program Concepts
506
+
507
+ #### Exercise Order (pg. 68-69)
508
+
509
+ Exercises should generally stay the same over a mesocycle, but they can change order. You should generally have the following priorities when choosing the order:
510
+
511
+ 1. What your priority is as far as the muscles being trained (If you want better rear delts, train those first on the day where they get trained. Don't leave them till last)
512
+ 2. What gives you the best stimulus / pump (Even though you may not prefer an exercise, if it gives you a better pump, you need to use that)
513
+
514
+ #### Exercise Frequency (pg. 133-141)
515
+
516
+ In the book, there is a very great level of detail into this topic, that can be researched at a later time if desired. Only the very highest-level points are summarized below.
517
+
518
+ Note that you likely need a warm-up before each muscle group. So having a higher set count, and less sessions per week for a muscle-group means a more efficient use of time. But it needs to be balanced, because you can fit in more sets if you do more sessions, which means more stimulus is available.
519
+
520
+ Session count:
521
+
522
+ - If you are going to increase session count, never increase it more than 1 session per mesocycle to keep systemic fatigue at bay, and gauge your response.
523
+ - 1x per week is insufficient. 2x per week is alright, and 4x per week is great. 5x per week has a very tiny fractional benefit over 4x per week.
524
+
525
+ Muscle Group Session / Microcycle:
526
+
527
+ - Smaller muscle groups (biceps / triceps) can be trained more often. Larger muscle groups likely need less.
528
+ - Roughly 2-4 muscle group sessions / microcycle can turn out to be good, but that is a very loose rule of thumb (pg. 143)
529
+ - A simple algorithm, is to start with 2x each muscle group per microcycle. Note the soreness score you get for each muscle group each week. Then at the end of the mesocycle (while following the set progression described elsewhere), look over all sessions and see if you healed just on time each time. If you did, then you can keep that number of sessions If you were never sore in that muscle group, or always healed early, bump it up by 1 session. If the set progression algorithm prevented volume increases, or you didn't recover in time, then consider removing a muscle group session for the next mesocycle. The goal here is to figure out your total effective sets / peak effective sets for each muscle group, which will act as your MRV. (pg. 145)
530
+
531
+ Sets / Muscle Group / Session:
532
+
533
+ - 2 or more sets and less than 15 sets are the hard limits. 15 is bad though, 12 is a much better cap and 2 is not great either (except at the very beginning of a meso at MEV if needed), 3-5 is a better minimum. (pg. 142-143)
534
+
535
+ Sets / Session:
536
+
537
+ - 25 total sets per session is a good average MRV cap. Some people can do 30, but anything more than 30 should be a red flag. (pg. 142)
538
+
539
+ #### Load Selection
540
+
541
+ The overall goal is to use between 30% and 85% 1RM for loads (weight). So a set with a target of 5 reps should be 85% 1RM, and a set with a target of 30 reps should be 30% 1RM. A formula can be derived from this, where we find the expected increase in percentage per rep. 85-30 = 55, then 30-5 = 25. So 55/25 = 2.2%/rep. This means that for a given target of lets say 10, we can use 30% + ((10-5) \* 2.2) = 41% of 1RM. Then the more general formula becomes:
542
+
543
+ targetPercentage = 30 + ((targetReps - 5) \* 2.2)
544
+
545
+ #### Exercise Selection (pg. 160-161)
546
+
547
+ Generally choose exercises that are going to give you great Raw Stimulus Magnitude (RSM), and align with your goals. At the end of a mesocycle you can decide if you want to swap one out for another if it is stalling, feeling stale, or hurting you. But if things are going well, don't swap it out! Don't be afraid to hold onto an exercise through mesocycles for a year or more if it keeps working for you, but swap the ones that aren't working out. Just make sure to use an honest assessment. No dogma.
548
+
549
+ There isn't a definitive part in the book that says this, but it seems implied: Do not do the EXACT same workout twice in the same microcycle. This is to help prevent wear and tear on joints, but also prevent adaptive resistance. This doesn't mean you can't do squats twice in the same week, but what it does mean, is you shouldn't do squats with the same tempo (3 seconds down, 1 second stretch, normal up for example), rep range (heavy / medium / light), and form in the same microcycle. Simply vary something with the workout, and you can do it again.
550
+
551
+ #### 1 Rep Max Calculations
552
+
553
+ These are exhausting to test, and dangerous. You will be strongest at the end of a resensitization phase, or phase where you are working at MV for an extended period of time. The upsides, are you get an accurate representation of 1RM that you can use, the downsides are the danger and fluctuations. Also testing causes 0 gains on it's own. [Here is a Youtube video from RP that discusses this](https://www.youtube.com/watch?v=4luBPhK-rlE). The primary reason this information is needed, is for the algorithms.
554
+
555
+ [NASM provides a 1-rep max calculator](https://www.nasm.org/resources/one-rep-max-calculator) / algorithm that seems like it is relatively accurate. It comes from a reputable organization so it seems safe to trust them. The algorithm can be done by trying to do the most weight you can for the lowest reps possible (lower reps makes it more accurate) and plug it in to: 1RM = (Weight Lifted x Reps / 30.48) + Weight Lifted.
556
+
557
+ # Todo
@@ -0,0 +1,22 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * The docType value for WorkoutEquipmentType documents.
4
+ */
5
+ export declare const WorkoutEquipmentType_docType = "workoutEquipmentType";
6
+ /**
7
+ * The schema for {@link WorkoutEquipmentType} documents.
8
+ */
9
+ export declare const WorkoutEquipmentTypeSchema: z.ZodObject<{
10
+ docType: z.ZodDefault<z.ZodLiteral<"workoutEquipmentType">>;
11
+ title: z.ZodString;
12
+ weightOptions: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodNumber>>>;
13
+ createdDate: z.ZodDefault<z.ZodDate>;
14
+ lastUpdatedDate: z.ZodDefault<z.ZodDate>;
15
+ _id: z.ZodPipe<z.ZodDefault<z.ZodUUID>, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
16
+ userId: z.ZodPipe<z.ZodUUID, z.ZodTransform<`${string}-${string}-${string}-${string}-${string}`, string>>;
17
+ }, z.core.$strip>;
18
+ /**
19
+ * Represents a type of workout equipment with its available weight options.
20
+ */
21
+ export type WorkoutEquipmentType = z.infer<typeof WorkoutEquipmentTypeSchema>;
22
+ //# sourceMappingURL=WorkoutEquipmentType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkoutEquipmentType.d.ts","sourceRoot":"","sources":["../../../src/documents/workout/WorkoutEquipmentType.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB;;GAEG;AACH,eAAO,MAAM,4BAA4B,yBAAyB,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;iBAmBrC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}