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. environmental harm, fraud, workplace misconduct). 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
Harm Category A (illustrative)3.50.96255(2×1+1×3+0×6)29.63
Harm Category B (illustrative)4.20.98009(0×1+1×3+1×6)1.513.23
Harm Category C (illustrative)20.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.