# Strength map methodology

This is a local, descriptive comparison with Strength Level users (people who log lifts), **not the general population**. The generated `standards.js` is the sole source of standard cutoffs, level percentiles, lift counts, dates and source URLs. It is not modified by this site. Raw source snapshots are in `sources/`; data was retrieved 2026-09-24. Cutoffs are used at full precision. Only display values are formatted, and final percentiles are rounded as described below.

## Input and pure API

Load `standards.js` then `app.js`. `window.LiftsScore` exposes `e1rm`, `cutoffsFor`, `percentileFromCutoffs`, `scoreLift`, `scoreAll`, `REGIONS` and `LIFTS`. Loading both under Node with `global.window = {}` requires no DOM. Functions do not mutate inputs or tables.

```js
const result = window.LiftsScore.scoreAll({
  sex: 'male', // 'male' or 'female'
  age: '', // optional years
  bodyweight: '', // optional, in unit below
  unit: 'lb', // 'lb' or 'kg'
  lifts: {
    deadlift: { w: 455, r: 1 },
    squat: { w: 335, r: 1 },
    'pull-ups': { added: 0, r: 10 },
    dips: { added: 0, r: 10 }
  }
});
```

Missing or blank fields mean not tested. Loaded tests need `w` and `r`; carries need `w` per hand only; bodyweight tests use `added` (blank defaults to zero) and `r`; reps-only tests use `r`. Partial loaded sets or invalid numbers return `invalid`, without a score. Reps must be positive integers, external loads and bodyweight positive, and assisted total load positive. Age, if entered, must be positive. An entered bodyweight test without bodyweight returns `needs_bodyweight`. An untouched added-weight field of zero is not a tested lift.

`scoreLift(slug, state)` returns status and, when scored, the comparison `value`, `kind`, `e1rm` (null for reps/carry), five `cutoffs`, `percentile`, and `flags`. All output loads are in lb. `scoreAll(state)` returns `{lifts, regions}`, objects keyed by slug and region respectively. Regions have `status`, `percentile` (null if unscored), and `lifts` listing only contributing slugs. `LIFTS` contains slug, region, type and display name; `REGIONS` contains the nine names.

`cutoffsFor(slug, {sex, bodyweight, age, added})` accepts bodyweight **in lb**, and `added: true` selects the added-1RM table. Defaults are male, blank bodyweight, blank age, false. It returns cutoffs, table kind and flags, or needs-bodyweight. Callers of this lower-level API supply valid numeric inputs. `percentileFromCutoffs(value, cutoffs)` accepts an ordered five-number array.

## Comparison values

- Loaded lifts: Epley e1RM = weight × (1 + reps / 30), except one rep uses the entered weight exactly.
- Farmers carry: compare weight per hand directly, with at least 20 m carried. No Epley. Its smaller sample size is shown from `community_lifts`; carry technique and equipment affect comparability.
- Dips, chin-ups, pull-ups: bodyweight is required. With zero added load, compare actual reps with the reps table. Otherwise compare estimated added 1RM = (bodyweight + added) × (1 + reps / 30) − bodyweight. For one rep this is exactly the added weight. Negative added weight means assistance. Added-1RM cutoffs can be negative.
- Nordic curl, two-leg bodyweight calf raise and back extension: actual reps only; bodyweight is required.

One kg equals 2.20462 lb. `scoreLift` converts bodyweight, external load and added load to lb. The unit toggle converts displayed inputs together, retaining 12 significant digits to remove floating-point display noise. Cutoffs and e1RM are displayed in the current unit; reps are never converted. Inputs, sex, age and unit persist locally under `lifts.v1`. Clear resets the form; no data is transmitted.

## Bodyweight and age

For known bodyweight, interpolate each level linearly between bracketing `by_bodyweight` rows. Outside the range, use the nearest endpoint and flag `bwClamped`. With bodyweight blank, loaded lifts and carries use `community` and flag `notBwAdjusted`; the interface marks them with an asterisk. Bodyweight and reps tests are never guessed.

For entered age, interpolate `by_age` and clamp beyond its endpoints, flagging `ageClamped`. Let A be the age-adjusted row and R the reference row at age 30. For weight tables, multiply each bodyweight/community cutoff by A/R at that level. For reps and added-1RM tables, add A − R instead. Floor adjusted reps cutoffs at zero; do not floor added-load cutoffs. With age blank apply no adjustment and flag `notAgeAdjusted`. The age-30 row lies on Strength Level’s reference plateau. These separable bodyweight and age adjustments are a model, not an observed joint age/bodyweight distribution.

## Percentiles and regions

The five Strength Level bands correspond to 5, 20, 50, 80 and 95 percentiles, read from the data. Between unequal cutoffs interpolate linearly. At an exact cutoff choose its mapped percentile; if cutoffs tie choose the first (lowest) matching level. Source “less than one” reps are encoded as zero. The top branch takes precedence: at or above the elite cutoff, use 95 + 5 × (value − elite) / (elite − advanced), or 95 if those two cutoffs tie. Cap at 99.

Below beginner, set L = beginner − (novice − beginner), and use max(0, 5 × (value − L) / (beginner − L)); if novice and beginner tie use zero. Finally round to the nearest integer and clamp to 0–99. These interpolated percentiles are estimates between published bands, not empirical quantiles.

A region is the rounded arithmetic mean of its scored lift percentiles, with each tested lift equally weighted. The detail card lists all contributing lifts. With no scored lifts it is `not_tested`, unless a test needs bodyweight, in which case it is `needs_bodyweight`. Unscored regions stay grey and never enter the lagging ranking. Needs-bodyweight regions have dashed outlines. Region level names use the highest level threshold reached; below the first is “Below beginner”. Colors interpolate red through yellow to green. Test selection can change regional comparisons; one lift does not measure every function of a muscle.

## Testing and training limits

The detail cards describe consistent ROM, depth, grip and controlled reps. Higher-rep Epley estimates and differing equipment are less comparable. Programming is a practical starting point: use controlled sets, about 1–3 reps in reserve, recovery between sessions and gradual progression. Exercise prescriptions are training suggestions, not additional scoring standards.

Dead hang time and grip dynamometer: no Strength Level standard — not scored. Single-leg bodyweight calf raise: no published standard — not scored; use the two-leg bodyweight calf raise standard. The seated calf raise can be a training exercise, but is not a scored input in this map. Every scored lift links to its exact data-provided Strength Level URL and sample count in the footer.

## Verification

Run `node test/score.test.js` and the spec’s `node -e` preset command. Tests derive standard values from the generated data, including exact cutoffs, bodyweight and age interpolation, additive adjustments, conservative ties, clamping, unit equivalence, regional aggregation and no mutation.
