Five areas, one number, a published chart
Every report gives five area grades from 0 to 100 and one score. This page is generated from the same data file the engine reads, so the chart cannot drift from the code.
The formula
Each area starts at 100. Its findings are sorted from the heaviest penalty down. The heaviest counts in full, and each next one counts 0.7 times the one before it, so a pile of small warnings cannot zero a grade while one serious error still dominates. A rule counts once however many places it fires.
score = min over areas of ( 100 − weight × (100 − grade) ), then caps
The weights decide how much a bad grade in each area pulls the score down. A weight of 1.0 means the area's grade becomes the score directly. A weight of 0.8 means a performance grade of 50 pulls the score to 60, not 50.
Areas and weights
| Area | Weight | Fed by finding categories |
|---|---|---|
| Stability | 1.0 | crash, load, trigger, desync, breakage-by-patch, logic |
| Performance | 0.8 | perf, performance, leak |
| Security | 1.0 | cheat, malware, security |
| Cleanliness | 0.4 | garbage |
| Text | 0.3 | share of the map's text that is not English |
Penalty per finding
| Severity | Penalty | Cleanliness |
|---|---|---|
| Errors | 40 | 40 |
| Severe | 20 | 20 |
| Warnings | 8 | 8 |
| Info | 2 | 3 |
Severity names follow the map-maker convention: Errors, Severe, Warnings, Info. The Text grade loses 50 points times the share of the map's text that is not English.
Letters
| Letter | Score |
|---|---|
| A | ≥ 90 |
| B | ≥ 80 |
| C | ≥ 65 |
| D | ≥ 50 |
| F | below 50 |
Score caps
| When | Score at most |
|---|---|
| Malware verdict: malicious | 20 |
| Malware verdict: suspicious | 60 |
| Fails on the build being played | 40 |
The security grade itself is capped too:
| Malware verdict | Security at most |
|---|---|
| malicious | 10 |
| suspicious | 50 |
Leak deadline
| A game limit is hit within | Stability |
|---|---|
| ≤ 60 min | −50 |
| ≤ 120 min | −35 |
| ≤ 240 min | −25 |
| ≤ 1440 min | −10 |
From a static estimate of how fast handles leak in code that runs all game.
Ring colours
The score ring is red below 50 (F), amber from 50 to 79 (D and C) and radiant from 80 up (B and A). Colour never carries the meaning alone: the number and the letter are always printed inside the ring.
Worked example
The example map, before and after its fix. Each area's term is 100 − weight × (100 − grade).
| Run | Area terms | Caps | Score |
|---|---|---|---|
| Before | Stability 2 → 2.0 · Performance 46 → 56.8 · Security 100 → 100.0 · Cleanliness 100 → 100.0 · Text 100 → 100.0 | compat fails cap 40 | 2 F |
| After | Stability 80 → 80.0 · Performance 69 → 75.2 · Security 100 → 100.0 · Cleanliness 100 → 100.0 · Text 100 → 100.0 | no cap | 75 C |
Source of every number on this page: tools/ops/data/report-card.json (weights, penalties, caps, letters) and tools/ops/scan/score.py (the decay of 0.7).