@bitcobblers/wod-wiki-tools 0.0.0-stage → 0.36.2133

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 (74) hide show
  1. package/dist/bin/wod.cjs +3532 -0
  2. package/dist/bin/wod.cjs.map +1 -0
  3. package/dist/bin/wod.d.cts +1 -0
  4. package/dist/bin/wod.d.ts +1 -0
  5. package/dist/bin/wod.mjs +17 -0
  6. package/dist/bin/wod.mjs.map +1 -0
  7. package/dist/chunk-6L5ZDZJ7.mjs +15 -0
  8. package/dist/chunk-6L5ZDZJ7.mjs.map +1 -0
  9. package/dist/chunk-DZESCGCM.mjs +123 -0
  10. package/dist/chunk-DZESCGCM.mjs.map +1 -0
  11. package/dist/chunk-EUQWEX6Z.mjs +253 -0
  12. package/dist/chunk-EUQWEX6Z.mjs.map +1 -0
  13. package/dist/chunk-K3GZZFAC.mjs +300 -0
  14. package/dist/chunk-K3GZZFAC.mjs.map +1 -0
  15. package/dist/chunk-OZI2FYPF.mjs +2061 -0
  16. package/dist/chunk-OZI2FYPF.mjs.map +1 -0
  17. package/dist/compiler-KT6P3AC6.mjs +730 -0
  18. package/dist/compiler-KT6P3AC6.mjs.map +1 -0
  19. package/dist/index.cjs +3548 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.d.cts +356 -0
  22. package/dist/index.d.ts +356 -0
  23. package/dist/index.mjs +12 -0
  24. package/dist/index.mjs.map +1 -0
  25. package/dist/server/app.cjs +299 -0
  26. package/dist/server/app.cjs.map +1 -0
  27. package/dist/server/app.d.cts +24 -0
  28. package/dist/server/app.d.ts +24 -0
  29. package/dist/server/app.mjs +9 -0
  30. package/dist/server/app.mjs.map +1 -0
  31. package/dist/server-Z2T7IGZX.mjs +11 -0
  32. package/dist/server-Z2T7IGZX.mjs.map +1 -0
  33. package/dist/web/playground/ai-skills/parse.md +656 -0
  34. package/dist/web/playground/assets/main-Bh_mthqc.js +212 -0
  35. package/dist/web/playground/assets/main-Bhn9NHgQ.css +2 -0
  36. package/dist/web/playground/assets/rolldown-runtime-C0FnF6B9.js +1 -0
  37. package/dist/web/playground/assets/statementBuilderFlow-gvzmxfiE.js +2 -0
  38. package/dist/web/playground/assets/vendor-BlJqgFME.js +201 -0
  39. package/dist/web/playground/assets/vendor-codemirror-BtJgoBjf.js +40 -0
  40. package/dist/web/playground/fonts/Inter-Regular.woff2 +0 -0
  41. package/dist/web/playground/fonts/Inter-SemiBold.woff2 +0 -0
  42. package/dist/web/playground/images/hero/editing.png +0 -0
  43. package/dist/web/playground/images/hero/journal.png +0 -0
  44. package/dist/web/playground/images/hero/results.png +0 -0
  45. package/dist/web/playground/images/hero/timer.png +0 -0
  46. package/dist/web/playground/images/wod-wiki-logo-dark.png +0 -0
  47. package/dist/web/playground/images/wod-wiki-logo-light.png +0 -0
  48. package/dist/web/playground/index.html +60 -0
  49. package/dist/web/playground/seed/core/chunks/canvas.d2a5e6e7.json +1 -0
  50. package/dist/web/playground/seed/core/chunks/template.e5e0e82d.json +1 -0
  51. package/dist/web/playground/seed/core/manifest.json +24 -0
  52. package/dist/web/playground/seed/core/report.html +43 -0
  53. package/dist/web/server/ai-skills/parse.md +656 -0
  54. package/dist/web/server/assets/main-Bhn9NHgQ.css +2 -0
  55. package/dist/web/server/assets/main-CPRFCrjV.js +211 -0
  56. package/dist/web/server/assets/rolldown-runtime-C0FnF6B9.js +1 -0
  57. package/dist/web/server/assets/statementBuilderFlow-DT1tyXgc.js +2 -0
  58. package/dist/web/server/assets/vendor-BlJqgFME.js +201 -0
  59. package/dist/web/server/assets/vendor-codemirror-BtJgoBjf.js +40 -0
  60. package/dist/web/server/fonts/Inter-Regular.woff2 +0 -0
  61. package/dist/web/server/fonts/Inter-SemiBold.woff2 +0 -0
  62. package/dist/web/server/images/hero/editing.png +0 -0
  63. package/dist/web/server/images/hero/journal.png +0 -0
  64. package/dist/web/server/images/hero/results.png +0 -0
  65. package/dist/web/server/images/hero/timer.png +0 -0
  66. package/dist/web/server/images/wod-wiki-logo-dark.png +0 -0
  67. package/dist/web/server/images/wod-wiki-logo-light.png +0 -0
  68. package/dist/web/server/index.html +60 -0
  69. package/dist/web/server/seed/core/chunks/canvas.d2a5e6e7.json +1 -0
  70. package/dist/web/server/seed/core/chunks/template.e5e0e82d.json +1 -0
  71. package/dist/web/server/seed/core/manifest.json +24 -0
  72. package/dist/web/server/seed/core/report.html +43 -0
  73. package/package.json +46 -4
  74. package/README.md +0 -3
