{"abstract":"Humidex is about 5.5 degrees too high on every reading.","category":"Weather index computation","checks":8,"contract":"Input air temperature and dew point in degC. If dew point exceeds air temperature return None. e = 6.11*exp(5417.7530*(1/273.16 - 1/(273.15+Td))); H = T + 0.5555*(e - 10); report the humidex rounded half up to an integer and a band on that integer: <30 comfortable, 30-39 some discomfort, 40-45 great discomfort, 46-53 dangerous, >=54 heat stroke imminent.","evaluation_group":"w2-weather_index_computation-humidex","failed_approach":"Subtracting the saturation constant 6.11 still leaves a positive bias.","family":"w2-weather_index_computation-humidex-vapour-pressure-offset","id":"FA-70921","implementations":{"attempt":{"sha256":"93ebfe6c3c867bf96344418418d59e2fc50e04674d21e76e4d5753132f7e4980","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(t_c, td_c):\n    if td_c > t_c:\n        return None\n    e = 6.11 * math.exp(5417.7530 * (1 / 273.16 - 1 / (273.15 + td_c)))\n    h = t_c + 0.5555 * (e - 6.11)\n    hx = int(math.floor(h + 0.5))\n    if hx < 30:\n        band = \"comfortable\"\n    elif hx <= 39:\n        band = \"some discomfort\"\n    elif hx <= 45:\n        band = \"great discomfort\"\n    elif hx <= 53:\n        band = \"dangerous\"\n    else:\n        band = \"heat stroke imminent\"\n    return [hx, band]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['air 20 C dew point 5 C', [20, 5], [19, 'comfortable']], ['air 20 C dew point 12 C', [20, 12], [22, 'comfortable']], ['air 20 C dew point 18 C', [20, 18], [26, 'comfortable']], ['air 20 C dew point 20 C', [20, 20], [28, 'comfortable']], ['air 20 C dew point 22 C', [20, 22], None], ['air 20 C dew point 24 C', [20, 24], None], ['air 20 C dew point 26 C', [20, 26], None], ['air 20 C dew point 28 C', [20, 28], None]], [['air 20 C dew point 20 C', [20, 20], [28, 'comfortable']], ['air 20 C dew point 28 C', [20, 28], None], ['air 20 C dew point 30 C', [20, 30], None], ['air 20 C dew point 36 C', [20, 36], None], ['air 20 C dew point 41 C', [20, 41], None], ['air 25 C dew point 5 C', [25, 5], [24, 'comfortable']], ['air 25 C dew point 12 C', [25, 12], [27, 'comfortable']], ['air 25 C dew point 18 C', [25, 18], [31, 'some discomfort']]], [['air 25 C dew point 18 C', [25, 18], [31, 'some discomfort']], ['air 25 C dew point 20 C', [25, 20], [33, 'some discomfort']], ['air 25 C dew point 22 C', [25, 22], [34, 'some discomfort']], ['air 25 C dew point 24 C', [25, 24], [36, 'some discomfort']], ['air 25 C dew point 26 C', [25, 26], None], ['air 25 C dew point 28 C', [25, 28], None], ['air 25 C dew point 30 C', [25, 30], None], ['air 28 C dew point 12 C', [28, 12], [30, 'some discomfort']]], [['air 25 C dew point 24 C', [25, 24], [36, 'some discomfort']], ['air 25 C dew point 41 C', [25, 41], None], ['air 28 C dew point 5 C', [28, 5], [27, 'comfortable']], ['air 28 C dew point 12 C', [28, 12], [30, 'some discomfort']], ['air 28 C dew point 18 C', [28, 18], [34, 'some discomfort']], ['air 28 C dew point 20 C', [28, 20], [36, 'some discomfort']], ['air 28 C dew point 22 C', [28, 22], [37, 'some discomfort']], ['air 28 C dew point 26 C', [28, 26], [41, 'great discomfort']]], [['air 28 C dew point 18 C', [28, 18], [34, 'some discomfort']], ['air 28 C dew point 26 C', [28, 26], [41, 'great discomfort']], ['air 28 C dew point 28 C', [28, 28], [44, 'great discomfort']], ['air 28 C dew point 30 C', [28, 30], None], ['air 28 C dew point 36 C', [28, 36], None], ['air 28 C dew point 41 C', [28, 41], None], ['air 30 C dew point 5 C', [30, 5], [29, 'comfortable']], ['air 30 C dew point 20 C', [30, 20], [38, 'some discomfort']]]]\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":"6c43bd6e5314867b97f11a6af6b95ab702a5b1b3279e192c89cb0df26e30ddfb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(t_c, td_c):\n    if td_c > t_c:\n        return None\n    e = 6.11 * math.exp(5417.7530 * (1 / 273.16 - 1 / (273.15 + td_c)))\n    h = t_c + 0.5555 * (e)\n    hx = int(math.floor(h + 0.5))\n    if hx < 30:\n        band = \"comfortable\"\n    elif hx <= 39:\n        band = \"some discomfort\"\n    elif hx <= 45:\n        band = \"great discomfort\"\n    elif hx <= 53:\n        band = \"dangerous\"\n    else:\n        band = \"heat stroke imminent\"\n    return [hx, band]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['air 20 C dew point 5 C', [20, 5], [19, 'comfortable']], ['air 20 C dew point 12 C', [20, 12], [22, 'comfortable']], ['air 20 C dew point 18 C', [20, 18], [26, 'comfortable']], ['air 20 C dew point 20 C', [20, 20], [28, 'comfortable']], ['air 20 C dew point 22 C', [20, 22], None], ['air 20 C dew point 24 C', [20, 24], None], ['air 20 C dew point 26 C', [20, 26], None], ['air 20 C dew point 28 C', [20, 28], None]], [['air 20 C dew point 20 C', [20, 20], [28, 'comfortable']], ['air 20 C dew point 28 C', [20, 28], None], ['air 20 C dew point 30 C', [20, 30], None], ['air 20 C dew point 36 C', [20, 36], None], ['air 20 C dew point 41 C', [20, 41], None], ['air 25 C dew point 5 C', [25, 5], [24, 'comfortable']], ['air 25 C dew point 12 C', [25, 12], [27, 'comfortable']], ['air 25 C dew point 18 C', [25, 18], [31, 'some discomfort']]], [['air 25 C dew point 18 C', [25, 18], [31, 'some discomfort']], ['air 25 C dew point 20 C', [25, 20], [33, 'some discomfort']], ['air 25 C dew point 22 C', [25, 22], [34, 'some discomfort']], ['air 25 C dew point 24 C', [25, 24], [36, 'some discomfort']], ['air 25 C dew point 26 C', [25, 26], None], ['air 25 C dew point 28 C', [25, 28], None], ['air 25 C dew point 30 C', [25, 30], None], ['air 28 C dew point 12 C', [28, 12], [30, 'some discomfort']]], [['air 25 C dew point 24 C', [25, 24], [36, 'some discomfort']], ['air 25 C dew point 41 C', [25, 41], None], ['air 28 C dew point 5 C', [28, 5], [27, 'comfortable']], ['air 28 C dew point 12 C', [28, 12], [30, 'some discomfort']], ['air 28 C dew point 18 C', [28, 18], [34, 'some discomfort']], ['air 28 C dew point 20 C', [28, 20], [36, 'some discomfort']], ['air 28 C dew point 22 C', [28, 22], [37, 'some discomfort']], ['air 28 C dew point 26 C', [28, 26], [41, 'great discomfort']]], [['air 28 C dew point 18 C', [28, 18], [34, 'some discomfort']], ['air 28 C dew point 26 C', [28, 26], [41, 'great discomfort']], ['air 28 C dew point 28 C', [28, 28], [44, 'great discomfort']], ['air 28 C dew point 30 C', [28, 30], None], ['air 28 C dew point 36 C', [28, 36], None], ['air 28 C dew point 41 C', [28, 41], None], ['air 30 C dew point 5 C', [30, 5], [29, 'comfortable']], ['air 30 C dew point 20 C', [30, 20], [38, 'some discomfort']]]]\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"},"fixed":{"sha256":"7c092745fe06886276c81493e203473a8be9e66193d4c03e840015e5163bf0e7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(t_c, td_c):\n    if td_c > t_c:\n        return None\n    e = 6.11 * math.exp(5417.7530 * (1 / 273.16 - 1 / (273.15 + td_c)))\n    h = t_c + 0.5555 * (e - 10.0)\n    hx = int(math.floor(h + 0.5))\n    if hx < 30:\n        band = \"comfortable\"\n    elif hx <= 39:\n        band = \"some discomfort\"\n    elif hx <= 45:\n        band = \"great discomfort\"\n    elif hx <= 53:\n        band = \"dangerous\"\n    else:\n        band = \"heat stroke imminent\"\n    return [hx, band]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['air 20 C dew point 5 C', [20, 5], [19, 'comfortable']], ['air 20 C dew point 12 C', [20, 12], [22, 'comfortable']], ['air 20 C dew point 18 C', [20, 18], [26, 'comfortable']], ['air 20 C dew point 20 C', [20, 20], [28, 'comfortable']], ['air 20 C dew point 22 C', [20, 22], None], ['air 20 C dew point 24 C', [20, 24], None], ['air 20 C dew point 26 C', [20, 26], None], ['air 20 C dew point 28 C', [20, 28], None]], [['air 20 C dew point 20 C', [20, 20], [28, 'comfortable']], ['air 20 C dew point 28 C', [20, 28], None], ['air 20 C dew point 30 C', [20, 30], None], ['air 20 C dew point 36 C', [20, 36], None], ['air 20 C dew point 41 C', [20, 41], None], ['air 25 C dew point 5 C', [25, 5], [24, 'comfortable']], ['air 25 C dew point 12 C', [25, 12], [27, 'comfortable']], ['air 25 C dew point 18 C', [25, 18], [31, 'some discomfort']]], [['air 25 C dew point 18 C', [25, 18], [31, 'some discomfort']], ['air 25 C dew point 20 C', [25, 20], [33, 'some discomfort']], ['air 25 C dew point 22 C', [25, 22], [34, 'some discomfort']], ['air 25 C dew point 24 C', [25, 24], [36, 'some discomfort']], ['air 25 C dew point 26 C', [25, 26], None], ['air 25 C dew point 28 C', [25, 28], None], ['air 25 C dew point 30 C', [25, 30], None], ['air 28 C dew point 12 C', [28, 12], [30, 'some discomfort']]], [['air 25 C dew point 24 C', [25, 24], [36, 'some discomfort']], ['air 25 C dew point 41 C', [25, 41], None], ['air 28 C dew point 5 C', [28, 5], [27, 'comfortable']], ['air 28 C dew point 12 C', [28, 12], [30, 'some discomfort']], ['air 28 C dew point 18 C', [28, 18], [34, 'some discomfort']], ['air 28 C dew point 20 C', [28, 20], [36, 'some discomfort']], ['air 28 C dew point 22 C', [28, 22], [37, 'some discomfort']], ['air 28 C dew point 26 C', [28, 26], [41, 'great discomfort']]], [['air 28 C dew point 18 C', [28, 18], [34, 'some discomfort']], ['air 28 C dew point 26 C', [28, 26], [41, 'great discomfort']], ['air 28 C dew point 28 C', [28, 28], [44, 'great discomfort']], ['air 28 C dew point 30 C', [28, 30], None], ['air 28 C dew point 36 C', [28, 36], None], ['air 28 C dew point 41 C', [28, 41], None], ['air 30 C dew point 5 C', [30, 5], [29, 'comfortable']], ['air 30 C dew point 20 C', [30, 20], [38, 'some discomfort']]]]\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":"Stipulated deterministic teaching model of an operational weather index; coefficients and thresholds are fixed by the contract and no claim of standards conformance is made. 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-weather_index_computation-humidex-vapour-pressure-offset","generated_at":"2026-09-29T14:48:25.067723+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Summer heat bulletins publish humidex with a discomfort band.","repair":"Use 0.5555*(e - 10).","root_cause":"The 10 hPa reference vapour pressure is not subtracted.","sha256":"f6bee5397c01a8be881b91bfce176e6270ce04d1d2709eb0701f8dca0f4a1f70","title":"Humidex with discomfort band: vapour pressure offset · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.883,"exit_code":1,"observations":[{"actual":[21,"comfortable"],"check":"air 20 C dew point 5 C","expected":[19,"comfortable"],"passed":false},{"actual":[24,"comfortable"],"check":"air 20 C dew point 12 C","expected":[22,"comfortable"],"passed":false},{"actual":[28,"comfortable"],"check":"air 20 C dew point 18 C","expected":[26,"comfortable"],"passed":false},{"actual":[30,"some discomfort"],"check":"air 20 C dew point 20 C","expected":[28,"comfortable"],"passed":false},{"actual":null,"check":"air 20 C dew point 22 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 24 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 26 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 28 C","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"air 20 C dew point 5 C\", \"actual\": [21, \"comfortable\"], \"expected\": [19, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 12 C\", \"actual\": [24, \"comfortable\"], \"expected\": [22, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 18 C\", \"actual\": [28, \"comfortable\"], \"expected\": [26, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 20 C\", \"actual\": [30, \"some discomfort\"], \"expected\": [28, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 22 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 24 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 26 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 28 C\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.483,"exit_code":1,"observations":[{"actual":[25,"comfortable"],"check":"air 20 C dew point 5 C","expected":[19,"comfortable"],"passed":false},{"actual":[28,"comfortable"],"check":"air 20 C dew point 12 C","expected":[22,"comfortable"],"passed":false},{"actual":[32,"some discomfort"],"check":"air 20 C dew point 18 C","expected":[26,"comfortable"],"passed":false},{"actual":[33,"some discomfort"],"check":"air 20 C dew point 20 C","expected":[28,"comfortable"],"passed":false},{"actual":null,"check":"air 20 C dew point 22 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 24 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 26 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 28 C","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"air 20 C dew point 5 C\", \"actual\": [25, \"comfortable\"], \"expected\": [19, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 12 C\", \"actual\": [28, \"comfortable\"], \"expected\": [22, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 18 C\", \"actual\": [32, \"some discomfort\"], \"expected\": [26, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 20 C\", \"actual\": [33, \"some discomfort\"], \"expected\": [28, \"comfortable\"], \"passed\": false}, {\"check\": \"air 20 C dew point 22 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 24 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 26 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 28 C\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.726,"exit_code":0,"observations":[{"actual":[19,"comfortable"],"check":"air 20 C dew point 5 C","expected":[19,"comfortable"],"passed":true},{"actual":[22,"comfortable"],"check":"air 20 C dew point 12 C","expected":[22,"comfortable"],"passed":true},{"actual":[26,"comfortable"],"check":"air 20 C dew point 18 C","expected":[26,"comfortable"],"passed":true},{"actual":[28,"comfortable"],"check":"air 20 C dew point 20 C","expected":[28,"comfortable"],"passed":true},{"actual":null,"check":"air 20 C dew point 22 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 24 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 26 C","expected":null,"passed":true},{"actual":null,"check":"air 20 C dew point 28 C","expected":null,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"air 20 C dew point 5 C\", \"actual\": [19, \"comfortable\"], \"expected\": [19, \"comfortable\"], \"passed\": true}, {\"check\": \"air 20 C dew point 12 C\", \"actual\": [22, \"comfortable\"], \"expected\": [22, \"comfortable\"], \"passed\": true}, {\"check\": \"air 20 C dew point 18 C\", \"actual\": [26, \"comfortable\"], \"expected\": [26, \"comfortable\"], \"passed\": true}, {\"check\": \"air 20 C dew point 20 C\", \"actual\": [28, \"comfortable\"], \"expected\": [28, \"comfortable\"], \"passed\": true}, {\"check\": \"air 20 C dew point 22 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 24 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 26 C\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"air 20 C dew point 28 C\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}