Rotten Company
← Back to home

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

  1. 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.
  2. 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.
  3. 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).
  4. 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.
  5. 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)
  6. 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
  7. 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_component
    rotten_score = round(100 × (1 − exp(−raw_rotten_score / 50)), 2)
  8. 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.

CategoryAvg ratingRating factorSeverity score
(L×1+M×3+H×6)
Base weightFinal score
Toxic Workplace3.50.96255(2×1+1×3+0×6)29.63
Wage Abuse4.20.98009(0×1+1×3+1×6)1.513.23
Greenwashing20.92506(0×1+2×3+0×6)15.55
Other 15 categoriesN/A0.95000varies0.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_units

Remediation 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.