{"abstract":"Design effects for a fixed set of clusters are inflated.","category":"Experiment statistics","checks":8,"contract":"For clusters (e.g. companies) randomised as units: mean size m, population variance of sizes / m^2 = cv^2, design effect = 1 + ((cv^2 + 1) m - 1) icc. Effective sample = total units / design effect; clusters needed = ceil(n_required * design effect / m). No clusters or zero mean -> None. Return [round(deff, 6), round(effective n, 6), clusters needed].","contract_signature":"cluster_sizes, icc, n_required","evaluation_group":"w2-experiment-statistics-cluster-design-effect","failed_approach":"Dividing by k + 1 understates the size spread.","family":"w2-experiment-statistics-cluster-design-effect-size-variance-divisor","id":"FA-74721","implementations":{"attempt":{"sha256":"858ad3c6b988be7ab20f277381a5e206d6ff99c41362b2a335b477ed5fb490c8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(cluster_sizes, icc, n_required):\n    k = len(cluster_sizes)\n    if k == 0:\n        return None\n    total = sum(cluster_sizes)\n    mbar = total / k\n    if mbar == 0:\n        return None\n    var = sum((s - mbar) ** 2 for s in cluster_sizes) / (k + 1)\n    cv2 = var / mbar ** 2\n    deff = 1 + ((cv2 + 1) * mbar - 1) * icc\n    return [round(deff, 6), round(total / deff, 6), math.ceil(n_required * deff / mbar)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 1', [[40, 20, 40, 20, 20, 40], 0.01, 500], [1.323333, 136.020151, 23]),\n  ('cluster sample 2', [[3, 10, 10, 20], 0.05, 1000], [1.65814, 25.932679, 155]),\n  ('cluster sample 3', [[40, 10, 5], 0.01, 500], [1.303636, 42.189679, 36]),\n  ('cluster sample 4', [[20, 10, 20, 5, 5, 3], 0.2, 100], [3.844444, 16.387283, 37])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 8', [[5, 5, 3, 5], 0.2, 1000], [1.733333, 10.384615, 386]),\n  ('cluster sample 9', [[5, 5, 10, 40, 20, 20], 0.2, 100], [5.9, 16.949153, 36]),\n  ('cluster sample 12', [[40, 5, 10, 3, 40, 3], 0.0, 100], [1.0, 101.0, 6]),\n  ('cluster sample 13', [[3, 3], 0.2, 500], [1.4, 4.285714, 234])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 15', [[40, 20, 20, 10], 0.0, 100], [1.0, 90.0, 5]),\n  ('cluster sample 16', [[3, 20, 10, 5, 10, 40], 0.0, 500], [1.0, 88.0, 35]),\n  ('cluster sample 17', [[20, 40, 3, 20, 5], 0.05, 100], [2.332955, 37.720409, 14]),\n  ('cluster sample 24', [[5, 10], 0.2, 100], [2.466667, 6.081081, 33])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 21', [[40, 10, 5], 0.05, 100], [2.518182, 21.841155, 14]),\n  ('cluster sample 23', [[40, 5, 40], 0.01, 100], [1.369412, 62.070447, 5]),\n  ('cluster sample 24', [[5, 10], 0.2, 100], [2.466667, 6.081081, 33]),\n  ('cluster sample 39', [[5, 10], 0.01, 500], [1.073333, 13.975155, 72])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 29', [[3, 40, 40, 40], 0.01, 500], [1.380976, 89.067467, 23]),\n  ('cluster sample 30', [[3, 5, 3, 20, 10], 0.0, 1000], [1.0, 41.0, 122]),\n  ('cluster sample 31', [[10, 20, 5], 0.0, 1000], [1.0, 35.0, 86]),\n  ('cluster sample 49', [[20, 10, 20, 20, 10, 3], 0.01, 1000], [1.159759, 71.56659, 84])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"d963d50b225d8bd439b3c36dc9e276e1695374fe6054ecebb8e09faf69a02a79","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(cluster_sizes, icc, n_required):\n    k = len(cluster_sizes)\n    if k == 0:\n        return None\n    total = sum(cluster_sizes)\n    mbar = total / k\n    if mbar == 0:\n        return None\n    var = sum((s - mbar) ** 2 for s in cluster_sizes) / (k - 1)\n    cv2 = var / mbar ** 2\n    deff = 1 + ((cv2 + 1) * mbar - 1) * icc\n    return [round(deff, 6), round(total / deff, 6), math.ceil(n_required * deff / mbar)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 1', [[40, 20, 40, 20, 20, 40], 0.01, 500], [1.323333, 136.020151, 23]),\n  ('cluster sample 2', [[3, 10, 10, 20], 0.05, 1000], [1.65814, 25.932679, 155]),\n  ('cluster sample 3', [[40, 10, 5], 0.01, 500], [1.303636, 42.189679, 36]),\n  ('cluster sample 4', [[20, 10, 20, 5, 5, 3], 0.2, 100], [3.844444, 16.387283, 37])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 8', [[5, 5, 3, 5], 0.2, 1000], [1.733333, 10.384615, 386]),\n  ('cluster sample 9', [[5, 5, 10, 40, 20, 20], 0.2, 100], [5.9, 16.949153, 36]),\n  ('cluster sample 12', [[40, 5, 10, 3, 40, 3], 0.0, 100], [1.0, 101.0, 6]),\n  ('cluster sample 13', [[3, 3], 0.2, 500], [1.4, 4.285714, 234])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 15', [[40, 20, 20, 10], 0.0, 100], [1.0, 90.0, 5]),\n  ('cluster sample 16', [[3, 20, 10, 5, 10, 40], 0.0, 500], [1.0, 88.0, 35]),\n  ('cluster sample 17', [[20, 40, 3, 20, 5], 0.05, 100], [2.332955, 37.720409, 14]),\n  ('cluster sample 24', [[5, 10], 0.2, 100], [2.466667, 6.081081, 33])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 21', [[40, 10, 5], 0.05, 100], [2.518182, 21.841155, 14]),\n  ('cluster sample 23', [[40, 5, 40], 0.01, 100], [1.369412, 62.070447, 5]),\n  ('cluster sample 24', [[5, 10], 0.2, 100], [2.466667, 6.081081, 33]),\n  ('cluster sample 39', [[5, 10], 0.01, 500], [1.073333, 13.975155, 72])],\n [('unequal cluster sizes inflate the design effect', [[5, 10, 20, 45], 0.05, 500], [2.54375, 31.449631, 64]),\n  ('equal clusters', [[10, 10, 10], 0.1, 300], [1.9, 15.789474, 57]),\n  ('zero icc means no inflation', [[3, 40], 0.0, 100], [1.0, 43.0, 5]),\n  ('small clusters', [[2, 4], 0.3, 50], [1.7, 3.529412, 29]),\n  ('cluster sample 29', [[3, 40, 40, 40], 0.01, 500], [1.380976, 89.067467, 23]),\n  ('cluster sample 30', [[3, 5, 3, 20, 10], 0.0, 1000], [1.0, 41.0, 122]),\n  ('cluster sample 31', [[10, 20, 5], 0.0, 1000], [1.0, 35.0, 86]),\n  ('cluster sample 49', [[20, 10, 20, 20, 10, 3], 0.01, 1000], [1.159759, 71.56659, 84])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic toy experiment-analysis model with a stipulated contract; results are rounded and are not a substitute for a validated statistics package. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-experiment-statistics-cluster-design-effect-size-variance-divisor","generated_at":"2026-09-29T14:48:59.416117+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"B2B experiments randomise by account; ignoring clustering makes results look far more certain.","root_cause":"The spread of cluster sizes divides by k - 1 instead of k.","sha256":"932183e1542a82d769226e0b47ac851df2d7bb26c3bd5a451aaf2cd1929a1e3e","title":"Cluster randomisation design effect: Cluster size variance uses a sample divisor · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":38.002,"exit_code":1,"observations":[{"actual":[2.425,32.989691,61],"check":"unequal cluster sizes inflate the design effect","expected":[2.54375,31.449631,64],"passed":false},{"actual":[1.9,15.789474,57],"check":"equal clusters","expected":[1.9,15.789474,57],"passed":true},{"actual":[1.0,43.0,5],"check":"zero icc means no inflation","expected":[1.0,43.0,5],"passed":true},{"actual":[1.666667,3.6,28],"check":"small clusters","expected":[1.7,3.529412,29],"passed":false},{"actual":[1.318571,136.511376,22],"check":"cluster sample 1","expected":[1.323333,136.020151,23],"passed":false},{"actual":[1.624012,26.477643,152],"check":"cluster sample 2","expected":[1.65814,25.932679,155],"passed":false},{"actual":[1.271061,43.27095,35],"check":"cluster sample 3","expected":[1.303636,42.189679,36],"passed":false},{"actual":[3.709524,16.983312,36],"check":"cluster sample 4","expected":[3.844444,16.387283,37],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"unequal cluster sizes inflate the design effect\", \"actual\": [2.425, 32.989691, 61], \"expected\": [2.54375, 31.449631, 64], \"passed\": false}, {\"check\": \"equal clusters\", \"actual\": [1.9, 15.789474, 57], \"expected\": [1.9, 15.789474, 57], \"passed\": true}, {\"check\": \"zero icc means no inflation\", \"actual\": [1.0, 43.0, 5], \"expected\": [1.0, 43.0, 5], \"passed\": true}, {\"check\": \"small clusters\", \"actual\": [1.666667, 3.6, 28], \"expected\": [1.7, 3.529412, 29], \"passed\": false}, {\"check\": \"cluster sample 1\", \"actual\": [1.318571, 136.511376, 22], \"expected\": [1.323333, 136.020151, 23], \"passed\": false}, {\"check\": \"cluster sample 2\", \"actual\": [1.624012, 26.477643, 152], \"expected\": [1.65814, 25.932679, 155], \"passed\": false}, {\"check\": \"cluster sample 3\", \"actual\": [1.271061, 43.27095, 35], \"expected\": [1.303636, 42.189679, 36], \"passed\": false}, {\"check\": \"cluster sample 4\", \"actual\": [3.709524, 16.983312, 36], \"expected\": [3.844444, 16.387283, 37], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.324,"exit_code":1,"observations":[{"actual":[2.741667,29.179331,69],"check":"unequal cluster sizes inflate the design effect","expected":[2.54375,31.449631,64],"passed":false},{"actual":[1.9,15.789474,57],"check":"equal clusters","expected":[1.9,15.789474,57],"passed":true},{"actual":[1.0,43.0,5],"check":"zero icc means no inflation","expected":[1.0,43.0,5],"passed":true},{"actual":[1.8,3.333333,30],"check":"small clusters","expected":[1.7,3.529412,29],"passed":false},{"actual":[1.33,135.338346,23],"check":"cluster sample 1","expected":[1.323333,136.020151,23],"passed":false},{"actual":[1.715019,25.072603,160],"check":"cluster sample 2","expected":[1.65814,25.932679,155],"passed":false},{"actual":[1.368788,40.181536,38],"check":"cluster sample 3","expected":[1.303636,42.189679,36],"passed":false},{"actual":[4.033333,15.619835,39],"check":"cluster sample 4","expected":[3.844444,16.387283,37],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"unequal cluster sizes inflate the design effect\", \"actual\": [2.741667, 29.179331, 69], \"expected\": [2.54375, 31.449631, 64], \"passed\": false}, {\"check\": \"equal clusters\", \"actual\": [1.9, 15.789474, 57], \"expected\": [1.9, 15.789474, 57], \"passed\": true}, {\"check\": \"zero icc means no inflation\", \"actual\": [1.0, 43.0, 5], \"expected\": [1.0, 43.0, 5], \"passed\": true}, {\"check\": \"small clusters\", \"actual\": [1.8, 3.333333, 30], \"expected\": [1.7, 3.529412, 29], \"passed\": false}, {\"check\": \"cluster sample 1\", \"actual\": [1.33, 135.338346, 23], \"expected\": [1.323333, 136.020151, 23], \"passed\": false}, {\"check\": \"cluster sample 2\", \"actual\": [1.715019, 25.072603, 160], \"expected\": [1.65814, 25.932679, 155], \"passed\": false}, {\"check\": \"cluster sample 3\", \"actual\": [1.368788, 40.181536, 38], \"expected\": [1.303636, 42.189679, 36], \"passed\": false}, {\"check\": \"cluster sample 4\", \"actual\": [4.033333, 15.619835, 39], \"expected\": [3.844444, 16.387283, 37], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}