diff --git a/README.md b/README.md index 4a77454..840a23a 100644 --- a/README.md +++ b/README.md @@ -20,30 +20,30 @@ ## What is OpenProgression? -OpenProgression (OP) is a **free, open standard** for classifying athletic ability across functional fitness. It provides a common language for coaches, athletes, and software to describe fitness levels — from first-day beginner to elite competitor. +OpenProgression (OP) is a **free, open standard** for classifying athletic ability across functional fitness. It provides a common language for coaches, athletes, and software to describe fitness levels -- from first-day beginner to elite competitor. @@ -67,6 +67,18 @@ OpenProgression (OP) is a **free, open standard** for classifying athletic abili > Levels are determined by the **weakest-link principle**: your overall level equals your lowest category level. This encourages well-rounded fitness rather than specialization. +### Foundation Milestones + +For athletes below the Beginner benchmarks, **Foundation Milestones** provide early progress markers: + +| Milestone | Name | Description | +|:---------:|------|-------------| +| F1 | **Foundation** | Chair sit-to-stand, wall push-up, farmer's carry, walking -- no gym needed | +| F2 | **Moving** | Air squats, incline push-ups, band rows, plank holds | +| F3 | **Ready** | Full push-up, dead hang or farmer's carry, running a mile | + +Foundation Milestones are not levels -- they are optional pre-level markers for applications that serve untrained or deconditioned populations. F1 requires only a chair and household items. Full spec: [`spec/progressions.md`](spec/progressions.md) + ## [The 8 Categories](https://openprogression.org/categories) | Category | Key Movements | @@ -97,9 +109,9 @@ An 80kg male who can: | Push-ups | 40 reps | Intermediate+ | | Fran | 4:30 | Intermediate+ | -**Overall level: Intermediate+** — all categories at INT+ or above. +**Overall level: Intermediate+** -- all categories at INT+ or above. -But if their pull-ups were only 4 (Intermediate), their overall level drops to **Intermediate** — the weakest link determines the chain. +But if their pull-ups were only 4 (Intermediate), their overall level drops to **Intermediate** -- the weakest link determines the chain. ## Repository Structure @@ -108,11 +120,14 @@ openprogression/ ├── spec/ # The standard (human-readable) │ ├── levels.md │ ├── categories.md -│ └── methodology.md +│ ├── methodology.md +│ └── progressions.md ├── data/ # Machine-readable benchmark data │ ├── levels.json │ ├── categories.json │ ├── sources.json +│ ├── progressions.json +│ ├── milestones.json │ └── benchmarks/ │ ├── squatting.json │ ├── pulling.json @@ -187,24 +202,25 @@ Build OP into your gym management software, workout tracking app, or coaching pl - Clear schema with TypeScript-friendly structure - Gender-differentiated standards across [25 benchmarks](https://openprogression.org/benchmarks) - Source citations for every benchmark -- [MIT licensed](https://openprogression.org/license) — use it however you want +- [MIT licensed](https://openprogression.org/license) -- use it however you want ## Contributing We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide. -- **Review benchmarks** — Are the numbers accurate for your experience? -- **Add movements** — Help expand the movement library -- **Improve methodology** — Suggest better research sources -- **Build integrations** — Create packages for your language/framework +- **Review benchmarks** -- Are the numbers accurate for your experience? +- **Add movements** -- Help expand the movement library +- **Improve methodology** -- Suggest better research sources +- **Build integrations** -- Create packages for your language/framework ## Roadmap -- [x] **[Level Calculator](https://openprogression.org/calculator)** — Instant level assessment across all 8 categories -- [x] **[Scaled Programming](https://openprogression.org/programming)** — WOD library and daily sessions with 7-level scaling -- [ ] **Age-adjusted benchmarks** — Current standards target ~18-40 year-olds. Future versions may include age brackets. -- [ ] **Expanded bodyweight scaling** — Enhanced BW-relative benchmarks beyond the current reference weights. -- [ ] **Additional movements** — Expanding the movement library within existing categories. +- [x] **[Level Calculator](https://openprogression.org/calculator)** -- Instant level assessment across all 8 categories +- [x] **[Scaled Programming](https://openprogression.org/programming)** -- WOD library and daily sessions with 7-level scaling +- [x] **[Movement Progressions & Foundation Milestones](spec/progressions.md)** -- Regression chains and pre-Beginner progress markers for untrained populations +- [ ] **Age-adjusted benchmarks** -- Current standards target ~18-40 year-olds. Future versions may include age brackets. +- [ ] **Expanded bodyweight scaling** -- Enhanced BW-relative benchmarks beyond the current reference weights. +- [ ] **Additional movements** -- Expanding the movement library within existing categories. ## License @@ -214,7 +230,7 @@ MIT License. See [LICENSE](LICENSE). "OpenProgression", the OpenProgression logo, and the 7-level progression gradient mark are trademarks of the OpenProgression project. The trademarks are **not** licensed under the MIT license. -- **The standard, data, and code are fully open** — use them freely in any project, commercial or not +- **The standard, data, and code are fully open** -- use them freely in any project, commercial or not - **The name and logo require permission** for use on merchandise, commercial products, or anything that implies official endorsement This is the same approach used by most major open source projects: the *work* is open, the *brand* is protected. diff --git a/data/milestones.json b/data/milestones.json new file mode 100644 index 0000000..3c9a642 --- /dev/null +++ b/data/milestones.json @@ -0,0 +1,154 @@ +{ + "version": "1.1.0", + "description": "Foundation Milestones are trackable micro-achievements within the Beginner level. They provide progress feedback for athletes who are below the OP Beginner benchmarks. Milestones are NOT levels -- they are pre-level markers that apps can use to show early progress. Estimated timelines assume a healthy but sedentary adult training 3x/week. For deconditioned, frail, or post-injury individuals, timelines may be 2-3x longer (ICFSR consensus: 3-5 months for meaningful functional improvement).", + "milestones": [ + { + "id": "F1", + "name": "Foundation", + "shortName": "F1", + "color": "#86EFAC", + "description": "Can perform basic human movements safely. Ready to start a bodyweight exercise program.", + "estimatedWeeks": "1-2", + "requirements": [ + { + "movement": "chair_sit_to_stand", + "name": "Chair Sit-to-Stand", + "category": "squatting", + "criteria": { "type": "reps", "target": 10 }, + "description": "Stand up from a standard-height chair 10 times without using hands" + }, + { + "movement": "wall_push_up", + "name": "Wall Push-up", + "category": "pressing", + "criteria": { "type": "reps", "target": 10 }, + "description": "10 push-ups against a wall with full range of motion" + }, + { + "movement": "glute_bridge", + "name": "Glute Bridge", + "category": "pulling", + "criteria": { "type": "reps", "target": 10 }, + "description": "10 glute bridges with full hip extension" + }, + { + "movement": "farmers_carry_30s", + "name": "Farmer's Carry", + "category": "gymnastics", + "criteria": { "type": "time", "target": 30, "unit": "seconds" }, + "description": "Carry two heavy bags or water bottles (approx. 5kg each) while walking for 30 seconds" + }, + { + "movement": "walk_1km", + "name": "Walk 1km", + "category": "monostructural", + "criteria": { "type": "completion" }, + "description": "Walk 1 kilometer without stopping" + } + ], + "sources": ["rikli_jones_2013", "jones_rikli_1999", "nsca_essentials_2016", "bohannon_2019", "who_physical_activity_2020", "chodzko_zajko_2009"] + }, + { + "id": "F2", + "name": "Moving", + "shortName": "F2", + "color": "#4ADE80", + "description": "Can perform bodyweight exercises with good form. Building functional capacity for daily activities and exercise.", + "estimatedWeeks": "2-4", + "requirements": [ + { + "movement": "air_squat_partial", + "name": "Air Squat (Partial Depth)", + "category": "squatting", + "criteria": { "type": "reps", "target": 20 }, + "description": "20 bodyweight squats to approximately parallel" + }, + { + "movement": "incline_push_up", + "name": "Incline Push-up", + "category": "pressing", + "criteria": { "type": "reps", "target": 10 }, + "description": "10 push-ups with hands on a bench-height surface" + }, + { + "movement": "hip_hinge_pvc", + "name": "Hip Hinge (Broomstick)", + "category": "pulling", + "criteria": { "type": "reps", "target": 10 }, + "description": "10 hip hinges with broomstick along spine maintaining 3 points of contact" + }, + { + "movement": "plank_30s", + "name": "Plank Hold", + "category": "bodyweight", + "criteria": { "type": "time", "target": 30, "unit": "seconds" }, + "description": "Hold a forearm plank for 30 seconds with neutral spine" + }, + { + "movement": "walk_run_intervals", + "name": "Walk/Run 800m", + "category": "monostructural", + "criteria": { "type": "completion", "details": "800m of walk/run combination" }, + "description": "Complete 800 meters of walking and running in any combination" + } + ], + "sources": ["nsca_essentials_2016", "mcgill_2015", "strand_2014", "acsm_guidelines", "fragala_2019"] + }, + { + "id": "F3", + "name": "Ready", + "shortName": "F3", + "color": "#22C55E", + "description": "Movement quality and base fitness sufficient for structured training with equipment. Ready for gym onboarding and barbell introduction.", + "estimatedWeeks": "4-8", + "requirements": [ + { + "movement": "air_squat", + "name": "Air Squat (Full Depth)", + "category": "squatting", + "criteria": { "type": "reps", "target": 20 }, + "description": "20 bodyweight squats below parallel with good form" + }, + { + "movement": "push_up_single", + "name": "Full Push-up", + "category": "pressing", + "criteria": { "type": "reps", "target": 1 }, + "description": "1 full push-up with chest to floor and full lockout" + }, + { + "movement": "rdl_bodyweight", + "name": "Romanian Deadlift (Bodyweight)", + "category": "pulling", + "criteria": { "type": "reps", "target": 10 }, + "description": "10 bodyweight Romanian deadlifts with neutral spine" + }, + { + "movement": "dead_hang_or_carry", + "name": "Dead Hang OR Farmer's Carry", + "category": "gymnastics", + "criteria": { "type": "either", "options": [ + { "movement": "dead_hang_30s", "type": "time", "target": 30, "unit": "seconds" }, + { "movement": "farmers_carry_60s", "type": "time", "target": 60, "unit": "seconds" } + ]}, + "description": "Hang from a bar for 30 seconds, OR carry two heavy bags (approx. 8kg each) for 60 seconds" + }, + { + "movement": "run_mile_any_pace", + "name": "Run 1 Mile", + "category": "monostructural", + "criteria": { "type": "completion" }, + "description": "Run 1 mile (1609m) without walking breaks, at any pace" + }, + { + "movement": "plank_60s", + "name": "Plank Hold (60 Seconds)", + "category": "bodyweight", + "criteria": { "type": "time", "target": 60, "unit": "seconds" }, + "description": "Hold a forearm plank for 60 seconds with neutral spine" + } + ], + "sources": ["nsca_essentials_2016", "mcgill_2015", "strand_2014", "acsm_guidelines", "bohannon_2019", "runninglevel", "fragala_2019"] + } + ] +} diff --git a/data/progressions.json b/data/progressions.json new file mode 100644 index 0000000..6ecd171 --- /dev/null +++ b/data/progressions.json @@ -0,0 +1,576 @@ +{ + "version": "1.1.0", + "description": "Movement progression chains leading to OP benchmark movements. Each chain defines a sequence of prerequisite movements (regressions) from foundational patterns through to the benchmark entry point.", + "progressions": [ + { + "targetMovement": "back_squat", + "targetCategory": "squatting", + "description": "Squat pattern progression from assisted sit-to-stand through barbell loading", + "steps": [ + { + "step": 1, + "movement": "chair_sit_to_stand_high", + "name": "Chair Sit-to-Stand (High Surface)", + "description": "Stand up from a knee-height surface (bed, high chair) without using hands. Establishes basic squat-to-stand pattern.", + "equipment": "chair", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["rikli_jones_2013"] + }, + { + "step": 2, + "movement": "chair_sit_to_stand", + "name": "Chair Sit-to-Stand (Standard)", + "description": "Stand up from a standard-height chair (approx. 43cm / 17in seat) without using hands. This is the 30-second chair stand test position used in clinical fitness assessment.", + "equipment": "chair", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["rikli_jones_2013"] + }, + { + "step": 3, + "movement": "box_squat", + "name": "Box Squat (Squat-to-Chair Touch)", + "description": "Squat down until glutes lightly touch a chair or box, then stand back up. The surface provides a safety net and depth target. Standard PT progression between sit-to-stand and free squat.", + "equipment": "chair", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016", "fragala_2019"] + }, + { + "step": 4, + "movement": "air_squat_partial", + "name": "Air Squat (Partial Depth)", + "description": "Bodyweight squat to approximately parallel (thighs parallel to floor). No external support or surface.", + "equipment": "none", + "criteria": { "type": "reps", "target": 20 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 5, + "movement": "air_squat", + "name": "Air Squat (Below Parallel)", + "description": "Bodyweight squat below parallel with good form: heels down, knees tracking toes, neutral spine, hip crease below knee.", + "equipment": "none", + "criteria": { "type": "reps", "target": 20 }, + "milestone": "F3", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 6, + "movement": "goblet_squat", + "name": "Goblet Squat", + "description": "Squat below parallel holding a kettlebell or dumbbell at chest height. Introduces external loading while reinforcing upright torso.", + "equipment": "free_weight", + "criteria": { "type": "reps", "target": 10, "load": { "male": 12, "female": 8 }, "unit": "kg" }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 7, + "movement": "barbell_back_squat_empty", + "name": "Barbell Back Squat (Empty Bar)", + "description": "Back squat with empty barbell (20kg). Establishes bar positioning, rack position, and squat pattern under barbell.", + "equipment": "barbell", + "criteria": { "type": "reps", "target": 10 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + } + ] + }, + { + "targetMovement": "deadlift", + "targetCategory": "pulling", + "description": "Hip hinge progression from floor-based glute activation through barbell deadlift pattern", + "steps": [ + { + "step": 1, + "movement": "glute_bridge", + "name": "Glute Bridge", + "description": "Lying on back, feet flat on floor, drive hips to full extension. Foundational hip extension pattern used in lower back and post-pregnancy rehab.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 2, + "movement": "hip_hinge_pvc", + "name": "Hip Hinge (PVC/Broomstick)", + "description": "Standing hip hinge with a PVC pipe or broomstick along the spine (contact at head, upper back, sacrum). Teaches neutral spine and hip-dominant movement.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 3, + "movement": "rdl_bodyweight", + "name": "Romanian Deadlift (Bodyweight)", + "description": "Standing hip hinge with arms extended, lowering hands toward shins. No external load. Establishes the RDL pattern and hamstring flexibility.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F3", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 4, + "movement": "kettlebell_deadlift", + "name": "Kettlebell Deadlift", + "description": "Deadlift a kettlebell or dumbbell from the floor using hip hinge pattern. Introduces loading from floor height.", + "equipment": "free_weight", + "criteria": { "type": "reps", "target": 10, "load": { "male": 16, "female": 12 }, "unit": "kg" }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 5, + "movement": "barbell_deadlift_empty", + "name": "Barbell Deadlift (Empty Bar)", + "description": "Conventional deadlift with empty barbell from floor (or elevated if mobility limited). Establishes barbell deadlift positioning.", + "equipment": "barbell", + "criteria": { "type": "reps", "target": 5 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + } + ] + }, + { + "targetMovement": "strict_press", + "targetCategory": "pressing", + "description": "Vertical pressing progression from push-up variations through barbell overhead press", + "steps": [ + { + "step": 1, + "movement": "wall_push_up", + "name": "Wall Push-up", + "description": "Push-up performed against a wall at arm's length. Minimal load on upper body. Accessible to nearly everyone including shoulder rehab patients.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["nsca_essentials_2016", "acsm_guidelines"] + }, + { + "step": 2, + "movement": "incline_push_up", + "name": "Incline Push-up (Bench Height)", + "description": "Push-up with hands on a bench, counter, or sturdy elevated surface (approx. 40-60cm). Increases load compared to wall push-up.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 3, + "movement": "knee_push_up", + "name": "Knee Push-up", + "description": "Push-up from knees with full range of motion (chest to floor, full lockout). Approximately 50-60% bodyweight load.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016", "acsm_guidelines"] + }, + { + "step": 4, + "movement": "push_up_single", + "name": "Full Push-up", + "description": "Standard push-up: chest to floor, full lockout, body in plank position. One complete rep with good form.", + "equipment": "none", + "criteria": { "type": "reps", "target": 1 }, + "milestone": "F3", + "sources": ["acsm_guidelines", "military_pft"] + }, + { + "step": 5, + "movement": "db_press", + "name": "Dumbbell Shoulder Press", + "description": "Seated or standing dumbbell overhead press. Introduces vertical pressing pattern with external load.", + "equipment": "free_weight", + "criteria": { "type": "reps", "target": 10, "load": { "male": 8, "female": 5 }, "unit": "kg" }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 6, + "movement": "barbell_press_empty", + "name": "Barbell Strict Press (Empty Bar)", + "description": "Standing barbell strict press with empty bar (20kg). Establishes barbell overhead pressing pattern.", + "equipment": "barbell", + "criteria": { "type": "reps", "target": 5 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + } + ] + }, + { + "targetMovement": "push_up", + "targetCategory": "bodyweight", + "description": "Push-up progression from wall to floor. Shares early steps with pressing progression.", + "sharedSteps": "strict_press", + "sharedUpTo": 4, + "steps": [ + { + "step": 1, + "movement": "wall_push_up", + "name": "Wall Push-up", + "description": "Push-up performed against a wall at arm's length.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["nsca_essentials_2016", "acsm_guidelines"] + }, + { + "step": 2, + "movement": "incline_push_up", + "name": "Incline Push-up (Bench Height)", + "description": "Push-up with hands on a bench or sturdy elevated surface.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 3, + "movement": "knee_push_up", + "name": "Knee Push-up", + "description": "Push-up from knees with full range of motion.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016", "acsm_guidelines"] + }, + { + "step": 4, + "movement": "push_up_single", + "name": "Full Push-up (1 Rep)", + "description": "One complete push-up with good form: chest to floor, full lockout, body in plank position.", + "equipment": "none", + "criteria": { "type": "reps", "target": 1 }, + "milestone": "F3", + "sources": ["acsm_guidelines", "military_pft"] + } + ] + }, + { + "targetMovement": "strict_pull_up", + "targetCategory": "gymnastics", + "description": "Pull-up progression from grip strengthening and horizontal pulling through hanging variations to first strict pull-up. Early steps require no pull-up bar.", + "steps": [ + { + "step": 1, + "movement": "farmers_carry_30s", + "name": "Farmer's Carry (30 Seconds)", + "description": "Carry two heavy bags, water bottles, or dumbbells (approx. 5kg each) while walking for 30 seconds. Develops grip endurance and postural stability. No pull-up bar required.", + "equipment": "none", + "criteria": { "type": "time", "target": 30, "unit": "seconds" }, + "milestone": "F1", + "sources": ["bohannon_2019", "nsca_essentials_2016"] + }, + { + "step": 2, + "movement": "band_pull_apart", + "name": "Band Pull-apart", + "description": "Standing, hold a resistance band at chest height with straight arms. Pull band apart by squeezing shoulder blades together. Develops scapular retraction and upper back posture.", + "equipment": "resistance_band", + "criteria": { "type": "reps", "target": 15 }, + "milestone": "F1", + "sources": ["nsca_essentials_2016", "fragala_2019"] + }, + { + "step": 3, + "movement": "seated_band_row", + "name": "Seated Band Row", + "description": "Seated on floor with legs extended, resistance band looped around feet. Pull band to ribcage, squeezing shoulder blades. Standard home-based horizontal pulling exercise for older adults.", + "equipment": "resistance_band", + "criteria": { "type": "reps", "target": 15 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016", "fragala_2019"] + }, + { + "step": 4, + "movement": "dead_hang_10s", + "name": "Dead Hang (10 Seconds)", + "description": "Passive hang from pull-up bar with straight arms, shoulders engaged. Builds grip strength and shoulder stability. First step requiring a pull-up bar.", + "equipment": "pull_up_bar", + "criteria": { "type": "time", "target": 10, "unit": "seconds" }, + "milestone": "F2", + "sources": ["bohannon_2019", "nsca_essentials_2016"] + }, + { + "step": 5, + "movement": "dead_hang_30s", + "name": "Dead Hang (30 Seconds)", + "description": "Extended passive hang. Indicates sufficient grip strength and shoulder tolerance for pulling progressions.", + "equipment": "pull_up_bar", + "criteria": { "type": "time", "target": 30, "unit": "seconds" }, + "milestone": "F3", + "sources": ["bohannon_2019"] + }, + { + "step": 6, + "movement": "scapular_pull_up", + "name": "Scapular Pull-up (Active Hang)", + "description": "From dead hang, depress and retract scapulae to create slight upward movement without bending arms. Activates the lats and establishes mind-muscle connection.", + "equipment": "pull_up_bar", + "criteria": { "type": "reps", "target": 10 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 7, + "movement": "eccentric_pull_up", + "name": "Eccentric Pull-up (Slow Negative)", + "description": "Jump or step to chin-over-bar position, then lower slowly (3-5 seconds) to dead hang. Builds pulling strength eccentrically.", + "equipment": "pull_up_bar", + "criteria": { "type": "reps", "target": 5 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 8, + "movement": "band_assisted_pull_up", + "name": "Band-Assisted Pull-up", + "description": "Strict pull-up with feet or knees in a resistance band looped over the bar. Reduces effective bodyweight.", + "equipment": "resistance_band", + "criteria": { "type": "reps", "target": 5 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + } + ] + }, + { + "targetMovement": "toes_to_bar", + "targetCategory": "gymnastics", + "description": "Core progression using McGill Big 3 anti-movement exercises, then plank endurance, then hanging core work leading to toes-to-bar", + "steps": [ + { + "step": 1, + "movement": "mcgill_curl_up", + "name": "McGill Curl-up", + "description": "Lying on back, one knee bent, hands under lumbar spine. Lift head and shoulders slightly off floor without flexing the lower back. Trains anti-extension. Part of the McGill Big 3 for spine health.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["mcgill_2015", "nsca_essentials_2016"] + }, + { + "step": 2, + "movement": "bird_dog", + "name": "Bird Dog", + "description": "From hands and knees, extend opposite arm and leg while maintaining neutral spine. Trains anti-rotation and spinal stability. Part of the McGill Big 3.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10, "notes": "5 per side" }, + "milestone": "F1", + "sources": ["mcgill_2015", "nsca_essentials_2016"] + }, + { + "step": 3, + "movement": "side_plank_knees", + "name": "Side Plank (From Knees)", + "description": "Side-lying, prop up on forearm with knees bent. Hold hips off floor. Regressed side plank for anti-lateral-flexion. Part of the McGill Big 3.", + "equipment": "none", + "criteria": { "type": "time", "target": 15, "unit": "seconds", "notes": "each side" }, + "milestone": "F1", + "sources": ["mcgill_2015", "strand_2014"] + }, + { + "step": 4, + "movement": "plank_30s", + "name": "Forearm Plank (30 Seconds)", + "description": "Forearm plank with neutral spine from toes. 30 seconds indicates adequate baseline core endurance for healthy adults.", + "equipment": "none", + "criteria": { "type": "time", "target": 30, "unit": "seconds" }, + "milestone": "F2", + "sources": ["mcgill_2015", "strand_2014"] + }, + { + "step": 5, + "movement": "side_plank_full", + "name": "Side Plank (Full, From Feet)", + "description": "Side-lying, prop up on forearm with legs straight, stacked. Hold hips off floor. Full side plank for lateral core endurance.", + "equipment": "none", + "criteria": { "type": "time", "target": 20, "unit": "seconds", "notes": "each side" }, + "milestone": "F2", + "sources": ["mcgill_2015", "strand_2014"] + }, + { + "step": 6, + "movement": "plank_60s", + "name": "Forearm Plank (60 Seconds)", + "description": "60-second forearm plank. Indicates strong core endurance sufficient for structured training.", + "equipment": "none", + "criteria": { "type": "time", "target": 60, "unit": "seconds" }, + "milestone": "F3", + "sources": ["mcgill_2015", "strand_2014"] + }, + { + "step": 7, + "movement": "hollow_hold_10s", + "name": "Hollow Body Hold (10 Seconds)", + "description": "Lying supine, arms overhead, legs extended, lower back pressed to floor. Gymnastic foundation position for all hanging core work.", + "equipment": "none", + "criteria": { "type": "time", "target": 10, "unit": "seconds" }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 8, + "movement": "hanging_knee_raise", + "name": "Hanging Knee Raise", + "description": "From dead hang, raise knees to hip height (90 degrees). Combines grip endurance with hip flexion under load.", + "equipment": "pull_up_bar", + "criteria": { "type": "reps", "target": 10 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 9, + "movement": "hanging_leg_raise", + "name": "Hanging Straight Leg Raise", + "description": "From dead hang, raise straight legs to 90 degrees (L-sit position). Requires hamstring flexibility and core strength.", + "equipment": "pull_up_bar", + "criteria": { "type": "reps", "target": 5 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + } + ] + }, + { + "targetMovement": "run_mile", + "targetCategory": "monostructural", + "description": "Running progression from short walks through walk/run intervals to continuous running. More gradual than Couch to 5K, which has high dropout rates partly due to large progression jumps.", + "steps": [ + { + "step": 1, + "movement": "walk_10min", + "name": "Walk 10 Minutes Continuously", + "description": "Walk at any pace for 10 minutes without sitting down. The absolute starting point for sedentary adults. WHO and ACSM recommend replacing sedentary time with any activity as a first step.", + "equipment": "none", + "criteria": { "type": "completion" }, + "milestone": "F1", + "sources": ["who_physical_activity_2020", "chodzko_zajko_2009"] + }, + { + "step": 2, + "movement": "walk_1km", + "name": "Walk 1km Without Stopping", + "description": "Continuous walking for 1 kilometer at any pace (approximately 10-15 minutes). Baseline cardiovascular and musculoskeletal capacity.", + "equipment": "none", + "criteria": { "type": "completion" }, + "milestone": "F1", + "sources": ["who_physical_activity_2020"] + }, + { + "step": 3, + "movement": "walk_run_intervals", + "name": "Walk/Run Intervals", + "description": "Alternating 1 minute running with 2 minutes walking, repeated 8 times (24 minutes total). More gradual than Couch to 5K Week 1. Standard return-to-running protocol.", + "equipment": "none", + "criteria": { "type": "completion", "details": "8 rounds of 1 min run / 2 min walk" }, + "milestone": "F2", + "sources": ["acsm_guidelines", "who_physical_activity_2020"] + }, + { + "step": 4, + "movement": "run_400m", + "name": "Run 400m Without Stopping", + "description": "Continuous running for 400 meters (one standard track lap) at any pace.", + "equipment": "none", + "criteria": { "type": "completion" }, + "milestone": "F2", + "sources": ["acsm_guidelines"] + }, + { + "step": 5, + "movement": "run_800m", + "name": "Run 800m Without Stopping", + "description": "Continuous running for 800 meters at any pace. A meaningful aerobic milestone for previously sedentary adults.", + "equipment": "none", + "criteria": { "type": "completion" }, + "milestone": "F3", + "sources": ["acsm_guidelines"] + }, + { + "step": 6, + "movement": "run_mile_any_pace", + "name": "Run 1 Mile (Any Pace)", + "description": "Continuous running for 1 mile (1609m) without walking breaks. At this point the athlete is ready for the timed OP benchmark.", + "equipment": "none", + "criteria": { "type": "completion" }, + "milestone": "F3", + "sources": ["acsm_guidelines", "runninglevel"] + } + ] + }, + { + "targetMovement": "bench_press", + "targetCategory": "pressing", + "description": "Horizontal pressing progression. Shares push-up chain with strict_press progression, then diverges to barbell bench.", + "sharedSteps": "strict_press", + "sharedUpTo": 4, + "steps": [ + { + "step": 1, + "movement": "wall_push_up", + "name": "Wall Push-up", + "description": "Push-up performed against a wall at arm's length.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F1", + "sources": ["nsca_essentials_2016", "acsm_guidelines"] + }, + { + "step": 2, + "movement": "incline_push_up", + "name": "Incline Push-up (Bench Height)", + "description": "Push-up with hands on a bench or sturdy elevated surface.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016"] + }, + { + "step": 3, + "movement": "knee_push_up", + "name": "Knee Push-up", + "description": "Push-up from knees with full range of motion.", + "equipment": "none", + "criteria": { "type": "reps", "target": 10 }, + "milestone": "F2", + "sources": ["nsca_essentials_2016", "acsm_guidelines"] + }, + { + "step": 4, + "movement": "push_up_single", + "name": "Full Push-up (1 Rep)", + "description": "One complete push-up with good form.", + "equipment": "none", + "criteria": { "type": "reps", "target": 1 }, + "milestone": "F3", + "sources": ["acsm_guidelines", "military_pft"] + }, + { + "step": 5, + "movement": "db_bench_press", + "name": "Dumbbell Bench Press", + "description": "Lying on bench, press dumbbells from chest to lockout. Introduces horizontal pressing with external load.", + "equipment": "free_weight", + "criteria": { "type": "reps", "target": 10, "load": { "male": 10, "female": 6 }, "unit": "kg" }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + }, + { + "step": 6, + "movement": "barbell_bench_empty", + "name": "Barbell Bench Press (Empty Bar)", + "description": "Flat bench press with empty barbell (20kg). Establishes bar path, grip width, and pressing mechanics.", + "equipment": "barbell", + "criteria": { "type": "reps", "target": 10 }, + "milestone": null, + "sources": ["nsca_essentials_2016"] + } + ] + } + ] +} diff --git a/data/sources.json b/data/sources.json index 9f14ec4..0abb672 100644 --- a/data/sources.json +++ b/data/sources.json @@ -85,6 +85,65 @@ "citation": "CrossFit Liftoff percentile data (2015). CrossFit Games.", "url": "https://games.crossfit.com/article/liftoff-data", "type": "official_data" + }, + { + "id": "rikli_jones_2013", + "citation": "Rikli, R.E. & Jones, C.J. (2013). Senior Fitness Test Manual. 2nd Ed. Human Kinetics.", + "url": "https://doi.org/10.1123/9781450460361", + "type": "professional_standard", + "notes": "Defines the 30-second chair stand test. Used globally in clinical and rehab settings for functional fitness assessment in older adults and deconditioned populations." + }, + { + "id": "nsca_essentials_2016", + "citation": "Haff, G.G. & Triplett, N.T. (Eds.) (2016). Essentials of Strength Training and Conditioning. 4th Ed. National Strength and Conditioning Association. Human Kinetics.", + "type": "professional_standard", + "notes": "Standard reference for exercise progression and regression principles, push-up progressions, and foundational movement patterns." + }, + { + "id": "who_physical_activity_2020", + "citation": "World Health Organization (2020). WHO Guidelines on Physical Activity and Sedentary Behaviour. Geneva: WHO.", + "url": "https://www.who.int/publications/i/item/9789240015128", + "type": "government_standard", + "notes": "Sets global minimum physical activity recommendations. Relevant for walk/run progression baseline thresholds." + }, + { + "id": "mcgill_2015", + "citation": "McGill, S.M., Belore, M., Crosby, I., & Russell, C. (2015). Clinical tools to quantify torso flexion endurance: normative data from student and firefighter populations. Occupational Ergonomics, 12(2), 59-66.", + "type": "peer_reviewed", + "notes": "Provides normative plank hold durations for healthy populations. Used to set Foundation Milestone core endurance criteria." + }, + { + "id": "bohannon_2019", + "citation": "Bohannon, R.W. (2019). Grip Strength: An Indispensable Biomarker For Older Adults. Clinical Interventions in Aging, 14, 1681-1691.", + "url": "https://doi.org/10.2147/CIA.S194543", + "type": "peer_reviewed", + "notes": "Establishes grip strength and hanging capacity as functional health markers. Supports dead hang and farmer's carry as foundation assessments." + }, + { + "id": "chodzko_zajko_2009", + "citation": "Chodzko-Zajko, W.J. et al. (2009). Exercise and Physical Activity for Older Adults. ACSM Position Stand. Medicine & Science in Sports & Exercise, 41(7), 1510-1530.", + "type": "peer_reviewed", + "notes": "Foundational clinical guidelines for exercise prescription in older adults. Recommends low initial intensity with gradual progression." + }, + { + "id": "fragala_2019", + "citation": "Fragala, M.S. et al. (2019). Resistance Training for Older Adults: Position Statement From the National Strength and Conditioning Association. Journal of Strength and Conditioning Research, 33(8).", + "type": "peer_reviewed", + "notes": "NSCA position statement on resistance training for older adults. Recommends starting with 1 set of 8-10 exercises at low intensity, progressing no more than once every 4 weeks." + }, + { + "id": "jones_rikli_1999", + "citation": "Jones, C.J., Rikli, R.E., & Beam, W.C. (1999). A 30-s Chair-Stand Test as a Measure of Lower Body Strength in Community-Residing Older Adults. Research Quarterly for Exercise and Sport, 70(2), 113-119.", + "url": "https://pubmed.ncbi.nlm.nih.gov/10380242/", + "type": "peer_reviewed", + "notes": "Validation study for the 30-second chair stand test. Test-retest reliability r=0.89. Normative data for ages 60-94 across 7,183 participants." + }, + { + "id": "strand_2014", + "citation": "Strand, S.L., Hjelm, J., Shoepe, T.C., & Fajardo, M.A. (2014). Norms for an Isometric Muscle Endurance Test. Journal of Human Kinetics, 40, 93-102.", + "type": "peer_reviewed", + "sampleSize": 471, + "notes": "Normative plank hold and core endurance data for healthy adults. Provides percentile rankings for isometric endurance tests." } ] } diff --git a/scripts/validate-data.mjs b/scripts/validate-data.mjs index 9f51226..9efa779 100644 --- a/scripts/validate-data.mjs +++ b/scripts/validate-data.mjs @@ -17,6 +17,7 @@ const CATEGORIES = [ let errors = 0 let checks = 0 +let sourceIds = new Set() function assert(condition, message) { checks++ @@ -73,7 +74,7 @@ if (sources) { assert(sources.version === "1.0.0", "sources.json version should be 1.0.0") assert(Array.isArray(sources.sources), "sources.sources should be an array") assert(sources.sources.length > 0, "sources.sources should not be empty") - const sourceIds = new Set(sources.sources.map((s) => s.id)) + sourceIds = new Set(sources.sources.map((s) => s.id)) for (const s of sources.sources) { assert(typeof s.id === "string", "Source missing id") assert(typeof s.citation === "string", `Source ${s.id} missing citation`) @@ -136,6 +137,105 @@ if (sources) { } } +// === Validate progressions.json === +console.log("Validating progressions.json...") +const progressions = loadJSON(join(dataDir, "progressions.json")) +if (progressions) { + assert(progressions.version === "1.1.0", "progressions.json version should be 1.1.0") + assert(Array.isArray(progressions.progressions), "progressions.progressions should be an array") + assert(progressions.progressions.length > 0, "progressions.progressions should not be empty") + + for (const prog of progressions.progressions) { + assert(typeof prog.targetMovement === "string", "Progression missing targetMovement") + assert(typeof prog.targetCategory === "string", `Progression ${prog.targetMovement} missing targetCategory`) + assert(CATEGORIES.includes(prog.targetCategory), `Progression ${prog.targetMovement} has unknown category: ${prog.targetCategory}`) + assert(Array.isArray(prog.steps), `Progression ${prog.targetMovement} missing steps array`) + assert(prog.steps.length > 0, `Progression ${prog.targetMovement} has no steps`) + + for (const step of prog.steps) { + assert(typeof step.step === "number", `Progression ${prog.targetMovement}: step missing step number`) + assert(typeof step.movement === "string", `Progression ${prog.targetMovement}: step ${step.step} missing movement id`) + assert(typeof step.name === "string", `Progression ${prog.targetMovement}: step ${step.step} missing name`) + assert(typeof step.equipment === "string", `Progression ${prog.targetMovement}: ${step.movement} missing equipment`) + assert(typeof step.criteria === "object", `Progression ${prog.targetMovement}: ${step.movement} missing criteria`) + + // Validate sources reference known source IDs + if (step.sources) { + for (const srcId of step.sources) { + assert(sourceIds.has(srcId), `Progression ${prog.targetMovement}: ${step.movement} references unknown source "${srcId}"`) + } + } + + // Validate milestone is null or a known milestone ID + if (step.milestone !== null && step.milestone !== undefined) { + assert( + ["F1", "F2", "F3"].includes(step.milestone), + `Progression ${prog.targetMovement}: ${step.movement} has unknown milestone "${step.milestone}"` + ) + } + } + + // Validate steps are in order + const stepNumbers = prog.steps.map((s) => s.step) + const isOrdered = stepNumbers.every((n, i) => i === 0 || n > stepNumbers[i - 1]) + assert(isOrdered, `Progression ${prog.targetMovement}: steps are not in ascending order`) + } +} + +// === Validate milestones.json === +console.log("Validating milestones.json...") +const milestones = loadJSON(join(dataDir, "milestones.json")) +if (milestones) { + assert(milestones.version === "1.1.0", "milestones.json version should be 1.1.0") + assert(Array.isArray(milestones.milestones), "milestones.milestones should be an array") + assert(milestones.milestones.length === 3, `Expected 3 milestones, got ${milestones.milestones.length}`) + + const expectedIds = ["F1", "F2", "F3"] + for (const ms of milestones.milestones) { + assert(expectedIds.includes(ms.id), `Unknown milestone id: ${ms.id}`) + assert(typeof ms.name === "string", `Milestone ${ms.id} missing name`) + assert(typeof ms.shortName === "string", `Milestone ${ms.id} missing shortName`) + assert(typeof ms.color === "string", `Milestone ${ms.id} missing color`) + assert(typeof ms.description === "string", `Milestone ${ms.id} missing description`) + assert(Array.isArray(ms.requirements), `Milestone ${ms.id} missing requirements array`) + assert(ms.requirements.length > 0, `Milestone ${ms.id} has no requirements`) + + for (const req of ms.requirements) { + assert(typeof req.movement === "string", `Milestone ${ms.id}: requirement missing movement id`) + assert(typeof req.name === "string", `Milestone ${ms.id}: ${req.movement} missing name`) + assert(typeof req.category === "string", `Milestone ${ms.id}: ${req.movement} missing category`) + assert(CATEGORIES.includes(req.category), `Milestone ${ms.id}: ${req.movement} has unknown category "${req.category}"`) + assert(typeof req.criteria === "object", `Milestone ${ms.id}: ${req.movement} missing criteria`) + + // Validate "either" criteria type + if (req.criteria && req.criteria.type === "either") { + assert( + Array.isArray(req.criteria.options), + `Milestone ${ms.id}: ${req.movement} "either" criteria missing options array` + ) + if (Array.isArray(req.criteria.options)) { + assert( + req.criteria.options.length >= 2, + `Milestone ${ms.id}: ${req.movement} "either" criteria should have at least 2 options` + ) + for (const opt of req.criteria.options) { + assert(typeof opt.movement === "string", `Milestone ${ms.id}: ${req.movement} "either" option missing movement`) + assert(typeof opt.type === "string", `Milestone ${ms.id}: ${req.movement} "either" option missing type`) + assert(opt.target !== undefined, `Milestone ${ms.id}: ${req.movement} "either" option missing target`) + } + } + } + } + + // Validate sources reference known source IDs + if (ms.sources) { + for (const srcId of ms.sources) { + assert(sourceIds.has(srcId), `Milestone ${ms.id} references unknown source "${srcId}"`) + } + } + } +} + // === Summary === console.log("") if (errors > 0) { diff --git a/spec/levels.md b/spec/levels.md index 190f0c3..c175cf8 100644 --- a/spec/levels.md +++ b/spec/levels.md @@ -7,9 +7,9 @@ OpenProgression uses a 7-level system to classify athletic ability. Each level represents a percentile range within the trained population, based on peer-reviewed normative data. The system is designed to be: -- **Clear** — Level names are descriptive and intuitive -- **Progressive** — Each level requires meaningful improvement over the previous -- **Universal** — Applicable across all functional fitness categories +- **Clear** -- Level names are descriptive and intuitive +- **Progressive** -- Each level requires meaningful improvement over the previous +- **Universal** -- Applicable across all functional fitness categories ## Level Definitions @@ -115,16 +115,36 @@ Elite-level performance across all fitness domains. Top 5% of the trained popula - Can compete in high-level fitness competitions - Exceptional work capacity across all time domains +## Foundation Milestones (Pre-Beginner) + +For athletes who are below the Beginner benchmarks -- people new to exercise, returning from injury, or rebuilding after a long break -- **Foundation Milestones** provide trackable progress markers within the Beginner level. + +| Milestone | Name | What It Means | Estimated Time | +|:---------:|------|---------------|:--------------:| +| F1 | **Foundation** | Can perform basic human movements safely | 1-2 weeks | +| F2 | **Moving** | Can perform bodyweight exercises with good form | 2-4 weeks | +| F3 | **Ready** | Ready for structured training with equipment | 4-8 weeks | + +``` +Untrained → F1 → F2 → F3 → Beginner → Beginner+ → ... → Rx + │ + └── OP v1.0 benchmarks start here +``` + +Foundation Milestones are **not levels**. They are optional pre-level markers that applications can display to provide early progress feedback. They follow the same weakest-link principle: all requirements for a milestone must be met across multiple categories. F1 requires only a chair and household items -- no gym or pull-up bar needed. Estimated timelines assume healthy but sedentary adults; deconditioned or frail individuals may need 2-3x longer. + +Full specification: [`spec/progressions.md`](progressions.md) | Data: [`data/milestones.json`](../data/milestones.json) + ## The Weakest-Link Principle An athlete's **overall OP level** equals their **lowest category level**. If an athlete tests at Advanced in 7 of 8 categories but Intermediate in one, their overall level is **Intermediate**. This design choice is intentional: -1. **Encourages well-rounded fitness** — Athletes cannot hide behind their strengths -2. **Identifies training priorities** — The lowest category is the obvious focus -3. **Reflects real-world performance** — In varied fitness testing, the weakest domain limits overall capability -4. **Motivates progression** — Bringing up a weakness immediately raises overall level +1. **Encourages well-rounded fitness** -- Athletes cannot hide behind their strengths +2. **Identifies training priorities** -- The lowest category is the obvious focus +3. **Reflects real-world performance** -- In varied fitness testing, the weakest domain limits overall capability +4. **Motivates progression** -- Bringing up a weakness immediately raises overall level ## Level Progression diff --git a/spec/progressions.md b/spec/progressions.md new file mode 100644 index 0000000..4e7e6e4 --- /dev/null +++ b/spec/progressions.md @@ -0,0 +1,368 @@ +# Movement Progressions & Foundation Milestones + +**Version:** 1.1.0 + +## Overview + +OpenProgression v1.0 defines benchmarks for the **trained population** -- athletes who can already perform fundamental barbell movements and bodyweight exercises. Movement Progressions and Foundation Milestones extend the standard downward to serve the **untrained and deconditioned population**: people who have never trained, are returning from injury, or are rebuilding after a long break. + +This extension is **purely additive**. The 7-level system, benchmark values, percentile mapping, and weakest-link principle are all unchanged. + +## Problem Statement + +Level 1 (Beginner, 0-20th percentile) covers a massive range of ability: + +- A sedentary adult who has never exercised: 0 push-ups, cannot squat to depth, no barbell experience +- An athlete at the top of Beginner: 10 push-ups, 40kg back squat, 60kg deadlift + +These two people are months apart in ability, but the standard gives them the same label. For someone starting from zero, the first level-up (Beginner to Beginner+) may take 6-12 months -- a long time without measurable progress. + +## Movement Progressions + +### Concept + +Every OP benchmark movement has an implicit chain of prerequisite movements (regressions). A back squat requires the ability to air squat, which requires the ability to sit-to-stand from a chair. Currently OP only tracks the benchmark movement itself. Progressions formalize the regression chain. + +These are not new exercises -- they are the same progressions used in coaching, physiotherapy, and clinical rehabilitation, now formalized into the OP data model. + +### Design Principles + +1. **Home-first** -- Early steps in every chain require no gym equipment. A chair, a wall, a floor, and a resistance band cover F1 and F2 entirely. +2. **No pull-up bar required until F2+** -- Dead hangs are valuable but require equipment not available in every home. Farmer's carry and band exercises provide grip and pulling work without a bar. +3. **Research-grounded** -- Every step cites published exercise science or clinical literature. +4. **Gradual steps** -- Smaller jumps than programs like Couch to 5K, which has high dropout rates partly due to large progression jumps. + +### Compatibility with Existing Scaling + +The metcon scaling system (`spec/programming.md`) already defines substitution chains for workout scaling: + +``` +Ring Muscle-up → Bar Muscle-up → C2B → Pull-up → Jumping Pull-up → Ring Row +``` + +Movement progressions extend this same concept **below** the Beginner scaling level, into foundational patterns that require little or no equipment. + +### Progression Structure + +Each progression chain targets a specific OP benchmark movement and consists of ordered steps: + +``` +data/progressions.json → progressions[].steps[] +``` + +Each step includes: +- **movement** -- Unique identifier (snake_case) +- **name** -- Human-readable name +- **description** -- What the movement is and how to perform it +- **equipment** -- What's needed (see Equipment Tags below) +- **criteria** -- Pass condition (reps, time, completion, or either) +- **milestone** -- Which Foundation Milestone this step contributes to (if any) +- **sources** -- Research citations supporting the movement and criteria + +### Criteria Types + +| Type | Fields | Example | +|------|--------|---------| +| `reps` | `target`, optional `load`/`unit` | `{ "type": "reps", "target": 10 }` | +| `time` | `target`, `unit` | `{ "type": "time", "target": 30, "unit": "seconds" }` | +| `completion` | optional `details` | `{ "type": "completion" }` | +| `either` | `options[]` | Pass if **any one** option is met | + +The `either` type allows alternative pass criteria -- useful when a milestone can be achieved via different movements (e.g., dead hang OR farmer's carry). Each option in the `options` array has `movement`, `type`, and `target`: + +```json +{ + "type": "either", + "options": [ + { "movement": "dead_hang_30s", "type": "time", "target": 30, "unit": "seconds" }, + { "movement": "farmers_carry_60s", "type": "time", "target": 60, "unit": "seconds" } + ] +} +``` + +### Progression Chains + +#### Squatting → Back Squat + +``` +Chair Sit-to-Stand (High) → Chair Sit-to-Stand (Standard) → Box Squat (to chair) + [F1] [F1] [F2] + +→ Air Squat (Partial) → Air Squat (Full Depth) → Goblet Squat → BB Back Squat + [F2] [F3] → OP Beginner +``` + +The chair sit-to-stand is the clinical standard for lower body functional fitness assessment (Rikli & Jones, 2013; validated by Jones, Rikli & Beam, 1999 with test-retest reliability r=0.89 across 7,183 participants aged 60-94). The box squat provides a safety net and depth target as a bridge between assisted and free squatting -- a standard PT progression step (NSCA, 2016; Fragala et al., 2019). + +#### Pulling → Deadlift + +``` +Glute Bridge → Hip Hinge (PVC) → RDL (Bodyweight) → KB Deadlift → Barbell DL + [F1] [F2] [F3] → OP Beginner +``` + +The glute bridge is a standard physiotherapy exercise for lower back rehab and post-pregnancy recovery. The PVC hip hinge teaches neutral spine mechanics before any loading (NSCA, 2016). + +#### Pressing → Strict Press / Bench Press + +``` +Wall Push-up → Incline Push-up → Knee Push-up → Full Push-up (1 rep) + [F1] [F2] [F2] [F3] + +→ DB Press / DB Bench → Barbell Press / Bench (Empty Bar) → OP Beginner +``` + +Push-up regressions are documented in NSCA (2016) and ACSM guidelines. Each incline change adjusts the percentage of bodyweight being pressed. Wall push-ups are a standard entry point in shoulder rehab programs. + +#### Gymnastics → Strict Pull-up + +``` +Farmer's Carry (30s) → Band Pull-apart → Seated Band Row → Dead Hang (10s) + [F1] [F1] [F2] [F2] + +→ Dead Hang (30s) → Scapular Pull-up → Eccentric Pull-up → Band-Assisted Pull-up + [F3] + → OP Beginner+ (1 strict pull-up) +``` + +This chain starts with **no pull-up bar required**. Farmer's carry develops grip strength using household items (bags, water bottles). Band pull-aparts and seated band rows build scapular retraction and upper back strength with a resistance band -- a standard home-based horizontal pulling exercise for older adults (Fragala et al., 2019). Dead hangs enter at F2 once grip and shoulder capacity are established. + +Note: Pull-ups are 0 at the Beginner level, so this chain leads to Beginner+. Grip strength is an established biomarker for functional health and all-cause mortality in older adults (Bohannon, 2019). + +#### Core → Toes-to-Bar (McGill Big 3 Foundation) + +``` +McGill Curl-up → Bird Dog → Side Plank (knees) → Plank (30s) → Side Plank (full) + [F1] [F1] [F1] [F2] [F2] + +→ Plank (60s) → Hollow Hold → Hanging Knee Raise → Hanging Leg Raise + [F3] + → OP Beginner+ (1 T2B) +``` + +The core progression is built on the **McGill Big 3** -- three anti-movement exercises that are the clinical standard for spine health and core development (McGill, 2015): + +1. **Curl-up** -- anti-extension (protects the lower back) +2. **Bird dog** -- anti-rotation (trains spinal stability) +3. **Side plank** -- anti-lateral-flexion (builds lateral core endurance) + +McGill's research explicitly argues against traditional sit-ups and crunches, which load the spine through repeated flexion. The Big 3 trains the core's primary function: **resisting unwanted movement** to protect the spine. + +Plank normative data from Strand et al. (2014, n=471) and McGill et al. (2015) provide evidence-based thresholds. For adults aged 50-59, 30-60 seconds is a strong plank hold; plank endurance decreases approximately 10-15% per decade after age 35. + +#### Monostructural → 1-Mile Run + +``` +Walk 10 min → Walk 1km → Walk/Run Intervals → Run 400m → Run 800m → Run 1 Mile + [F1] [F1] [F2] [F2] [F3] [F3] + +→ OP Beginner (timed mile) +``` + +The progression starts with **10-minute continuous walking** -- the absolute baseline for sedentary adults. WHO (2020) and ACSM (Chodzko-Zajko et al., 2009) both recommend replacing sedentary time with light activity as the first step. + +This progression has more intermediate steps than Couch to 5K, which has high dropout rates partly due to large progression jumps (e.g., 5-minute to 20-minute continuous running in Week 5). Our intervals (1 min run / 2 min walk) are more gradual than C25K Week 1 (60s run / 90s walk). + +### Equipment Tags + +Each progression step declares its equipment requirement so applications can filter for equipment-free progressions: + +| Tag | Description | Available at Home | +|-----|-------------|:-----------------:| +| `none` | No equipment needed | Yes | +| `chair` | Standard chair or sturdy surface | Yes | +| `resistance_band` | Resistance band (~$10-25) | Yes | +| `free_weight` | Kettlebell or dumbbell | Maybe | +| `pull_up_bar` | Pull-up bar (doorframe or freestanding) | Maybe | +| `barbell` | Barbell and plates | No (gym) | + +Apps can show: "Steps 1-4 can be done at home. Steps 5+ require gym equipment." + +### Shared Progression Steps + +Some benchmark movements share early progression steps. For example, `strict_press`, `bench_press`, and `push_up` all share the wall push-up → incline push-up → knee push-up → full push-up chain. The `sharedSteps` field in the data file indicates when a progression reuses steps from another chain to avoid duplication. + +--- + +## Foundation Milestones + +### Concept + +Foundation Milestones are named micro-achievements within the Beginner level that provide visible progress before the first level-up. They are **not levels** -- they are pre-level markers that applications can optionally display. + +``` +Untrained → F1 (Foundation) → F2 (Moving) → F3 (Ready) → Beginner → Beginner+ → ... + │ + └── OP v1.0 starts here +``` + +### Design Principles + +1. **Achievable quickly** -- F1 within 1-2 weeks for most sedentary adults +2. **Cross-category** -- Each milestone tests multiple movement categories (like the weakest-link principle) +3. **Equipment-minimal** -- F1 requires only a chair and household items; F2 adds a resistance band; F3 optionally adds a pull-up bar +4. **Pass/fail** -- Criteria are capability-based, not percentile-based (unlike OP levels) +5. **Research-grounded** -- Criteria reference published clinical and exercise science standards + +### Timeline Caveat + +Estimated timelines assume a **healthy but sedentary adult** training 3x/week. For deconditioned, frail, or post-injury individuals, timelines may be 2-3x longer. The ICFSR expert consensus (Dent et al., 2021) recommends 3-5 months of multicomponent training as the minimum for meaningful functional improvement in frail older adults. The NSCA (Fragala et al., 2019) recommends increasing intensity or duration no more than once every 4 weeks for older adults. + +### Milestone Definitions + +#### F1: Foundation + +*Can perform basic human movements safely. Ready for a bodyweight exercise program.* + +| Requirement | Category | Criteria | +|-------------|----------|----------| +| Chair Sit-to-Stand | Squatting | 10 reps without hands | +| Wall Push-up | Pressing | 10 reps | +| Glute Bridge | Pulling | 10 reps | +| Farmer's Carry | Gymnastics | 30 seconds with ~5kg per hand | +| Walk 1km | Monostructural | Completion | + +**Estimated time:** 1-2 weeks for healthy sedentary adults. 4-6 weeks for deconditioned individuals. + +**Evidence:** The chair stand test criteria (10 reps) are well below the normal range for all age groups 60-94 in the Senior Fitness Test (Rikli & Jones, 2013; Jones, Rikli & Beam, 1999: n=7,183, test-retest r=0.89). The farmer's carry tests grip endurance -- a key functional health biomarker (Bohannon, 2019) -- without requiring a pull-up bar. The 1km walk threshold reflects WHO (2020) minimum physical activity guidelines. + +**Why farmer's carry instead of dead hang:** A dead hang requires a pull-up bar, which is not available in most homes. The farmer's carry tests the same functional grip capacity using household items (shopping bags, water bottles, etc.) and is accessible to everyone. Dead hangs enter the progression at F2. + +#### F2: Moving + +*Can perform bodyweight exercises with good form. Building functional capacity.* + +| Requirement | Category | Criteria | +|-------------|----------|----------| +| Air Squat (Partial) | Squatting | 20 reps | +| Incline Push-up | Pressing | 10 reps | +| Hip Hinge (Broomstick) | Pulling | 10 reps | +| Plank Hold | Bodyweight | 30 seconds | +| Walk/Run 800m | Monostructural | Completion | + +**Estimated time:** 2-4 weeks from F1. + +**Evidence:** The 30-second plank threshold is supported by McGill et al. (2015) and Strand et al. (2014, n=471) normative data. For adults aged 50+, 30 seconds represents adequate baseline core endurance. Exercise selections follow NSCA (2016) and Fragala et al. (2019) progression guidelines for older adults. + +#### F3: Ready + +*Movement quality and base fitness sufficient for structured training with equipment. Ready for gym onboarding.* + +| Requirement | Category | Criteria | +|-------------|----------|----------| +| Air Squat (Full Depth) | Squatting | 20 reps | +| Full Push-up | Pressing | 1 rep | +| RDL (Bodyweight) | Pulling | 10 reps | +| Dead Hang OR Farmer's Carry | Gymnastics | 30 seconds hang, OR 60 seconds carry (~8kg/hand) | +| Run 1 Mile | Monostructural | Completion (any pace) | +| Plank Hold | Bodyweight | 60 seconds | + +**Estimated time:** 4-8 weeks from F2. + +**Evidence:** The 60-second plank threshold aligns with "good" core endurance in healthy populations (McGill et al., 2015; Strand et al., 2014). The ability to run one continuous mile is a standard baseline aerobic capacity marker (ACSM). The dead hang / farmer's carry alternative ensures this milestone is achievable both at home and in a gym. + +### Milestone Assessment + +Unlike OP levels (which use quantitative benchmarks from normative data), Foundation Milestones are **pass/fail capability checks**: + +1. Can you perform the movement? (capability) +2. Can you perform it safely? (form quality) +3. Can you perform it for the specified volume? (capacity) + +This is closer to how coaches actually onboard new members: "Can you squat to depth? Can you hinge properly? OK, you're ready for a barbell." + +### Weakest-Link Principle for Milestones + +Milestones follow the same weakest-link principle as OP levels: **all requirements must be met** to achieve a milestone. If someone can do 20 air squats and run a mile but cannot hold a 30-second plank, they remain at F1 until their core endurance catches up. + +This is consistent with the OP philosophy of encouraging well-rounded fitness. + +### Categories Not Covered by Foundation Milestones + +Foundation Milestones intentionally exclude two OP categories: + +- **Olympic Lifting** -- The clean, snatch, and clean & jerk are technically demanding movements that require coached instruction and cannot be safely self-taught through a progression chain. Foundation-level athletes should focus on the squat, hinge, and press patterns that underpin Olympic lifts. +- **Endurance (Benchmark WODs)** -- Fran, Grace, Murph, and Cindy combine barbell, gymnastics, and monostructural movements at intensity. They require proficiency in their component movements before being trained as workouts. The running/monostructural chain already covers aerobic base building. + +Both categories are fully covered by the existing OP level benchmarks once an athlete reaches the Beginner level. + +--- + +## Rehab and Physiotherapy Overlap + +Many foundation progression steps are identical to standard physiotherapy exercises: + +| Progression Step | Clinical Context | +|-----------------|-----------------| +| Chair Sit-to-Stand | Post-knee surgery, elderly fall prevention (SFT) | +| Glute Bridge | Lower back rehab, post-pregnancy recovery | +| Wall Push-up | Shoulder rehab, post-surgery upper body | +| McGill Curl-up | Lower back pain management, post-injury core rehab | +| Bird Dog | Spinal stability, lower back rehab | +| Side Plank | Lateral core stability, scoliosis management | +| Farmer's Carry | Grip rehab, functional independence assessment | +| Walk/Run Intervals | Cardiac rehab, return-to-activity protocols | +| Plank Hold | Core stability, lower back pain management | + +This overlap is by design. Functional fitness movements **are** human movement patterns, and the regressions are how physiotherapists rebuild them. Formalizing this in OP makes the standard useful from rehabilitation through elite performance. + +--- + +## Compatibility + +| Existing OP Feature | Impact | +|---------------------|--------| +| 7 levels | No change | +| Benchmark values | No change | +| Percentile mapping | No change | +| Weakest-link principle | No change (milestones also use it) | +| Metcon scaling | No change (scaling already goes below Beginner) | +| Level calculation | No change (milestones are a separate concept) | +| `data/levels.json` | **No change** -- level definitions, IDs, and colors are untouched | +| `data/benchmarks/*.json` | No change | +| `data/sources.json` | 9 new sources added | +| New: `data/progressions.json` | Additive | +| New: `data/milestones.json` | Additive | + +**Foundation Milestones are not levels.** They do not alter `data/levels.json` in any way. Applications that ignore `data/milestones.json` and `data/progressions.json` continue to function exactly as before -- the 7-level system is completely unchanged. Milestones are an optional layer that apps can adopt independently. + +--- + +## Data Files + +### `data/progressions.json` + +Contains movement progression chains organized by target benchmark movement. See the file for full schema. + +### `data/milestones.json` + +Contains Foundation Milestone definitions (F1, F2, F3) with requirements and criteria. See the file for full schema. + +--- + +## Research Sources + +| Source | Used For | +|--------|----------| +| Rikli & Jones (2013) | Chair stand test criteria, functional fitness assessment | +| Jones, Rikli & Beam (1999) | 30-second chair stand test validation (n=7,183, r=0.89) | +| NSCA Essentials (2016) | Exercise progression/regression principles | +| Fragala et al. (2019) | NSCA resistance training guidelines for older adults | +| Chodzko-Zajko et al. (2009) | ACSM position stand on exercise and older adults | +| WHO (2020) | Physical activity baseline thresholds | +| McGill et al. (2015) | Core endurance assessment, McGill Big 3 | +| Strand et al. (2014) | Plank and core endurance normative data (n=471) | +| Bohannon (2019) | Grip strength as functional health biomarker | +| ACSM Guidelines | Push-up progressions, aerobic capacity baselines | + +Full citations in `data/sources.json`. + +--- + +## Open Questions + +1. **Video references**: Progression steps could include `videoId` fields linking to instructional content. Should this be part of the standard or left to implementers? + +2. **Age adjustment**: F1/F2/F3 criteria are intentionally set low enough for healthy adults of any age. Age-specific variations may not be necessary at this level but could be explored in future versions. + +3. **Milestone naming**: F1/F2/F3 is functional but could be made more motivating. Alternatives considered: Foundation/Moving/Ready (current), Bronze/Silver/Gold, Seed/Sprout/Bloom. The current names were chosen for clarity over inspiration.
-**Open** — Free to use, implement, and contribute to +**Open** -- Free to use, implement, and contribute to -**Research-backed** — Every benchmark traces to peer-reviewed studies or public-domain data +**Research-backed** -- Every benchmark traces to peer-reviewed studies or public-domain data
-**Gym-agnostic** — Works for any functional fitness facility, not tied to any brand +**Gym-agnostic** -- Works for any functional fitness facility, not tied to any brand -**Community-driven** — Standards improve through open contribution +**Community-driven** -- Standards improve through open contribution