{"abstract":"Moderate days show near-zero evapotranspiration.","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 the Kelvin offset inflates ET0 by an order of magnitude.","family":"w2-weather_index_computation-hargreaves-et0-temperature-offset","id":"FA-71181","implementations":{"attempt":{"sha256":"0e01a86a3dac5c6ee8eeab6bcb1484a5e287102c03a5d2970d509f171c55b33b","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 + 273.15) * 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 40 tmin 18 Ra 10.0', [40, 18, 10.0], 2.06], ['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":"5bd6e1edd839ee61ff4858eb60c1e634f9c65f1c3cf6fcd3bc5abd8261c9f9d1","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 40 tmin 18 Ra 10.0', [40, 18, 10.0], 2.06], ['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":"8bb03c594506271fbc0232f4765f52dd0231c677ee5b51ad88cd65ed2ac18526","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 40 tmin 18 Ra 10.0', [40, 18, 10.0], 2.06], ['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-temperature-offset","generated_at":"2026-09-29T14:48:27.378829+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":"Use Tmean + 17.8.","root_cause":"The Hargreaves temperature offset is subtracted.","sha256":"426760c8f26d7872d2cf853ee45b2078dc2fc7dc96b75fcb2d816687604a1d7f","title":"Hargreaves reference evapotranspiration: temperature offset · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":36.349,"exit_code":1,"observations":[{"actual":10.75,"check":"tmax 30 tmin 15 Ra 10.0","expected":1.46,"passed":false},{"actual":26.86,"check":"tmax 30 tmin 15 Ra 25.0","expected":3.66,"passed":false},{"actual":42.98,"check":"tmax 30 tmin 15 Ra 40.0","expected":5.86,"passed":false},{"actual":10.93,"check":"tmax 35 tmin 20 Ra 10.0","expected":1.65,"passed":false},{"actual":27.32,"check":"tmax 35 tmin 20 Ra 25.0","expected":4.12,"passed":false},{"actual":43.71,"check":"tmax 35 tmin 20 Ra 40.0","expected":6.59,"passed":false},{"actual":9.01,"check":"tmax 10 tmin -2 Ra 10.0","expected":0.71,"passed":false},{"actual":22.52,"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\": 10.75, \"expected\": 1.46, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 25.0\", \"actual\": 26.86, \"expected\": 3.66, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 40.0\", \"actual\": 42.98, \"expected\": 5.86, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 10.0\", \"actual\": 10.93, \"expected\": 1.65, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 25.0\", \"actual\": 27.32, \"expected\": 4.12, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 40.0\", \"actual\": 43.71, \"expected\": 6.59, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 10.0\", \"actual\": 9.01, \"expected\": 0.71, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 25.0\", \"actual\": 22.52, \"expected\": 1.77, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.255,"exit_code":1,"observations":[{"actual":0.17,"check":"tmax 30 tmin 15 Ra 10.0","expected":1.46,"passed":false},{"actual":0.43,"check":"tmax 30 tmin 15 Ra 25.0","expected":3.66,"passed":false},{"actual":0.68,"check":"tmax 30 tmin 15 Ra 40.0","expected":5.86,"passed":false},{"actual":0.35,"check":"tmax 35 tmin 20 Ra 10.0","expected":1.65,"passed":false},{"actual":0.88,"check":"tmax 35 tmin 20 Ra 25.0","expected":4.12,"passed":false},{"actual":1.41,"check":"tmax 35 tmin 20 Ra 40.0","expected":6.59,"passed":false},{"actual":0.0,"check":"tmax 10 tmin -2 Ra 10.0","expected":0.71,"passed":false},{"actual":0.0,"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.17, \"expected\": 1.46, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 25.0\", \"actual\": 0.43, \"expected\": 3.66, \"passed\": false}, {\"check\": \"tmax 30 tmin 15 Ra 40.0\", \"actual\": 0.68, \"expected\": 5.86, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 10.0\", \"actual\": 0.35, \"expected\": 1.65, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 25.0\", \"actual\": 0.88, \"expected\": 4.12, \"passed\": false}, {\"check\": \"tmax 35 tmin 20 Ra 40.0\", \"actual\": 1.41, \"expected\": 6.59, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 10.0\", \"actual\": 0.0, \"expected\": 0.71, \"passed\": false}, {\"check\": \"tmax 10 tmin -2 Ra 25.0\", \"actual\": 0.0, \"expected\": 1.77, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.45,"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"}