{"abstract":"Tropical 88 to 97 degF readings with RH above 85 are pulled down by a negative humid correction.","category":"Weather index computation","checks":8,"contract":"Input dry-bulb temperature in degF and relative humidity in percent. Compute the simple Steadman estimate 0.5*(T+61+1.2*(T-68)+0.094*RH); if the mean of that estimate and T is below 80 return it, otherwise use the Rothfusz regression with the dry adjustment (RH<13, 80<=T<=112) or the humid adjustment (RH>85, 80<=T<=87). Round to 0.1 degF.","evaluation_group":"w2-weather_index_computation-heat-index","failed_approach":"Widening the lower edge to 75 degF corrects hot air but adjusts sub-80 degF air that already uses the regression.","family":"w2-weather_index_computation-heat-index-humid-adjustment-window","id":"FA-70856","implementations":{"attempt":{"sha256":"5314b9229245e21b0e3bdd2b72ba025af6e62199e45c6d895c6f35aae4bb6d2e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(t_f, rh):\n    simple = 0.5 * (t_f + 61.0 + (t_f - 68.0) * 1.2 + rh * 0.094)\n    if (simple + t_f) / 2 < 80:\n        return round(simple, 1)\n    hi = (-42.379 + 2.04901523 * t_f + 10.14333127 * rh - 0.22475541 * t_f * rh\n          - 0.00683783 * t_f * t_f - 0.05481717 * rh * rh + 0.00122874 * t_f * t_f * rh\n          + 0.00085282 * t_f * rh * rh - 0.00000199 * t_f * t_f * rh * rh)\n    if rh < 13 and 80 <= t_f <= 112:\n        hi -= ((13 - rh) / 4) * math.sqrt((17 - abs(t_f - 95)) / 17)\n    elif rh > 85 and 75 <= t_f <= 87:\n        hi += ((rh - 85) / 10) * ((87 - t_f) / 5)\n    return round(hi, 1)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['70F at 0% RH', [70, 0], 66.7], ['70F at 5% RH', [70, 5], 66.9], ['70F at 10% RH', [70, 10], 67.2], ['70F at 12% RH', [70, 12], 67.3], ['70F at 13% RH', [70, 13], 67.3], ['70F at 40% RH', [70, 40], 68.6], ['79F at 100% RH', [79, 100], 83.8], ['88F at 90% RH', [88, 90], 113.2]], [['70F at 85% RH', [70, 85], 70.7], ['70F at 86% RH', [70, 86], 70.7], ['70F at 90% RH', [70, 90], 70.9], ['70F at 95% RH', [70, 95], 71.2], ['70F at 100% RH', [70, 100], 71.4], ['76F at 0% RH', [76, 0], 73.3], ['79F at 95% RH', [79, 95], 83.4], ['90F at 90% RH', [90, 90], 121.9]], [['76F at 10% RH', [76, 10], 73.8], ['76F at 12% RH', [76, 12], 73.9], ['76F at 13% RH', [76, 13], 73.9], ['76F at 40% RH', [76, 40], 75.2], ['76F at 60% RH', [76, 60], 76.1], ['76F at 85% RH', [76, 85], 77.3], ['79.5F at 100% RH', [79.5, 100], 85.5], ['94F at 86% RH', [94, 86], 136.4]], [['76F at 90% RH', [76, 90], 77.5], ['76F at 95% RH', [76, 95], 77.8], ['76F at 100% RH', [76, 100], 78.0], ['79F at 0% RH', [79, 0], 76.6], ['79F at 5% RH', [79, 5], 76.8], ['79F at 10% RH', [79, 10], 77.1], ['79.5F at 95% RH', [79.5, 95], 84.9], ['94F at 100% RH', [94, 100], 154.8]], [['79F at 13% RH', [79, 13], 77.2], ['79F at 40% RH', [79, 40], 78.5], ['79F at 60% RH', [79, 60], 79.4], ['79F at 85% RH', [79, 85], 80.6], ['79F at 86% RH', [79, 86], 80.6], ['79F at 90% RH', [79, 90], 80.8], ['79.5F at 90% RH', [79.5, 90], 84.3], ['95F at 95% RH', [95, 95], 153.6]]]\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":"193578981db0bba26e0adea0cfe57cb2a534284ebdf0ec057fd723a1b4dd60e9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(t_f, rh):\n    simple = 0.5 * (t_f + 61.0 + (t_f - 68.0) * 1.2 + rh * 0.094)\n    if (simple + t_f) / 2 < 80:\n        return round(simple, 1)\n    hi = (-42.379 + 2.04901523 * t_f + 10.14333127 * rh - 0.22475541 * t_f * rh\n          - 0.00683783 * t_f * t_f - 0.05481717 * rh * rh + 0.00122874 * t_f * t_f * rh\n          + 0.00085282 * t_f * rh * rh - 0.00000199 * t_f * t_f * rh * rh)\n    if rh < 13 and 80 <= t_f <= 112:\n        hi -= ((13 - rh) / 4) * math.sqrt((17 - abs(t_f - 95)) / 17)\n    elif rh > 85 and 80 <= t_f <= 97:\n        hi += ((rh - 85) / 10) * ((87 - t_f) / 5)\n    return round(hi, 1)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['70F at 0% RH', [70, 0], 66.7], ['70F at 5% RH', [70, 5], 66.9], ['70F at 10% RH', [70, 10], 67.2], ['70F at 12% RH', [70, 12], 67.3], ['70F at 13% RH', [70, 13], 67.3], ['70F at 40% RH', [70, 40], 68.6], ['79F at 100% RH', [79, 100], 83.8], ['88F at 90% RH', [88, 90], 113.2]], [['70F at 85% RH', [70, 85], 70.7], ['70F at 86% RH', [70, 86], 70.7], ['70F at 90% RH', [70, 90], 70.9], ['70F at 95% RH', [70, 95], 71.2], ['70F at 100% RH', [70, 100], 71.4], ['76F at 0% RH', [76, 0], 73.3], ['79F at 95% RH', [79, 95], 83.4], ['90F at 90% RH', [90, 90], 121.9]], [['76F at 10% RH', [76, 10], 73.8], ['76F at 12% RH', [76, 12], 73.9], ['76F at 13% RH', [76, 13], 73.9], ['76F at 40% RH', [76, 40], 75.2], ['76F at 60% RH', [76, 60], 76.1], ['76F at 85% RH', [76, 85], 77.3], ['79.5F at 100% RH', [79.5, 100], 85.5], ['94F at 86% RH', [94, 86], 136.4]], [['76F at 90% RH', [76, 90], 77.5], ['76F at 95% RH', [76, 95], 77.8], ['76F at 100% RH', [76, 100], 78.0], ['79F at 0% RH', [79, 0], 76.6], ['79F at 5% RH', [79, 5], 76.8], ['79F at 10% RH', [79, 10], 77.1], ['79.5F at 95% RH', [79.5, 95], 84.9], ['94F at 100% RH', [94, 100], 154.8]], [['79F at 13% RH', [79, 13], 77.2], ['79F at 40% RH', [79, 40], 78.5], ['79F at 60% RH', [79, 60], 79.4], ['79F at 85% RH', [79, 85], 80.6], ['79F at 86% RH', [79, 86], 80.6], ['79F at 90% RH', [79, 90], 80.8], ['79.5F at 90% RH', [79.5, 90], 84.3], ['95F at 95% RH', [95, 95], 153.6]]]\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":"740ae7939c9d176c3cba3a34e399dc4b785a2f4662abd06aefbe3b620cbfa24d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(t_f, rh):\n    simple = 0.5 * (t_f + 61.0 + (t_f - 68.0) * 1.2 + rh * 0.094)\n    if (simple + t_f) / 2 < 80:\n        return round(simple, 1)\n    hi = (-42.379 + 2.04901523 * t_f + 10.14333127 * rh - 0.22475541 * t_f * rh\n          - 0.00683783 * t_f * t_f - 0.05481717 * rh * rh + 0.00122874 * t_f * t_f * rh\n          + 0.00085282 * t_f * rh * rh - 0.00000199 * t_f * t_f * rh * rh)\n    if rh < 13 and 80 <= t_f <= 112:\n        hi -= ((13 - rh) / 4) * math.sqrt((17 - abs(t_f - 95)) / 17)\n    elif rh > 85 and 80 <= t_f <= 87:\n        hi += ((rh - 85) / 10) * ((87 - t_f) / 5)\n    return round(hi, 1)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['70F at 0% RH', [70, 0], 66.7], ['70F at 5% RH', [70, 5], 66.9], ['70F at 10% RH', [70, 10], 67.2], ['70F at 12% RH', [70, 12], 67.3], ['70F at 13% RH', [70, 13], 67.3], ['70F at 40% RH', [70, 40], 68.6], ['79F at 100% RH', [79, 100], 83.8], ['88F at 90% RH', [88, 90], 113.2]], [['70F at 85% RH', [70, 85], 70.7], ['70F at 86% RH', [70, 86], 70.7], ['70F at 90% RH', [70, 90], 70.9], ['70F at 95% RH', [70, 95], 71.2], ['70F at 100% RH', [70, 100], 71.4], ['76F at 0% RH', [76, 0], 73.3], ['79F at 95% RH', [79, 95], 83.4], ['90F at 90% RH', [90, 90], 121.9]], [['76F at 10% RH', [76, 10], 73.8], ['76F at 12% RH', [76, 12], 73.9], ['76F at 13% RH', [76, 13], 73.9], ['76F at 40% RH', [76, 40], 75.2], ['76F at 60% RH', [76, 60], 76.1], ['76F at 85% RH', [76, 85], 77.3], ['79.5F at 100% RH', [79.5, 100], 85.5], ['94F at 86% RH', [94, 86], 136.4]], [['76F at 90% RH', [76, 90], 77.5], ['76F at 95% RH', [76, 95], 77.8], ['76F at 100% RH', [76, 100], 78.0], ['79F at 0% RH', [79, 0], 76.6], ['79F at 5% RH', [79, 5], 76.8], ['79F at 10% RH', [79, 10], 77.1], ['79.5F at 95% RH', [79.5, 95], 84.9], ['94F at 100% RH', [94, 100], 154.8]], [['79F at 13% RH', [79, 13], 77.2], ['79F at 40% RH', [79, 40], 78.5], ['79F at 60% RH', [79, 60], 79.4], ['79F at 85% RH', [79, 85], 80.6], ['79F at 86% RH', [79, 86], 80.6], ['79F at 90% RH', [79, 90], 80.8], ['79.5F at 90% RH', [79.5, 90], 84.3], ['95F at 95% RH', [95, 95], 153.6]]]\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-heat-index-humid-adjustment-window","generated_at":"2026-09-29T14:48:24.513376+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Heat advisories are issued from this value; a wrong branch changes public warnings.","repair":"Apply the humid correction only for 80 <= T <= 87.","root_cause":"The humid-correction temperature window extends to 97 degF, where (87 - T) becomes negative.","sha256":"acac87d406f7a0a5af8afab32ddf34770646ae6530c65b1de6e9c50610c5ca57","title":"Heat index regression: humid adjustment window · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.51,"exit_code":1,"observations":[{"actual":66.7,"check":"70F at 0% RH","expected":66.7,"passed":true},{"actual":66.9,"check":"70F at 5% RH","expected":66.9,"passed":true},{"actual":67.2,"check":"70F at 10% RH","expected":67.2,"passed":true},{"actual":67.3,"check":"70F at 12% RH","expected":67.3,"passed":true},{"actual":67.3,"check":"70F at 13% RH","expected":67.3,"passed":true},{"actual":68.6,"check":"70F at 40% RH","expected":68.6,"passed":true},{"actual":86.2,"check":"79F at 100% RH","expected":83.8,"passed":false},{"actual":113.2,"check":"88F at 90% RH","expected":113.2,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"70F at 0% RH\", \"actual\": 66.7, \"expected\": 66.7, \"passed\": true}, {\"check\": \"70F at 5% RH\", \"actual\": 66.9, \"expected\": 66.9, \"passed\": true}, {\"check\": \"70F at 10% RH\", \"actual\": 67.2, \"expected\": 67.2, \"passed\": true}, {\"check\": \"70F at 12% RH\", \"actual\": 67.3, \"expected\": 67.3, \"passed\": true}, {\"check\": \"70F at 13% RH\", \"actual\": 67.3, \"expected\": 67.3, \"passed\": true}, {\"check\": \"70F at 40% RH\", \"actual\": 68.6, \"expected\": 68.6, \"passed\": true}, {\"check\": \"79F at 100% RH\", \"actual\": 86.2, \"expected\": 83.8, \"passed\": false}, {\"check\": \"88F at 90% RH\", \"actual\": 113.2, \"expected\": 113.2, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.253,"exit_code":1,"observations":[{"actual":66.7,"check":"70F at 0% RH","expected":66.7,"passed":true},{"actual":66.9,"check":"70F at 5% RH","expected":66.9,"passed":true},{"actual":67.2,"check":"70F at 10% RH","expected":67.2,"passed":true},{"actual":67.3,"check":"70F at 12% RH","expected":67.3,"passed":true},{"actual":67.3,"check":"70F at 13% RH","expected":67.3,"passed":true},{"actual":68.6,"check":"70F at 40% RH","expected":68.6,"passed":true},{"actual":83.8,"check":"79F at 100% RH","expected":83.8,"passed":true},{"actual":113.1,"check":"88F at 90% RH","expected":113.2,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"70F at 0% RH\", \"actual\": 66.7, \"expected\": 66.7, \"passed\": true}, {\"check\": \"70F at 5% RH\", \"actual\": 66.9, \"expected\": 66.9, \"passed\": true}, {\"check\": \"70F at 10% RH\", \"actual\": 67.2, \"expected\": 67.2, \"passed\": true}, {\"check\": \"70F at 12% RH\", \"actual\": 67.3, \"expected\": 67.3, \"passed\": true}, {\"check\": \"70F at 13% RH\", \"actual\": 67.3, \"expected\": 67.3, \"passed\": true}, {\"check\": \"70F at 40% RH\", \"actual\": 68.6, \"expected\": 68.6, \"passed\": true}, {\"check\": \"79F at 100% RH\", \"actual\": 83.8, \"expected\": 83.8, \"passed\": true}, {\"check\": \"88F at 90% RH\", \"actual\": 113.1, \"expected\": 113.2, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.618,"exit_code":0,"observations":[{"actual":66.7,"check":"70F at 0% RH","expected":66.7,"passed":true},{"actual":66.9,"check":"70F at 5% RH","expected":66.9,"passed":true},{"actual":67.2,"check":"70F at 10% RH","expected":67.2,"passed":true},{"actual":67.3,"check":"70F at 12% RH","expected":67.3,"passed":true},{"actual":67.3,"check":"70F at 13% RH","expected":67.3,"passed":true},{"actual":68.6,"check":"70F at 40% RH","expected":68.6,"passed":true},{"actual":83.8,"check":"79F at 100% RH","expected":83.8,"passed":true},{"actual":113.2,"check":"88F at 90% RH","expected":113.2,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"70F at 0% RH\", \"actual\": 66.7, \"expected\": 66.7, \"passed\": true}, {\"check\": \"70F at 5% RH\", \"actual\": 66.9, \"expected\": 66.9, \"passed\": true}, {\"check\": \"70F at 10% RH\", \"actual\": 67.2, \"expected\": 67.2, \"passed\": true}, {\"check\": \"70F at 12% RH\", \"actual\": 67.3, \"expected\": 67.3, \"passed\": true}, {\"check\": \"70F at 13% RH\", \"actual\": 67.3, \"expected\": 67.3, \"passed\": true}, {\"check\": \"70F at 40% RH\", \"actual\": 68.6, \"expected\": 68.6, \"passed\": true}, {\"check\": \"79F at 100% RH\", \"actual\": 83.8, \"expected\": 83.8, \"passed\": true}, {\"check\": \"88F at 90% RH\", \"actual\": 113.2, \"expected\": 113.2, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}