How Rotten Score Works
The Rotten Score is a number that summarises how much documented harm a company has caused, weighted by evidence severity and category importance. Higher means more rotten; a score of 0 means no evidence of harm has been recorded.
The short version
- Evidence is submitted across any harm category (e.g. wage abuse, greenwashing, fraud). Each piece of evidence is assigned a severity: low, medium, or high.
- Community members rate each piece of evidence on a numeric scale. The average of those ratings becomes the avg_rating for that category and is used to compute a small rating_factor modifier.
- A severity score is computed for each category by weighting evidence counts:
severity_score = (misconduct_low × 1) + (misconduct_medium × 3) + (misconduct_high × 6) − eligible_remediation_units
Remediation evidence can offset misconduct, but is capped at 25% of the misconduct count per category (minimum 1 if any misconduct exists). - Each category’s final score uses evidence quality as the primary driver; ratings are a weak modifier (±10%):
rating_factor = 0.9 + 0.1 × ((COALESCE(avg_rating, 3) − 1) / 4)final_score = GREATEST(severity_score, 0) × base_weight × rating_factor
When there are no ratings, avg_rating defaults to 3 (neutral), giving rating_factor = 0.95. Categories with no approved evidence still have a final_score of 0 because their severity_score is 0. - The category score is the average of final_score across all harm categories in the system (including those with no evidence, which each contribute 0):
category_score = round(avg(final_score), 2) - A manager component may be added if any of the company’s managers carry a rolled-up score:
manager_component = COALESCE(manager_rollup, 0) × 2 - Final Rotten Score: the raw score is passed through an exponential squash that maps it to a bounded 0–100 scale:
raw_rotten_score = category_score + manager_componentrotten_score = round(100 × (1 − exp(−raw_rotten_score / 50)), 2) - If a company has no evidence at all, every category’s final_score is 0, the category_score is 0, and (absent any manager component) the Rotten Score is 0 — reflecting a clean slate rather than missing data.
Worked example — AcmeCorp (fictional)
AcmeCorp has approved evidence in 3 out of 18 harm categories. The other 15 categories each contribute a final_score of 0. Base weights shown here are illustrative; actual per-category weights are stored in the database.
| Category | Avg rating | Rating factor | Severity score (L×1+M×3+H×6) | Base weight | Final score |
|---|---|---|---|---|---|
| Toxic Workplace | 3.5 | 0.9625 | 5(2×1+1×3+0×6) | 2 | 9.63 |
| Wage Abuse | 4.2 | 0.9800 | 9(0×1+1×3+1×6) | 1.5 | 13.23 |
| Greenwashing | 2 | 0.9250 | 6(0×1+2×3+0×6) | 1 | 5.55 |
| Other 15 categories | N/A | 0.9500 | 0 | varies | 0.00 |
Sum of final scores: 28.41
category_score = round(28.41 ÷ 18, 2) = 1.58
manager_component = manager_rollup (1.5) × 2 = 3.00
raw_rotten_score = 1.58 + 3.00 = 4.58
Rotten Score = round(100 × (1 − exp(−4.58 ÷ 50)), 2) = 8.75
Full methodology
Company Rotten Scores are computed entirely inside the database via the company_rotten_score_v2 view, which aggregates data from company_category_full_breakdown. The formulas below reflect those view definitions.
Step 1 — Severity score per category
For each company–category pair, count the approved evidence items by type and severity, then apply the remediation cap:
misconduct_units =
(misconduct_low × 1)
+ (misconduct_medium × 3)
+ (misconduct_high × 6)
remediation_units =
(remediation_low × 1)
+ (remediation_medium × 3)
+ (remediation_high × 6)
-- Remediation cap (per category):
-- eligible_remediation_count = 0 when total_misconduct_count = 0
eligible_remediation_count =
LEAST(total_remediation_count,
GREATEST(1, FLOOR(total_misconduct_count × 0.25)))
eligible_ratio =
eligible_remediation_count / total_remediation_count
eligible_remediation_units =
remediation_units × eligible_ratio
severity_score =
misconduct_units − eligible_remediation_unitsRemediation evidence can reduce a category’s severity score, but is capped at 25% of the misconduct count per category (minimum 1 eligible if any misconduct exists). This prevents a company from wiping out a large misconduct score with a handful of remediation items. High-severity evidence carries six times the weight of low-severity evidence.
Step 2 — Per-category final score
Evidence quality (severity × base weight) is the primary driver. Community ratings contribute a small modifier of ±10% via a rating_factor:
-- avg_rating defaults to 3 (neutral) when no ratings exist rating_factor = 0.9 + 0.1 × ((COALESCE(avg_rating, 3) − 1) / 4) -- avg_rating = 1 → rating_factor = 0.90 (lowest) -- avg_rating = 3 → rating_factor = 0.95 (neutral default) -- avg_rating = 5 → rating_factor = 1.00 (highest) final_score = GREATEST(severity_score, 0) × base_weight × rating_factor
base_weight is a per-category constant stored in the database that reflects the relative ethical importance of the category. GREATEST(severity_score, 0) clamps the severity score to a minimum of 0, ensuring that unusually large remediation cannot produce a negative final score. A category with no approved evidence has a severity_score of 0 and therefore a final_score of 0, regardless of ratings.
Step 3 — Company category score
Average the final_score across all categories in the system (the view cross-joins every company with every category, so categories with no evidence contribute 0):
category_score = round(avg(final_score), 2)
Step 4 — Manager component
If any of the company’s managers have a rolled-up score, that score is added in. If no manager rollup exists, this component is 0:
manager_component = COALESCE(manager_rollup, 0) × 2
Step 5 — Final Rotten Score (exponential squash)
The raw score is passed through an exponential transform that maps it to a bounded 0–100 scale. The score approaches 100 asymptotically — a company can never reach a perfect 100, but extreme misconduct drives it close.
raw_rotten_score = category_score + manager_component rotten_score = round(100 × (1 − exp(−raw_rotten_score / 50)), 2)
Key behaviours
- More evidence — especially high-severity evidence — increases the score.
- Community ratings act as a small modifier (±10%) via rating_factor. They do not dominate the score; a category with strong evidence but no ratings still contributes meaningfully at the neutral default (rating_factor = 0.95).
- Remediation evidence can reduce a category’s severity score, but only up to 25% of the misconduct count (minimum 1 eligible item if any misconduct exists). This guardrail prevents a small number of remediation items from eliminating a large misconduct score.
- Category base weights are set in the database and reflect the relative severity of each harm type.
- Because the category average is taken over all categories (including those with no evidence), a company’s score is naturally bounded by how many categories have evidence and how severe that evidence is.
- A company with no approved evidence and no manager component will have a Rotten Score of 0.
- The Rotten Score is bounded between 0 and 100. The exponential squash (1 − exp(−x/50)) approaches 100 asymptotically; it can never reach 100 exactly.