Scoring & Rating Bands
How a raw number — a 96% attendance rate, a 3.2-hour resolution time — becomes a fair 1.00–5.00 score, and how those scores roll up into one composite and a rating. This is the maths that makes every metric comparable.
The 1.00–5.00 scale & rating bands
Everything the module scores — each metric, each category, the composite — lives on the same continuous 1.00–5.00 scale (stored to two decimals). Five named bands divide it up:
Normalization — raw value → 1–5 score
Each metric defines five threshold bands in its own natural unit (see the catalogue). To score a raw value the engine finds which band it falls in, then interpolates within that band — so scoring is smooth, not a blunt five-step ladder.
Match the band
The raw value is matched against the metric's five threshold ranges, each of which owns a slice of the 1–5 scale (Outstanding → 4.50–5.00, Exceeds → 3.50–4.49, and so on).
Interpolate inside the band
Where the value sits within its band's range determines the exact score. A value at the very top of the Meets range scores near 3.49; near the bottom, near 2.50.
Clamp out-of-range values
A value beyond the metric's authored range lands in the extreme band that owns that end — it can't “overflow” to a perfect 5.00 or an automatic 1.00.
Null → excluded
If the raw value is null (no data, or a divide-by-zero), the metric returns null and is left out of the roll-up — its weight is handed to the metrics that did compute.
// within-band linear interpolation
position = (raw − band_min) / (band_max − band_min) // ↑ higher-is-better
position = (band_max − raw) / (band_max − band_min) // ↓ lower-is-better
score = band_base + position × (band_ceiling − band_base)
score = clamp(score, 1.00, 5.00)Direction — which way is “good”
A metric's direction is the only thing that flips the interpolation:
Bell-curve (target-band) metrics
Three metrics — Overtime Utilization, Leave Utilization, Leave Balance — are healthiest at a moderate value, so their bands are arranged with the top score in the middle of the range. Both extremes score low.
| Overtime ÷ regular hours | Reads as | Score band |
|---|---|---|
| 0 – 5% | under-utilized | Meets |
| 5 – 15% | healthy | Outstanding |
| 15 – 25% | elevated | Exceeds |
| 25 – 35% | overwork | Needs Improvement |
| > 35% | burnout risk | Unsatisfactory |
Rolling up to the composite
The composite is a two-level weighted average, skipping nulls at both levels.
Category score
Within a category, metric scores are blended by their metric weights — over the non-null metrics only:
category_score = Σ(metric_score × metric_weight) / Σ(metric_weight) // non-null metricsComposite score
Category scores are blended by their category weights — over the categories that produced a score:
composite_score = Σ(category_score × category_weight) / Σ(category_weight) rating_band = band(composite_score)
Worked example (General Staff)
category_scores: ATT 4.08 (20%) TSK 3.75 (20%) PRJ 3.50 (10%) TKT 4.20 (10%)
BHV 5.00 (10%) LVE 3.60 (5%) PRF 3.00 (10%) TMS 3.80 (15%)
composite = (4.08·20 + 3.75·20 + 3.50·10 + 4.20·10
+ 5.00·10 + 3.60·5 + 3.00·10 + 3.80·15) / 100
= 388.6 / 100
= 3.89 → Exceeds ExpectationsExceeds Expectations — which, for a General-Staff role, would generate a +1 salary step recommendation. See Salary Progression.
Data sufficiency & confidence
A score is only as trustworthy as the data behind it. The engine tracks data sufficiency:
coverage = (metrics_total − metrics_null) / metrics_total × 100The composite is treated as reliable and shown normally. The detail modal's data-sufficiency bar is green.
The composite is still produced but flagged. Surface it, but exclude it from rankings and pay decisions. The bar is amber.