{"abstract":"ET0 tracks the diurnal range instead of the air temperature.","category":"Weather index computation","checks":8,"contract":"Daily tmax/tmin degC (tmax >= tmin) and extraterrestrial radiation Ra in MJ/m2/day. Convert Ra to mm/day with 0.408. ET0 = 0.0023*Ra_mm*(Tmean+17.8)*sqrt(tmax-tmin), Tmean=(tmax+tmin)/2; negative results clamp to 0; round to 0.01 mm.","evaluation_group":"w2-weather_index_computation-hargreaves-et0","failed_approach":"Using tmax alone overstates the mean temperature.","family":"w2-weather_index_computation-hargreaves-et0-mean-temperature","id":"FA-71191","implementations":{"attempt":{"sha256":"6dfe50731259ee049f54e44e35ce9accfaa4085a085097b21e2f88b21c1b660a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(tmax, tmin, ra_mj):\n    tmean = tmax\n    et = 0.0023 * 0.408 * ra_mj * (tmean + 17.8) * math.sqrt(tmax - tmin)\n    return round(max(et, 0.0), 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['tmax 30 tmin 15 Ra 10.0', [30, 15, 10.0], 1.46], ['tmax 30 tmin 15 Ra 25.0', [30, 15, 25.0], 3.66], ['tmax 30 tmin 15 Ra 40.0', [30, 15, 40.0], 5.86], ['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 35 tmin 20 Ra 25.0', [35, 20, 25.0], 4.12], ['tmax 35 tmin 20 Ra 40.0', [35, 20, 40.0], 6.59], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax 10 tmin -2 Ra 25.0', [10, -2, 25.0], 1.77]], [['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax 10 tmin -2 Ra 25.0', [10, -2, 25.0], 1.77], ['tmax 10 tmin -2 Ra 40.0', [10, -2, 40.0], 2.83], ['tmax -10 tmin -25 Ra 10.0', [-10, -25, 10.0], 0.01], ['tmax -10 tmin -25 Ra 25.0', [-10, -25, 25.0], 0.03], ['tmax -10 tmin -25 Ra 40.0', [-10, -25, 40.0], 0.04], ['tmax -12 tmin -30 Ra 10.0', [-12, -30, 10.0], 0.0]], [['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax -10 tmin -25 Ra 40.0', [-10, -25, 40.0], 0.04], ['tmax -12 tmin -30 Ra 40.0', [-12, -30, 40.0], 0.0], ['tmax 25 tmin 25 Ra 10.0', [25, 25, 10.0], 0.0], ['tmax 25 tmin 25 Ra 25.0', [25, 25, 25.0], 0.0], ['tmax 25 tmin 25 Ra 40.0', [25, 25, 40.0], 0.0], ['tmax 40 tmin 18 Ra 10.0', [40, 18, 10.0], 2.06], ['tmax 40 tmin 18 Ra 25.0', [40, 18, 25.0], 5.15]], [['tmax -10 tmin -25 Ra 10.0', [-10, -25, 10.0], 0.01], ['tmax 40 tmin 18 Ra 25.0', [40, 18, 25.0], 5.15], ['tmax 22 tmin 8 Ra 10.0', [22, 8, 10.0], 1.15], ['tmax 22 tmin 8 Ra 25.0', [22, 8, 25.0], 2.88], ['tmax 22 tmin 8 Ra 40.0', [22, 8, 40.0], 4.61], ['tmax -5 tmin -20 Ra 10.0', [-5, -20, 10.0], 0.19], ['tmax -5 tmin -20 Ra 25.0', [-5, -20, 25.0], 0.48], ['tmax -5 tmin -20 Ra 40.0', [-5, -20, 40.0], 0.77]], [['tmax 30 tmin 15 Ra 25.0', [30, 15, 25.0], 3.66], ['tmax 30 tmin 15 Ra 40.0', [30, 15, 40.0], 5.86], ['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 35 tmin 20 Ra 25.0', [35, 20, 25.0], 4.12], ['tmax 35 tmin 20 Ra 40.0', [35, 20, 40.0], 6.59], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax -12 tmin -30 Ra 10.0', [-12, -30, 10.0], 0.0], ['tmax -5 tmin -20 Ra 10.0', [-5, -20, 10.0], 0.19]]]\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":"e4bab36c1d64e418edd2bb3f1868c5c4098414d6675685c6fcdb93ca1f55a13e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(tmax, tmin, ra_mj):\n    tmean = (tmax - tmin) / 2\n    et = 0.0023 * 0.408 * ra_mj * (tmean + 17.8) * math.sqrt(tmax - tmin)\n    return round(max(et, 0.0), 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['tmax 30 tmin 15 Ra 10.0', [30, 15, 10.0], 1.46], ['tmax 30 tmin 15 Ra 25.0', [30, 15, 25.0], 3.66], ['tmax 30 tmin 15 Ra 40.0', [30, 15, 40.0], 5.86], ['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 35 tmin 20 Ra 25.0', [35, 20, 25.0], 4.12], ['tmax 35 tmin 20 Ra 40.0', [35, 20, 40.0], 6.59], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax 10 tmin -2 Ra 25.0', [10, -2, 25.0], 1.77]], [['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax 10 tmin -2 Ra 25.0', [10, -2, 25.0], 1.77], ['tmax 10 tmin -2 Ra 40.0', [10, -2, 40.0], 2.83], ['tmax -10 tmin -25 Ra 10.0', [-10, -25, 10.0], 0.01], ['tmax -10 tmin -25 Ra 25.0', [-10, -25, 25.0], 0.03], ['tmax -10 tmin -25 Ra 40.0', [-10, -25, 40.0], 0.04], ['tmax -12 tmin -30 Ra 10.0', [-12, -30, 10.0], 0.0]], [['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax -10 tmin -25 Ra 40.0', [-10, -25, 40.0], 0.04], ['tmax -12 tmin -30 Ra 40.0', [-12, -30, 40.0], 0.0], ['tmax 25 tmin 25 Ra 10.0', [25, 25, 10.0], 0.0], ['tmax 25 tmin 25 Ra 25.0', [25, 25, 25.0], 0.0], ['tmax 25 tmin 25 Ra 40.0', [25, 25, 40.0], 0.0], ['tmax 40 tmin 18 Ra 10.0', [40, 18, 10.0], 2.06], ['tmax 40 tmin 18 Ra 25.0', [40, 18, 25.0], 5.15]], [['tmax -10 tmin -25 Ra 10.0', [-10, -25, 10.0], 0.01], ['tmax 40 tmin 18 Ra 25.0', [40, 18, 25.0], 5.15], ['tmax 22 tmin 8 Ra 10.0', [22, 8, 10.0], 1.15], ['tmax 22 tmin 8 Ra 25.0', [22, 8, 25.0], 2.88], ['tmax 22 tmin 8 Ra 40.0', [22, 8, 40.0], 4.61], ['tmax -5 tmin -20 Ra 10.0', [-5, -20, 10.0], 0.19], ['tmax -5 tmin -20 Ra 25.0', [-5, -20, 25.0], 0.48], ['tmax -5 tmin -20 Ra 40.0', [-5, -20, 40.0], 0.77]], [['tmax 30 tmin 15 Ra 25.0', [30, 15, 25.0], 3.66], ['tmax 30 tmin 15 Ra 40.0', [30, 15, 40.0], 5.86], ['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 35 tmin 20 Ra 25.0', [35, 20, 25.0], 4.12], ['tmax 35 tmin 20 Ra 40.0', [35, 20, 40.0], 6.59], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax -12 tmin -30 Ra 10.0', [-12, -30, 10.0], 0.0], ['tmax -5 tmin -20 Ra 10.0', [-5, -20, 10.0], 0.19]]]\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":"70c6d5b84a2df7811c3aed5ddb7ceb35cbcac277454fccb236d0775cc1049b1d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(tmax, tmin, ra_mj):\n    tmean = (tmax + tmin) / 2\n    et = 0.0023 * 0.408 * ra_mj * (tmean + 17.8) * math.sqrt(tmax - tmin)\n    return round(max(et, 0.0), 2)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['tmax 30 tmin 15 Ra 10.0', [30, 15, 10.0], 1.46], ['tmax 30 tmin 15 Ra 25.0', [30, 15, 25.0], 3.66], ['tmax 30 tmin 15 Ra 40.0', [30, 15, 40.0], 5.86], ['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 35 tmin 20 Ra 25.0', [35, 20, 25.0], 4.12], ['tmax 35 tmin 20 Ra 40.0', [35, 20, 40.0], 6.59], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax 10 tmin -2 Ra 25.0', [10, -2, 25.0], 1.77]], [['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax 10 tmin -2 Ra 25.0', [10, -2, 25.0], 1.77], ['tmax 10 tmin -2 Ra 40.0', [10, -2, 40.0], 2.83], ['tmax -10 tmin -25 Ra 10.0', [-10, -25, 10.0], 0.01], ['tmax -10 tmin -25 Ra 25.0', [-10, -25, 25.0], 0.03], ['tmax -10 tmin -25 Ra 40.0', [-10, -25, 40.0], 0.04], ['tmax -12 tmin -30 Ra 10.0', [-12, -30, 10.0], 0.0]], [['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax -10 tmin -25 Ra 40.0', [-10, -25, 40.0], 0.04], ['tmax -12 tmin -30 Ra 40.0', [-12, -30, 40.0], 0.0], ['tmax 25 tmin 25 Ra 10.0', [25, 25, 10.0], 0.0], ['tmax 25 tmin 25 Ra 25.0', [25, 25, 25.0], 0.0], ['tmax 25 tmin 25 Ra 40.0', [25, 25, 40.0], 0.0], ['tmax 40 tmin 18 Ra 10.0', [40, 18, 10.0], 2.06], ['tmax 40 tmin 18 Ra 25.0', [40, 18, 25.0], 5.15]], [['tmax -10 tmin -25 Ra 10.0', [-10, -25, 10.0], 0.01], ['tmax 40 tmin 18 Ra 25.0', [40, 18, 25.0], 5.15], ['tmax 22 tmin 8 Ra 10.0', [22, 8, 10.0], 1.15], ['tmax 22 tmin 8 Ra 25.0', [22, 8, 25.0], 2.88], ['tmax 22 tmin 8 Ra 40.0', [22, 8, 40.0], 4.61], ['tmax -5 tmin -20 Ra 10.0', [-5, -20, 10.0], 0.19], ['tmax -5 tmin -20 Ra 25.0', [-5, -20, 25.0], 0.48], ['tmax -5 tmin -20 Ra 40.0', [-5, -20, 40.0], 0.77]], [['tmax 30 tmin 15 Ra 25.0', [30, 15, 25.0], 3.66], ['tmax 30 tmin 15 Ra 40.0', [30, 15, 40.0], 5.86], ['tmax 35 tmin 20 Ra 10.0', [35, 20, 10.0], 1.65], ['tmax 35 tmin 20 Ra 25.0', [35, 20, 25.0], 4.12], ['tmax 35 tmin 20 Ra 40.0', [35, 20, 40.0], 6.59], ['tmax 10 tmin -2 Ra 10.0', [10, -2, 10.0], 0.71], ['tmax -12 tmin -30 Ra 10.0', [-12, -30, 10.0], 0.0], ['tmax -5 tmin -20 Ra 10.0', [-5, -20, 10.0], 0.19]]]\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-hargreaves-et0-mean-temperature","generated_at":"2026-09-29T14:48:27.457044+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Irrigation scheduling uses ET0 where full meteorological data are unavailable.","repair":"Tmean = (tmax + tmin)/2.","root_cause":"The daily mean is computed from the difference of the extremes.","sha256":"84461e66e5a3f93d1bb516416ea8d6ca5989cce637cbbc7ab3544534d015d47f","title":"Hargreaves reference evapotranspiration: mean temperature · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.622,"exit_code":1,"observations":[{"actual":1.74,"check":"tmax 30 tmin 15 Ra 10.0","expected":1.46,"passed":false},{"actual":4.34,"check":"tmax 30 tmin 15 Ra 25.0","expected":3.66,"passed":false},{"actual":6.95,"check":"tmax 30 tmin 15 Ra 40.0","expected":5.86,"passed":false},{"actual":1.92,"check":"tmax 35 tmin 20 Ra 10.0","expected":1.65,"passed":false},{"actual":4.8,"check":"tmax 35 tmin 20 Ra 25.0","expected":4.12,"passed":false},{"actual":7.68,"check":"tmax 35 tmin 20 Ra 40.0","expected":6.59,"passed":false},{"actual":0.9,"check":"tmax 10 tmin -2 Ra 10.0","expected":0.71,"passed":false},{"actual":2.26,"check":"tmax 10 tmin -2 Ra 25.0","expected":1.77,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tmax 30 tmin 15 Ra 10.0\", \"actual\": 1.74, \"expected\": 1.46, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 25.0\", \"actual\": 4.34, \"expected\": 3.66, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 40.0\", \"actual\": 6.95, \"expected\": 5.86, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 10.0\", \"actual\": 1.92, \"expected\": 1.65, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 25.0\", \"actual\": 4.8, \"expected\": 4.12, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 40.0\", \"actual\": 7.68, \"expected\": 6.59, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 10.0\", \"actual\": 0.9, \"expected\": 0.71, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 25.0\", \"actual\": 2.26, \"expected\": 1.77, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.283,"exit_code":1,"observations":[{"actual":0.92,"check":"tmax 30 tmin 15 Ra 10.0","expected":1.46,"passed":false},{"actual":2.3,"check":"tmax 30 tmin 15 Ra 25.0","expected":3.66,"passed":false},{"actual":3.68,"check":"tmax 30 tmin 15 Ra 40.0","expected":5.86,"passed":false},{"actual":0.92,"check":"tmax 35 tmin 20 Ra 10.0","expected":1.65,"passed":false},{"actual":2.3,"check":"tmax 35 tmin 20 Ra 25.0","expected":4.12,"passed":false},{"actual":3.68,"check":"tmax 35 tmin 20 Ra 40.0","expected":6.59,"passed":false},{"actual":0.77,"check":"tmax 10 tmin -2 Ra 10.0","expected":0.71,"passed":false},{"actual":1.93,"check":"tmax 10 tmin -2 Ra 25.0","expected":1.77,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tmax 30 tmin 15 Ra 10.0\", \"actual\": 0.92, \"expected\": 1.46, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 25.0\", \"actual\": 2.3, \"expected\": 3.66, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 40.0\", \"actual\": 3.68, \"expected\": 5.86, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 10.0\", \"actual\": 0.92, \"expected\": 1.65, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 25.0\", \"actual\": 2.3, \"expected\": 4.12, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 40.0\", \"actual\": 3.68, \"expected\": 6.59, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 10.0\", \"actual\": 0.77, \"expected\": 0.71, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 25.0\", \"actual\": 1.93, \"expected\": 1.77, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.306,"exit_code":0,"observations":[{"actual":1.46,"check":"tmax 30 tmin 15 Ra 10.0","expected":1.46,"passed":true},{"actual":3.66,"check":"tmax 30 tmin 15 Ra 25.0","expected":3.66,"passed":true},{"actual":5.86,"check":"tmax 30 tmin 15 Ra 40.0","expected":5.86,"passed":true},{"actual":1.65,"check":"tmax 35 tmin 20 Ra 10.0","expected":1.65,"passed":true},{"actual":4.12,"check":"tmax 35 tmin 20 Ra 25.0","expected":4.12,"passed":true},{"actual":6.59,"check":"tmax 35 tmin 20 Ra 40.0","expected":6.59,"passed":true},{"actual":0.71,"check":"tmax 10 tmin -2 Ra 10.0","expected":0.71,"passed":true},{"actual":1.77,"check":"tmax 10 tmin -2 Ra 25.0","expected":1.77,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tmax 30 tmin 15 Ra 10.0\", \"actual\": 1.46, \"expected\": 1.46, \"passed\": true}, {\"check\": \"tmax 30 tmin 15 Ra 25.0\", \"actual\": 3.66, \"expected\": 3.66, \"passed\": true}, {\"check\": \"tmax 30 tmin 15 Ra 40.0\", \"actual\": 5.86, \"expected\": 5.86, \"passed\": true}, {\"check\": \"tmax 35 tmin 20 Ra 10.0\", \"actual\": 1.65, \"expected\": 1.65, \"passed\": true}, {\"check\": \"tmax 35 tmin 20 Ra 25.0\", \"actual\": 4.12, \"expected\": 4.12, \"passed\": true}, {\"check\": \"tmax 35 tmin 20 Ra 40.0\", \"actual\": 6.59, \"expected\": 6.59, \"passed\": true}, {\"check\": \"tmax 10 tmin -2 Ra 10.0\", \"actual\": 0.71, \"expected\": 0.71, \"passed\": true}, {\"check\": \"tmax 10 tmin -2 Ra 25.0\", \"actual\": 1.77, \"expected\": 1.77, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}