@@ -0,0 +1,656 @@
1
+ ---
2
+ name: wod-extraction
3
+ description: 'Extract and convert any workout description into WOD Wiki syntax. Understands workout intent to determine which metrics to collect (time, reps, distance, weight) based on the workout type and structure.'
4
+ license: MIT
5
+ ---
6
+
7
+ # WOD Extraction — Converting Workouts to Whiteboard Script
8
+
9
+ ## Overview
10
+
11
+ Take any workout description — from a whiteboard photo, a coach's programming post, a competition event description, or a casual text message — and produce well-formed WOD Wiki syntax that captures both the workout structure and the **implied measurements** the athlete cares about.
12
+
13
+ ## When to Use
14
+
15
+ Use this skill when:
16
+
17
+ - A user provides a workout in plain English (or any natural language) and wants it converted to WOD Wiki syntax
18
+ - A user asks to "write this workout in wod syntax" or "encode this workout"
19
+ - A competition workout needs to be transcribed into the project's `wod/` library
20
+ - The user wants help understanding what metrics a workout is tracking
21
+
22
+ ---
23
+
24
+ ## Core Concept: What Does the Athlete Want to Measure?
25
+
26
+ The fundamental insight behind WOD Wiki syntax is that **every workout implies what should be measured**. The syntax encodes both the workout prescription AND the collectible metrics. Understanding the workout's intent lets you choose the right syntax.
27
+
28
+ | Workout Intent | What the Athlete Measures | Syntax Signal |
29
+ |---|---|---|
30
+ | "For Time" | **Time** to complete | Use `:?` (collectible timer) or `^:?` (count-up collectible) on the overall set |
31
+ | "AMRAP in X minutes" | **Rounds** completed | Use a fixed timer like `20:00` with a label `AMRAP` |
32
+ | "EMOM for X minutes" | **Completion** within each interval | Use `(rounds) :60 EMOM` pattern |
33
+ | "Run for 20 minutes" | **Distance** covered | Use fixed timer + `?m` or `?mile` (collectible distance) |
34
+ | "Run 5K" | **Time** it took | Use distance `5000m` or `5km` + `:?` (collectible timer) |
35
+ | "Work up to a heavy single" | **Weight** achieved | Use `?lb` or `?kg` (collectible resistance) |
36
+ | "Max reps in 1 minute" | **Reps** performed | Use fixed timer + `?` (collectible reps) |
37
+ | "X reps at fixed weight" | **Time** to complete | Reps are specified, weight is specified, time is the unknown |
38
+
39
+ ### The Collectible Rule
40
+
41
+ When a value is **prescribed** (given to the athlete), write it literally. When a value is the **outcome** (what the athlete discovers by doing the workout), use the `?` placeholder to make it collectible:
42
+
43
+ - `?` — collectible reps (how many did you do?)
44
+ - `:?` — collectible timer (how long did it take?)
45
+ - `^:?` — collectible count-up timer (elapsed time, counting up)
46
+ - `?lb` / `?kg` — collectible resistance (what weight did you reach?)
47
+ - `?m` / `?mile` / `?km` — collectible distance (how far did you go?)
48
+
49
+ ---
50
+
51
+ ## Whiteboard Script Reference
52
+
53
+ ### Statement Structure
54
+
55
+ Each line in a WOD Wiki script is a **statement**. A statement can contain any combination of these fragments, in any order:
56
+
57
+ ```
58
+ [group-prefix] [rounds] [timer] [reps] [effort] [resistance] [distance] [action]
59
+ ```
60
+
61
+ Indentation creates parent-child relationships: indented lines are children of the nearest less-indented line above them.
62
+
63
+ ### Fragment Reference
64
+
65
+ #### Timer — Duration/Time
66
+ ```
67
+ 5:00 → 5 minutes (countdown timer)
68
+ 1:30 → 1 minute 30 seconds
69
+ :30 → 30 seconds
70
+ 1:00:00 → 1 hour
71
+ ^5:00 → 5 minutes, counting UP (^ modifier)
72
+ :? → collectible timer (athlete records elapsed time)
73
+ ^:? → collectible count-up timer
74
+ ```
75
+
76
+ #### Reps — Repetition Count
77
+ ```
78
+ 21 → 21 reps (when followed by an effort/exercise name)
79
+ ? → collectible reps (athlete records how many they did)
80
+ ```
81
+
82
+ Note: A bare number is interpreted as reps when it precedes an effort (exercise name). Numbers adjacent to distance/weight units are parsed as part of those fragments instead.
83
+
84
+ #### Effort — Exercise Name
85
+ ```
86
+ Thrusters → exercise name (single word)
87
+ Clean & Jerk → exercise name (multi-word, parsed as consecutive identifiers)
88
+ Air Squats → exercise name
89
+ KB Swings → exercise name
90
+ Rest → rest period (when combined with a timer like :30 Rest)
91
+ AMRAP → label (when combined with a timer like 20:00 AMRAP)
92
+ EMOM → label (when combined with rounds+timer like (30) :60 EMOM)
93
+ ```
94
+
95
+ #### Resistance — Weight/Load
96
+ ```
97
+ 95lb → 95 pounds
98
+ 32kg → 32 kilograms
99
+ bw → bodyweight
100
+ 1.5bw → 1.5x bodyweight
101
+ ?lb → collectible weight in pounds
102
+ ?kg → collectible weight in kilograms
103
+ @135lb → resistance with @ prefix (alternative notation)
104
+ ```
105
+
106
+ #### Distance
107
+ ```
108
+ 400m → 400 meters
109
+ 1000m → 1000 meters
110
+ 1mile → 1 mile
111
+ 5km → 5 kilometers
112
+ ?m → collectible distance in meters
113
+ ?mile → collectible distance in miles
114
+ ```
115
+
116
+ #### Rounds — Repetition Structure
117
+ ```
118
+ (3) → repeat children 3 times
119
+ (5) → repeat children 5 times
120
+ (21-15-9) → 3 rounds, with 21 reps first, then 15, then 9
121
+ (50-40-30-20-10) → 5 rounds with descending reps
122
+ (10-9-8-7-6-5-4-3-2-1) → 10 rounds descending by 1
123
+ (EMOM) → named round label
124
+ (Warmup) → named round label
125
+ ```
126
+
127
+ #### Group Prefix — Child Relationship Type
128
+ ```
129
+ - → "round" group: each child line runs as a separate step within the round
130
+ + → "compose" group: consecutive + lines are bundled into a single composed set
131
+ (no prefix) → "repeat" group: default when a line is indented under a parent
132
+ ```
133
+
134
+ The distinction between `-` and `+`:
135
+ - **`-` (round)**: Lines run sequentially as separate steps. Use when exercises are done one at a time in order.
136
+ - **`+` (compose)**: Lines are combined into a single logical set. Use for EMOMs, complexes, or supersets where all exercises are done together within each round.
137
+
138
+ #### Action — Side-Effect Commands
139
+ ```
140
+ [:action-name] → triggers a named action (e.g., sound, event)
141
+ [:!pinned] → pinned action (persists across rounds)
142
+ ```
143
+
144
+ #### Trend — Increment Modifier
145
+ ```
146
+ ^ → increment/trend up modifier (when standalone, not before timer)
147
+ ```
148
+
149
+ ### Indentation Rules
150
+
151
+ Indentation defines the hierarchical structure of a workout:
152
+
153
+ ```time
154
+ (3) ← parent: 3 rounds
155
+ 400m Run ← child: runs within each round (implicitly "repeat" group)
156
+ 21 KB Swings 53lb ← child: runs within each round
157
+ 12 Pullups ← child: runs within each round
158
+ ```
159
+
160
+ Children inherit the round count from their parent. Deeper indentation creates deeper nesting.
161
+
162
+ ---
163
+
164
+ ## Conversion Patterns
165
+
166
+ ### Pattern 1: "For Time" Workouts
167
+
168
+ The athlete is prescribed the work. The measurement is **how long it takes**.
169
+
170
+ **Natural language:**
171
+ > Fran: 21-15-9 Thrusters (95lb) and Pullups, for time
172
+
173
+ **WOD Wiki syntax:**
174
+ ```time
175
+ (21-15-9)
176
+ Thrusters 95lb
177
+ Pullups
178
+ ```
179
+
180
+ The time is the collectible — the system tracks it automatically via the round structure. No explicit `:?` is needed because the runtime measures elapsed time for all "for time" workouts by default.
181
+
182
+ ### Pattern 2: AMRAP (As Many Rounds As Possible)
183
+
184
+ The athlete is given a fixed time. The measurement is **rounds completed**.
185
+
186
+ **Natural language:**
187
+ > 20-minute AMRAP: 5 pullups, 10 pushups, 15 air squats
188
+
189
+ **WOD Wiki syntax:**
190
+ ```time
191
+ 20:00 AMRAP
192
+ 5 Pullups
193
+ 10 Pushups
194
+ 15 Air Squats
195
+ ```
196
+
197
+ The timer `20:00` is the prescribed duration. `AMRAP` is an effort label. The round count is the collectible — tracked automatically.
198
+
199
+ ### Pattern 3: EMOM (Every Minute On the Minute)
200
+
201
+ The athlete is given intervals. The measurement is **completion within each interval**.
202
+
203
+ **Natural language:**
204
+ > EMOM 30 minutes: 5 pullups, 10 pushups, 15 air squats
205
+
206
+ **WOD Wiki syntax:**
207
+ ```time
208
+ (30) :60 EMOM
209
+ + 5 Pullups
210
+ + 10 Pushups
211
+ + 15 Air Squats
212
+ ```
213
+
214
+ The `+` prefix composes the exercises into a single set done each minute. `(30)` is rounds. `:60` is the interval timer. `EMOM` is a label.
215
+
216
+ ### Pattern 4: Timed Intervals with Rest
217
+
218
+ **Natural language:**
219
+ > 4 rounds of 100m swim with 30 seconds rest
220
+
221
+ **WOD Wiki syntax:**
222
+ ```time
223
+ (4) Warmup
224
+ 100m Swim
225
+ :30 Rest
226
+ ```
227
+
228
+ ### Pattern 5: Single-Modality For Time
229
+
230
+ **Natural language:**
231
+ > 150 wall ball shots at 20lb, for time
232
+
233
+ **WOD Wiki syntax:**
234
+ ```time
235
+ 150 Wall Ball Shots 20lb
236
+ ```
237
+
238
+ ### Pattern 6: Distance-Based With Known Prescription
239
+
240
+ **Natural language:**
241
+ > Row 1000m, then 50 thrusters at 45lb, then 30 pullups — for time
242
+
243
+ **WOD Wiki syntax:**
244
+ ```time
245
+ 1000m Row
246
+ 50 Thrusters 45lb
247
+ 30 Pullups
248
+ ```
249
+
250
+ ### Pattern 7: Max Weight / Working Up
251
+
252
+ When the goal is to find a max weight, the weight is the collectible.
253
+
254
+ **Natural language:**
255
+ > Work up to a 1-rep max clean & jerk
256
+
257
+ **WOD Wiki syntax:**
258
+ ```time
259
+ 1 Clean & Jerk ?lb
260
+ ```
261
+
262
+ The `?lb` makes weight the collectible — the athlete enters what they achieved.
263
+
264
+ ### Pattern 8: Max Reps in a Time Domain
265
+
266
+ **Natural language:**
267
+ > In 1 minute, do as many pushups as possible
268
+
269
+ **WOD Wiki syntax:**
270
+ ```time
271
+ 1:00 ? Pushups
272
+ ```
273
+
274
+ The `?` makes reps the collectible.
275
+
276
+ ### Pattern 9: Run for Time, Measure Distance
277
+
278
+ **Natural language:**
279
+ > Run for 20 minutes, record distance
280
+
281
+ **WOD Wiki syntax:**
282
+ ```time
283
+ 20:00 ?m Run
284
+ ```
285
+
286
+ The timer is fixed. The distance `?m` is the collectible.
287
+
288
+ ### Pattern 10: Run a Distance, Measure Time
289
+
290
+ **Natural language:**
291
+ > Run 5K for time
292
+
293
+ **WOD Wiki syntax:**
294
+ ```time
295
+ 5km Run
296
+ ```
297
+
298
+ The distance is prescribed. The system automatically tracks time.
299
+
300
+ ### Pattern 11: Complexes and Supersets
301
+
302
+ When exercises are done together as a unit (barbell complex, superset), use `+` group prefix.
303
+
304
+ **Natural language:**
305
+ > EMOM 20 minutes: 2 cleans, 1 press, 3 front squats
306
+
307
+ **WOD Wiki syntax:**
308
+ ```time
309
+ (20) 1:00
310
+ + 2 Clean
311
+ + 1 Press
312
+ + 3 Front Squat
313
+ ```
314
+
315
+ ### Pattern 12: Descending Rep Schemes
316
+
317
+ **Natural language:**
318
+ > 21-15-9 deadlifts at 225lb and handstand pushups
319
+
320
+ **WOD Wiki syntax:**
321
+ ```time
322
+ (21-15-9)
323
+ Deadlift 225lb
324
+ Handstand Pushups
325
+ ```
326
+
327
+ The `(21-15-9)` creates 3 rounds. The rep count for each round is encoded in the sequence. Exercises inherit the rep count from their parent round.
328
+
329
+ ### Pattern 13: Multi-Section Workouts
330
+
331
+ When a workout has distinct phases (warmup, main set, cooldown), write each section as a separate top-level block.
332
+
333
+ **Natural language:**
334
+ > Warmup: 4x100m swim with 30s rest. Main set: 8x50m kick with 30s rest. Cooldown: 400m easy swim.
335
+
336
+ **WOD Wiki syntax:**
337
+ ```time
338
+ (4) Warmup
339
+ 100m Swim
340
+ :30 Rest
341
+
342
+ (8)
343
+ 50m Kick
344
+ :30 Rest
345
+
346
+ 400m Cooldown
347
+ ```
348
+
349
+ ### Pattern 14: With Structured Rest Between Rounds
350
+
351
+ **Natural language:**
352
+ > 5 rounds of 20 pullups, 30 pushups, 40 situps, 50 air squats. Rest 3 minutes between rounds.
353
+
354
+ **WOD Wiki syntax:**
355
+ ```time
356
+ (5)
357
+ + 20 Pullups
358
+ + 30 Pushups
359
+ + 40 Situps
360
+ + 50 Air Squats
361
+ 3:00 Rest
362
+ ```
363
+
364
+ ### Pattern 15: Bodyweight Percentage Loads
365
+
366
+ **Natural language:**
367
+ > 10-9-8-7-6-5-4-3-2-1 of Deadlift at 1.5x bodyweight, Bench Press at bodyweight, Clean at 0.75x bodyweight
368
+
369
+ **WOD Wiki syntax:**
370
+ ```time
371
+ (10-9-8-7-6-5-4-3-2-1)
372
+
373
+ Deadlift 1.5bw
374
+ Bench Press 1bw
375
+ Clean 0.75bw
376
+ ```
377
+
378
+ ### Pattern 16: Timed Sections Within a Workout
379
+
380
+ **Natural language:**
381
+ > 5 minutes: 100 KB Swings at 70lb. 1 minute rest. 10 minutes: 10 Turkish Getups at 70lb.
382
+
383
+ **WOD Wiki syntax:**
384
+ ```time
385
+ 5:00 100 KB Swings 70lb
386
+ 1:00 Rest
387
+ 10:00 10 Turkish Getups 70lb
388
+ ```
389
+
390
+ ### Pattern 17: Competition Events (For Time with Mixed Modality)
391
+
392
+ **Natural language:**
393
+ > For time: Run 800 meters, 100 Pistols, 50 Pull-ups, Run 800 meters
394
+
395
+ **WOD Wiki syntax:**
396
+ ```time
397
+ 800m Run
398
+ 100 Pistols
399
+ 50 Pullups
400
+ 800m Run
401
+ ```
402
+
403
+ ---
404
+
405
+ ## Decision Framework
406
+
407
+ When converting a workout, follow this decision tree:
408
+
409
+ ### Step 1: Identify the Workout Type
410
+
411
+ | Clue in Description | Workout Type | Key Syntax Element |
412
+ |---|---|---|
413
+ | "For time" | For Time | Reps/distance prescribed, time is outcome |
414
+ | "AMRAP", "as many rounds as possible" | AMRAP | `XX:00 AMRAP` with prescribed exercises |
415
+ | "EMOM", "every minute on the minute" | EMOM | `(N) :60 EMOM` with `+` grouped children |
416
+ | "Max reps", "as many as possible" | Max Reps | Fixed timer + `?` reps |
417
+ | "Max weight", "work to a heavy", "find your 1RM" | Max Weight | Exercise + `?lb` or `?kg` |
418
+ | "For distance", "run/row for X minutes" | For Distance | Fixed timer + `?m` or `?mile` |
419
+ | "Intervals", "X rounds of Y with rest" | Intervals | `(N)` rounds with exercises + `:XX Rest` |
420
+ | "Tabata" | Tabata | `(8) :20` work, `:10 Rest` pattern |
421
+
422
+ ### Step 2: Determine What's Prescribed vs Collected
423
+
424
+ For each element of the workout, ask: **"Is this given to the athlete, or does the athlete discover it?"**
425
+
426
+ | Element | Prescribed (write literally) | Collected (use ?) |
427
+ |---|---|---|
428
+ | Time | `5:00`, `20:00`, `:30` | `:?` or `^:?` |
429
+ | Reps | `21`, `15`, `9` | `?` |
430
+ | Weight | `95lb`, `32kg` | `?lb`, `?kg` |
431
+ | Distance | `400m`, `5km` | `?m`, `?km` |
432
+
433
+ ### Step 3: Determine Exercise Grouping
434
+
435
+ - **Sequential exercises** (done one at a time, in order): use no prefix or `-` prefix
436
+ - **Composed exercises** (done together as a set/complex): use `+` prefix
437
+ - **Exercises in rounds**: indent under a `(N)` parent
438
+
439
+ ### Step 4: Assemble the Syntax
440
+
441
+ 1. Write the round/time structure first (outermost container)
442
+ 2. Indent child exercises under their parent
443
+ 3. Add group prefixes (`+` or `-`) based on grouping intent
444
+ 4. Include resistance with the exercise on the same line
445
+ 5. Include distance with the movement on the same line
446
+ 6. Add rest periods as separate lines when explicitly prescribed
447
+
448
+ ---
449
+
450
+ ## Common Mistakes to Avoid
451
+
452
+ ### DON'T: Add collectible markers when the system tracks automatically
453
+ ```diff
454
+ # BAD: :? is redundant — "for time" workouts track time by default
455
+ - (21-15-9)
456
+ - :? Thrusters 95lb
457
+ - Pullups
458
+
459
+ # GOOD: Just write the prescription
460
+ + (21-15-9)
461
+ + Thrusters 95lb
462
+ + Pullups
463
+ ```
464
+
465
+ ### DON'T: Use `+` prefix when exercises are sequential (not composed)
466
+ ```diff
467
+ # BAD: These are done one after another, not composed
468
+ - (3)
469
+ - + 400m Run
470
+ - + 21 KB Swings 53lb
471
+ - + 12 Pullups
472
+
473
+ # GOOD: No prefix needed for sequential exercises in rounds
474
+ + (3)
475
+ + 400m Run
476
+ + 21 KB Swings 53lb
477
+ + 12 Pullups
478
+ ```
479
+
480
+ Use `+` only when exercises are done together within the same time interval (EMOMs, complexes, supersets).
481
+
482
+ ### DON'T: Forget that rounds define the rep scheme
483
+ ```diff
484
+ # BAD: Redundant reps when rounds already specify the scheme
485
+ - (21-15-9)
486
+ - 21 Thrusters 95lb
487
+ - 21 Pullups
488
+
489
+ # GOOD: Reps come from the round scheme, not the exercise line
490
+ + (21-15-9)
491
+ + Thrusters 95lb
492
+ + Pullups
493
+ ```
494
+
495
+ ### DON'T: Mix units without proper syntax
496
+ ```diff
497
+ # BAD: Weight unit with bare number and no unit
498
+ - 21 Thrusters 95
499
+
500
+ # GOOD: Always include the unit
501
+ + 21 Thrusters 95lb
502
+ ```
503
+
504
+ ### DON'T: Write "For Time" or "For time" as a literal effort
505
+ ```diff
506
+ # BAD: "For Time" is a workout descriptor, not an exercise
507
+ - For Time
508
+ - 100 Burpees
509
+
510
+ # GOOD: Just write the exercises — time tracking is implicit
511
+ + 100 Burpees
512
+ ```
513
+
514
+ ---
515
+
516
+ ## Output Format
517
+
518
+ When converting a workout, produce a markdown document with this structure:
519
+
520
+ ````markdown
521
+ # Workout Name
522
+
523
+ **Category**: [CrossFit Benchmark | StrongFirst | Competition | Custom]
524
+ **Type**: [For Time | AMRAP | EMOM | Max Weight | Intervals]
525
+ **Difficulty**: [Beginner | Intermediate | Advanced]
526
+
527
+ ## Description
528
+ Brief description of the workout.
529
+
530
+ ```time
531
+ [WOD Wiki syntax here]
532
+ ```
533
+
534
+ ## Breakdown
535
+ - **Rounds/Duration**: ...
536
+ - **Exercises**: ...
537
+ - **Goal**: ...
538
+
539
+ ## Collectible Metrics
540
+ - [What this workout measures and why]
541
+ ````
542
+
543
+ The `## Collectible Metrics` section should explicitly state what the athlete is expected to record and why, tying back to the workout intent.
544
+
545
+ ---
546
+
547
+ ## Worked Examples
548
+
549
+ ### Example 1: Converting a CrossFit Open Workout
550
+
551
+ **Input:**
552
+ > 24.3: For time — 10 thrusters (95/65), 10 chest-to-bar pull-ups, 10 thrusters (135/95), 10 bar muscle-ups, 10 thrusters (155/105), 10 bar muscle-ups. Time cap: 15 minutes.
553
+
554
+ **Analysis:**
555
+ - Type: For Time (time is the measurement)
556
+ - No repeating rounds — each line is a distinct movement at a distinct weight
557
+ - Time cap is prescribed context, not part of the syntax (it's metadata)
558
+
559
+ **Output:**
560
+ ```time
561
+ 10 Thrusters 95lb
562
+ 10 Chest to Bar Pullups
563
+ 10 Thrusters 135lb
564
+ 10 Bar Muscle Ups
565
+ 10 Thrusters 155lb
566
+ 10 Bar Muscle Ups
567
+ ```
568
+
569
+ ### Example 2: Converting a Strength Session
570
+
571
+ **Input:**
572
+ > Back Squat: Work up to a heavy set of 3. Then 3x5 at 80% of that weight.
573
+
574
+ **Analysis:**
575
+ - Part 1: Max weight is the goal — weight is collectible
576
+ - Part 2: Prescribed reps and sets at a computed weight
577
+
578
+ **Output:**
579
+ ```time
580
+ 3 Back Squat ?lb
581
+
582
+ (3)
583
+ 5 Back Squat 80%
584
+ ```
585
+
586
+ ### Example 3: Converting a Running Workout
587
+
588
+ **Input:**
589
+ > Run 1 mile, then 50 sandbag over shoulder (100 lbs), then run 1 mile. For time.
590
+
591
+ **Output:**
592
+ ```time
593
+ 1mile Run
594
+ 50 Sandbag Over Shoulder 100lb
595
+ 1mile Run
596
+ ```
597
+
598
+ ### Example 4: Converting a Tabata
599
+
600
+ **Input:**
601
+ > Tabata air squats (8 rounds: 20 seconds on, 10 seconds off). Record lowest round.
602
+
603
+ **Output:**
604
+ ```time
605
+ (8)
606
+ :20 ? Air Squats
607
+ :10 Rest
608
+ ```
609
+
610
+ The `?` on reps makes each round's count collectible.
611
+
612
+ ---
613
+
614
+ ## Edge Cases
615
+
616
+ ### No Equipment / Bodyweight Only
617
+ Omit resistance entirely:
618
+ ```time
619
+ 100 Burpees
620
+ 75 Situps
621
+ 50 Pushups
622
+ 25 Handstand Pushups
623
+ ```
624
+
625
+ ### Mixed Modality (Cardio + Lifting)
626
+ Different fragments coexist on the same line:
627
+ ```time
628
+ (5)
629
+ 400m Run
630
+ 15 Overhead Squats 95lb
631
+ ```
632
+
633
+ ### Asymmetrical Loading (Left/Right)
634
+ Write separate lines for each side:
635
+ ```time
636
+ (20)
637
+ + 1 Clean & Press Left
638
+ + 1 Clean & Press Right
639
+ + 2 Front Squat Right
640
+ ```
641
+
642
+ ### Rest Periods
643
+ Rest is just an effort name with a timer:
644
+ ```time
645
+ :30 Rest
646
+ 1:00 Rest
647
+ 3:00 Rest
648
+ ```
649
+
650
+ ### Named Sections
651
+ Use labels as effort names on the round line:
652
+ ```time
653
+ (4) Warmup
654
+ 100m Swim
655
+ :30 Rest
656
+ ```