---
title: "Device Health Score - Algorithms and Calculations"
slug: "device-health-score-algorithms-and-calculations"
updated: 2026-01-30T19:14:28Z
published: 2026-01-30T19:14:28Z
canonical: "support.controlup.com/device-health-score-algorithms-and-calculations"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://support.controlup.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Device Health Score – Algorithms and Calculations

This article describes how Device Health Scores and rightsizing recommendations are calculated: formulas, thresholds, and pillar weights. Use it when you need to interpret scores or troubleshoot unexpected results.

## Overview of the Scoring Model

The Device Health Score uses a **Penalty-First** model:

1.  Each device starts at **10.0**.
2.  Each pillar produces a **penalty** from 0 to 100.
3.  Penalties are combined using **fixed weights**.
4.  The final score is: 10 − (WeightedTotalPenalty / 10), clamped between **0.0** and **10.0**.

**Important:** If the operating system is **Unsupported** (EOL), the final score is **capped at 7.0** regardless of other pillars.

All rightsizing and stability logic uses data **only from active user sessions**. Data is typically sampled at 1-minute intervals over a **30-day trailing window**.

## Pillar Weights

| Pillar | Weight | Description |
| :---: | :---: | :---: |
| **Rightsizing** | 30% | Resource pressure (CPU, RAM, Disk IO, GPU) during active sessions. |
| **Stability** | 20% | Crash/freeze frequency (Windows) or sustained resource pressure (macOS/Linux). |
| **Battery Health** | 25% | Battery capacity vs. design. |
| **OS Lifecycle** | 15% | OS support status (EOL = full penalty and score cap at 7.0). |
| **Storage Space** | 10% | Free disk space. |

## Rightsizing Pillar (30%)

A **breach** (stress) or **idle** (underuse) is counted when a resource is beyond its threshold during an active session sample.

### Bands and Thresholds

| Resource | Breach (Undersized risk) | Idle (Oversized potential) |
| :---: | :---: | :---: |
| **CPU** | Utilization \> 80% | Utilization < 40% |
| **RAM** | Available % < 10% | Available % > 60% |
| **Disk** | Active time \> 60% | Active time < 10% |
| **GPU** | Utilization \> 80% | Utilization < 10% |

### Penalty Within the Rightsizing Pillar

The rightsizing penalty is a **weighted average** of four resource penalties (0–100 each):

| Metric | Weight within pillar | Penalty formula (0–100) |
| :---: | :---: | :---: |
| **RAM** | 50% | Quadratic: 100 × (Breach% / 15)² |
| **CPU** | 30% | Quadratic: 100 × (Breach% / 15)² |
| **Disk IO** | 10% | Quadratic: 100 × (Breach% / 15)² |
| **GPU** | 10% | Quadratic: 100 × (Breach% / 15)² |

**Breach%** is the percentage of active session samples in which the resource was in the breach band. The quadratic curve increases penalties more sharply as breach% approaches 15%, reflecting accelerating user impact near the undersized threshold.

## Stability Pillar (20%)

### Windows (Native Events)

*   **BSOD / system crash:** One or more events → **100** penalty (about 2.0 points off the total score).
*   **App crashes / hangs:**
    *   **MTBF** = Total active hours ÷ Crash count (if crashes > 0; else MTBF = Total active hours).
    *   **Penalty (0–100):**
        *   MTBF > 24 h → 0
        *   MTBF < 1 h → 100
        *   1 h ≤ MTBF ≤ 24 h → (24 − MTBF) × (100 / 23) (capped 0–100)

### macOS and Linux (Performance Proxy)

Native crash data is not used. **Sustained resource exhaustion** is used as a proxy:

*   **Metric:** Combined CPU and RAM breach percentage (share of active session time in breach).
*   **Condition:** Penalty applies if combined breach > **25%**.
*   **Formula:** (CombinedBreach% − 25) × 2 (capped at 100).

## Battery Health (25%)

Battery health is expressed as a percentage of design capacity. Penalty is 0 when no battery is present (e.g. desktops).

| Health range | Penalty formula (0–100) |
| :---: | :---: |
| \> 80% | 0 |
| 70% – 80% | (80 − Health) × 3.5 |
| 50% – 70% | 35 + (70 − Health) × 1.75 |
| < 50% | 70 + (50 − Health) × 1.26 |

## OS Lifecycle (15%)

Status is derived from a lifecycle database (e.g. EOL date) at runtime.

| Status | Condition | Penalty |
| :---: | :---: | :---: |
| **Supported** | EOL date in future | 0 |
| **Expiring Soon** | EOL within 90 days | 0 (informational) |
| **Unsupported** | EOL date passed | 100 (and **score capped at 7.0**) |
| **Unknown** | OS/version not in database | 0 |
| **Linux (N/A)** | Out of scope | 0 |

## Storage Space (10%)

| Condition | Penalty formula (0–100) |
| :---: | :---: |
| Free % ≥ 15% | 0 |
| Free % < 15% | (15 − Free%) × 10 (capped at 100) |

## Final Health Score

**Formula:**
HealthScore = Max(0, Min(10, 10 − (WeightedTotalPenalty / 10)))

**WeightedTotalPenalty** is the sum of (each pillar’s penalty × pillar weight). Pillar weights are in decimal form (e.g. 0.30 for Rightsizing).

**Hard cap:** If OS is **Unsupported**, HealthScore = Min(HealthScore, 7.0).

### Health Bands (Labels)

| Score range | Label |
| :---: | :---: |
| 9.0 – 10.0 | Excellent |
| 7.5 – 8.9 | Good |
| 6.0 – 7.4 | Fair |
| 4.0 – 5.9 | Poor |
| 0.0 – 3.9 | Critical |

## Rightsizing Recommendation Logic

Recommendations are **mutually exclusive** and follow a **Risk-First** rule: undersized is evaluated first; a device with any resource stress is never labeled Oversized.

| Recommendation | Condition |
| :---: | :---: |
| **Undersized** | Any of CPU, RAM, Disk, or GPU has breach% > **15%** of active session time. |
| **Oversized** | Zero breaches **and** all four resources in idle band for **> 90%** of active session time; requires at least **Medium** confidence (≥ 100 samples). |
| **Appropriate** | All other cases with sufficient data. |
| **Insufficient data** | Fewer than **100** active session samples. |

### Confidence Levels

| Level | Active session samples | Effect |
| :---: | :---: | :---: |
| **High** | \> 1,000 | Full score and recommendation. |
| **Medium** | 100 – 1,000 | Full score and recommendation. |
| **Low** | < 100 | Sizing recommendation forced to **Insufficient data**. |

Samples are 1-minute intervals during active sessions; 100 samples ≈ 1.6 hours of active use.

## Top Issue Determination

The **Top Issue** is the first matching condition in this order:

1.  **OS EOL** — OS support status = End of Life
2.  **OS Near EOL** — OS support status = Expiring Soon
3.  **Battery Health** — Battery penalty > 25
4.  **Stability/Crash Events** — Stability penalty > 50
5.  **Low Disk Space** — Storage space penalty > 50
6.  **High RAM Pressure** — RAM penalty > 50
7.  **High CPU Pressure** — CPU penalty > 50
8.  **Resource Constraints** — Sizing recommendation = Undersized
9.  **None** — No condition met
