Source: https://guthlabs.ai/docs/instruments/target-heart-rate-zones/mechanism/

instrument mechanism / verified-clean

# Target Heart Rate Zones mechanism

The inspectable method record for Target Heart Rate Zones, kept separate from implementation and qualification.

Status: **VERIFIED_CLEAN**Lifecycle: **verified-clean**

## Model scope

The formulas themselves are standard, but the instrument cannot be fully verified as a zone-table generator until it specifies the zone scheme, intensity encoding, endpoint convention, and bpm rounding policy. The existing honest-label language is appropriate and should remain visible on every panel.

- Both HRmax formulas are standard population-average estimates: 220−age and Tanaka 208−0.7×age.

- Karvonen THR=(HRmax−HRrest)×intensity+HRrest is correct when intensity is represented as a decimal fraction from 0 to 1.

- The spec does not define the zone boundaries, number of zones, whether boundary endpoints are inclusive, or how fractional bpm values are rounded for the displayed zone table.

- The input label "intensity %" is ambiguous: the formula requires either decimal fractions such as 0.70 or percentage points converted by dividing by 100, such as 70→0.70. The implementation must specify and enforce one representation.

## Units and conventions

- Age is in years.

- Heart rates and HRmax, HRrest, and THR are in beats per minute (bpm).

- In the calculations below, intensity values are decimal fractions; for example, 0.50 means 50%.

- The displayed ranges retain fractional bpm values unless a separate rounding policy is specified.

- Karvonen zones use HRrest; direct percentage-of-HRmax zones would be a different calculation and are not defined here.

## Inspectable vector

One of 4 source-bound review vectors:

````
{
  "inputs": {
    "age": 30,
    "resting_hr_bpm": 60,
    "formula_choice": "220-age",
    "intensity_ranges": [
      [
        0.5,
        0.6
      ],
      [
        0.6,
        0.7
      ],
      [
        0.7,
        0.8
      ],
      [
        0.8,
        0.9
      ],
      [
        0.9,
        1
      ]
    ]
  },
  "expected_outputs": {
    "hrmax_bpm": 190,
    "zone_table_bpm": [
      {
        "intensity": "50%-60%",
        "range": [
          125,
          138
        ]
      },
      {
        "intensity": "60%-70%",
        "range": [
          138,
          151
        ]
      },
      {
        "intensity": "70%-80%",
        "range": [
          151,
          164
        ]
      },
      {
        "intensity": "80%-90%",
        "range": [
          164,
          177
        ]
      },
      {
        "intensity": "90%-100%",
        "range": [
          177,
          190
        ]
      }
    ]
  },
  "working": "HRmax = 220−30 = 190 bpm. HR reserve = 190−60 = 130 bpm. Zone 1: 130×0.50+60 = 65+60 = 125; 130×0.60+60 = 78+60 = 138. Zone 2: 130×0.60+60 = 138; 130×0.70+60 = 91+60 = 151. Zone 3: 130×0.70+60 = 151; 130×0.80+60 = 104+60 = 164. Zone 4: 130×0.80+60 = 164; 130×0.90+60 = 117+60 = 177. Zone 5: 130×0.90+60 = 177; 130×1.00+60 = 130+60 = 190."
}
````

## Failure boundary

**BREAK_CLAIMED** · SELF_FLAGGED

The specification has no stated validation for non-physiological ages, intensity bounds, or numeric overflow. Extreme inputs can produce -Infinity, and an intensity-unit ambiguity can produce 8460 bpm instead of 144 bpm.

## Other records

[01**Overview**](<https://guthlabs.ai/docs/instruments/target-heart-rate-zones/>)[03**Implementation**](<https://guthlabs.ai/docs/instruments/target-heart-rate-zones/implementation/>)[04**Qualification**](<https://guthlabs.ai/docs/instruments/target-heart-rate-zones/qualification/>)

## Sources and evidence

These pointers bind the page to evidence. They do not grant authority or collapse verification into deployment.

- `VERIFIED_LEDGER.json`

- `evidence-tranche4/tranche4-results.json`

- `BOUNDARY_HAZARD_CATALOG.json`
