FA-71061 / Weather index computation / Open access
Cloud and altitude adjusted UV index: irradiance scaling · case 01
Every location reports an extreme UV index.
ROOT CAUSE
The W/m2 factor 40 is applied to an irradiance already in mW/m2.
VERIFIED REPAIR
One UV index unit is 25 mW/m2, so divide by 25.
Unsuccessful approach: Dividing by 40 inverts the factor and understates the index.
Case contract
Clear-sky erythemal irradiance in mW/m2; UVI = irradiance/25. Multiply by the cloud factor for 0..8 octas [1,1,1,0.89,0.89,0.73,0.73,0.31,0.2], by 1 + 0.06*altitude_km (continuous) and by 1.3 over snow. Round half up to an integer; category 0-2 low, 3-5 moderate, 6-7 high, 8-10 very high, 11+ extreme.
Why this case matters
Sun-safety advice is keyed to the published integer UV index and category.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(ery_mw, octas, altitude_m, snow):
cmf = [1.0, 1.0, 1.0, 0.89, 0.89, 0.73, 0.73, 0.31, 0.2]
uvi = ery_mw * 40.0
uvi *= cmf[octas]
uvi *= 1 + 0.06 * (altitude_m / 1000.0)
if snow:
uvi *= 1.3
u = int(uvi + 0.5)
if u <= 2:
cat = "low"
elif u <= 5:
cat = "moderate"
elif u <= 7:
cat = "high"
elif u <= 10:
cat = "very high"
else:
cat = "extreme"
return [u, cat]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['10 mW/m2 0 octas 0 m', [10, 0, 0, False], [0, 'low']], ['10 mW/m2 0 octas 1500 m', [10, 0, 1500, False], [0, 'low']], ['10 mW/m2 3 octas 0 m', [10, 3, 0, False], [0, 'low']], ['10 mW/m2 3 octas 1500 m', [10, 3, 1500, False], [0, 'low']], ['10 mW/m2 5 octas 0 m', [10, 5, 0, False], [0, 'low']], ['10 mW/m2 5 octas 1500 m', [10, 5, 1500, False], [0, 'low']], ['10 mW/m2 8 octas 0 m', [10, 8, 0, False], [0, 'low']], ['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']]], [['10 mW/m2 3 octas 1500 m', [10, 3, 1500, False], [0, 'low']], ['10 mW/m2 8 octas 1500 m', [10, 8, 1500, False], [0, 'low']], ['62.5 mW/m2 0 octas 0 m', [62.5, 0, 0, False], [3, 'moderate']], ['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']], ['62.5 mW/m2 3 octas 0 m', [62.5, 3, 0, False], [2, 'low']], ['62.5 mW/m2 3 octas 1500 m', [62.5, 3, 1500, False], [2, 'low']], ['62.5 mW/m2 5 octas 0 m', [62.5, 5, 0, False], [2, 'low']], ['62.5 mW/m2 8 octas 1500 m', [62.5, 8, 1500, False], [1, 'low']]], [['10 mW/m2 8 octas 0 m', [10, 8, 0, False], [0, 'low']], ['62.5 mW/m2 8 octas 0 m', [62.5, 8, 0, False], [1, 'low']], ['62.5 mW/m2 8 octas 1500 m', [62.5, 8, 1500, False], [1, 'low']], ['87.5 mW/m2 0 octas 0 m', [87.5, 0, 0, False], [4, 'moderate']], ['87.5 mW/m2 0 octas 1500 m', [87.5, 0, 1500, False], [4, 'moderate']], ['87.5 mW/m2 3 octas 0 m', [87.5, 3, 0, False], [3, 'moderate']], ['87.5 mW/m2 3 octas 1500 m', [87.5, 3, 1500, False], [3, 'moderate']], ['87.5 mW/m2 5 octas 0 m', [87.5, 5, 0, False], [3, 'moderate']]], [['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']], ['87.5 mW/m2 5 octas 1500 m', [87.5, 5, 1500, False], [3, 'moderate']], ['87.5 mW/m2 8 octas 0 m', [87.5, 8, 0, False], [1, 'low']], ['87.5 mW/m2 8 octas 1500 m', [87.5, 8, 1500, False], [1, 'low']], ['150 mW/m2 0 octas 0 m', [150, 0, 0, False], [6, 'high']], ['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['150 mW/m2 3 octas 0 m', [150, 3, 0, False], [5, 'moderate']], ['150 mW/m2 3 octas 1500 m', [150, 3, 1500, False], [6, 'high']]], [['62.5 mW/m2 5 octas 0 m', [62.5, 5, 0, False], [2, 'low']], ['150 mW/m2 5 octas 0 m', [150, 5, 0, False], [4, 'moderate']], ['150 mW/m2 5 octas 1500 m', [150, 5, 1500, False], [5, 'moderate']], ['150 mW/m2 8 octas 0 m', [150, 8, 0, False], [1, 'low']], ['150 mW/m2 8 octas 1500 m', [150, 8, 1500, False], [1, 'low']], ['187.5 mW/m2 0 octas 0 m', [187.5, 0, 0, False], [8, 'very high']], ['187.5 mW/m2 0 octas 1500 m', [187.5, 0, 1500, False], [8, 'very high']], ['187.5 mW/m2 3 octas 0 m', [187.5, 3, 0, False], [7, 'high']]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 10 mW/m2 0 octas 0 m | [400, 'extreme'] | [0, 'low'] | Failed |
| 10 mW/m2 0 octas 1500 m | [436, 'extreme'] | [0, 'low'] | Failed |
| 10 mW/m2 3 octas 0 m | [356, 'extreme'] | [0, 'low'] | Failed |
| 10 mW/m2 3 octas 1500 m | [388, 'extreme'] | [0, 'low'] | Failed |
| 10 mW/m2 5 octas 0 m | [292, 'extreme'] | [0, 'low'] | Failed |
| 10 mW/m2 5 octas 1500 m | [318, 'extreme'] | [0, 'low'] | Failed |
| 10 mW/m2 8 octas 0 m | [80, 'extreme'] | [0, 'low'] | Failed |
| 62.5 mW/m2 0 octas 1500 m | [2725, 'extreme'] | [3, 'moderate'] | Failed |
SHA-256 / 30b877b6d832df7416ab905d05974b0514241295605567c2051074f3f4a8b762
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(ery_mw, octas, altitude_m, snow):
cmf = [1.0, 1.0, 1.0, 0.89, 0.89, 0.73, 0.73, 0.31, 0.2]
uvi = ery_mw / 40.0
uvi *= cmf[octas]
uvi *= 1 + 0.06 * (altitude_m / 1000.0)
if snow:
uvi *= 1.3
u = int(uvi + 0.5)
if u <= 2:
cat = "low"
elif u <= 5:
cat = "moderate"
elif u <= 7:
cat = "high"
elif u <= 10:
cat = "very high"
else:
cat = "extreme"
return [u, cat]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['10 mW/m2 0 octas 0 m', [10, 0, 0, False], [0, 'low']], ['10 mW/m2 0 octas 1500 m', [10, 0, 1500, False], [0, 'low']], ['10 mW/m2 3 octas 0 m', [10, 3, 0, False], [0, 'low']], ['10 mW/m2 3 octas 1500 m', [10, 3, 1500, False], [0, 'low']], ['10 mW/m2 5 octas 0 m', [10, 5, 0, False], [0, 'low']], ['10 mW/m2 5 octas 1500 m', [10, 5, 1500, False], [0, 'low']], ['10 mW/m2 8 octas 0 m', [10, 8, 0, False], [0, 'low']], ['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']]], [['10 mW/m2 3 octas 1500 m', [10, 3, 1500, False], [0, 'low']], ['10 mW/m2 8 octas 1500 m', [10, 8, 1500, False], [0, 'low']], ['62.5 mW/m2 0 octas 0 m', [62.5, 0, 0, False], [3, 'moderate']], ['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']], ['62.5 mW/m2 3 octas 0 m', [62.5, 3, 0, False], [2, 'low']], ['62.5 mW/m2 3 octas 1500 m', [62.5, 3, 1500, False], [2, 'low']], ['62.5 mW/m2 5 octas 0 m', [62.5, 5, 0, False], [2, 'low']], ['62.5 mW/m2 8 octas 1500 m', [62.5, 8, 1500, False], [1, 'low']]], [['10 mW/m2 8 octas 0 m', [10, 8, 0, False], [0, 'low']], ['62.5 mW/m2 8 octas 0 m', [62.5, 8, 0, False], [1, 'low']], ['62.5 mW/m2 8 octas 1500 m', [62.5, 8, 1500, False], [1, 'low']], ['87.5 mW/m2 0 octas 0 m', [87.5, 0, 0, False], [4, 'moderate']], ['87.5 mW/m2 0 octas 1500 m', [87.5, 0, 1500, False], [4, 'moderate']], ['87.5 mW/m2 3 octas 0 m', [87.5, 3, 0, False], [3, 'moderate']], ['87.5 mW/m2 3 octas 1500 m', [87.5, 3, 1500, False], [3, 'moderate']], ['87.5 mW/m2 5 octas 0 m', [87.5, 5, 0, False], [3, 'moderate']]], [['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']], ['87.5 mW/m2 5 octas 1500 m', [87.5, 5, 1500, False], [3, 'moderate']], ['87.5 mW/m2 8 octas 0 m', [87.5, 8, 0, False], [1, 'low']], ['87.5 mW/m2 8 octas 1500 m', [87.5, 8, 1500, False], [1, 'low']], ['150 mW/m2 0 octas 0 m', [150, 0, 0, False], [6, 'high']], ['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['150 mW/m2 3 octas 0 m', [150, 3, 0, False], [5, 'moderate']], ['150 mW/m2 3 octas 1500 m', [150, 3, 1500, False], [6, 'high']]], [['62.5 mW/m2 5 octas 0 m', [62.5, 5, 0, False], [2, 'low']], ['150 mW/m2 5 octas 0 m', [150, 5, 0, False], [4, 'moderate']], ['150 mW/m2 5 octas 1500 m', [150, 5, 1500, False], [5, 'moderate']], ['150 mW/m2 8 octas 0 m', [150, 8, 0, False], [1, 'low']], ['150 mW/m2 8 octas 1500 m', [150, 8, 1500, False], [1, 'low']], ['187.5 mW/m2 0 octas 0 m', [187.5, 0, 0, False], [8, 'very high']], ['187.5 mW/m2 0 octas 1500 m', [187.5, 0, 1500, False], [8, 'very high']], ['187.5 mW/m2 3 octas 0 m', [187.5, 3, 0, False], [7, 'high']]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 10 mW/m2 0 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 0 octas 1500 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 3 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 3 octas 1500 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 5 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 5 octas 1500 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 8 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 62.5 mW/m2 0 octas 1500 m | [2, 'low'] | [3, 'moderate'] | Failed |
SHA-256 / 72ee31ceafd707ee3622acd92aa1e205762e6488484fdd3dde1b25cd91c68873
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(ery_mw, octas, altitude_m, snow):
cmf = [1.0, 1.0, 1.0, 0.89, 0.89, 0.73, 0.73, 0.31, 0.2]
uvi = ery_mw / 25.0
uvi *= cmf[octas]
uvi *= 1 + 0.06 * (altitude_m / 1000.0)
if snow:
uvi *= 1.3
u = int(uvi + 0.5)
if u <= 2:
cat = "low"
elif u <= 5:
cat = "moderate"
elif u <= 7:
cat = "high"
elif u <= 10:
cat = "very high"
else:
cat = "extreme"
return [u, cat]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['10 mW/m2 0 octas 0 m', [10, 0, 0, False], [0, 'low']], ['10 mW/m2 0 octas 1500 m', [10, 0, 1500, False], [0, 'low']], ['10 mW/m2 3 octas 0 m', [10, 3, 0, False], [0, 'low']], ['10 mW/m2 3 octas 1500 m', [10, 3, 1500, False], [0, 'low']], ['10 mW/m2 5 octas 0 m', [10, 5, 0, False], [0, 'low']], ['10 mW/m2 5 octas 1500 m', [10, 5, 1500, False], [0, 'low']], ['10 mW/m2 8 octas 0 m', [10, 8, 0, False], [0, 'low']], ['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']]], [['10 mW/m2 3 octas 1500 m', [10, 3, 1500, False], [0, 'low']], ['10 mW/m2 8 octas 1500 m', [10, 8, 1500, False], [0, 'low']], ['62.5 mW/m2 0 octas 0 m', [62.5, 0, 0, False], [3, 'moderate']], ['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']], ['62.5 mW/m2 3 octas 0 m', [62.5, 3, 0, False], [2, 'low']], ['62.5 mW/m2 3 octas 1500 m', [62.5, 3, 1500, False], [2, 'low']], ['62.5 mW/m2 5 octas 0 m', [62.5, 5, 0, False], [2, 'low']], ['62.5 mW/m2 8 octas 1500 m', [62.5, 8, 1500, False], [1, 'low']]], [['10 mW/m2 8 octas 0 m', [10, 8, 0, False], [0, 'low']], ['62.5 mW/m2 8 octas 0 m', [62.5, 8, 0, False], [1, 'low']], ['62.5 mW/m2 8 octas 1500 m', [62.5, 8, 1500, False], [1, 'low']], ['87.5 mW/m2 0 octas 0 m', [87.5, 0, 0, False], [4, 'moderate']], ['87.5 mW/m2 0 octas 1500 m', [87.5, 0, 1500, False], [4, 'moderate']], ['87.5 mW/m2 3 octas 0 m', [87.5, 3, 0, False], [3, 'moderate']], ['87.5 mW/m2 3 octas 1500 m', [87.5, 3, 1500, False], [3, 'moderate']], ['87.5 mW/m2 5 octas 0 m', [87.5, 5, 0, False], [3, 'moderate']]], [['62.5 mW/m2 0 octas 1500 m', [62.5, 0, 1500, False], [3, 'moderate']], ['87.5 mW/m2 5 octas 1500 m', [87.5, 5, 1500, False], [3, 'moderate']], ['87.5 mW/m2 8 octas 0 m', [87.5, 8, 0, False], [1, 'low']], ['87.5 mW/m2 8 octas 1500 m', [87.5, 8, 1500, False], [1, 'low']], ['150 mW/m2 0 octas 0 m', [150, 0, 0, False], [6, 'high']], ['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['150 mW/m2 3 octas 0 m', [150, 3, 0, False], [5, 'moderate']], ['150 mW/m2 3 octas 1500 m', [150, 3, 1500, False], [6, 'high']]], [['62.5 mW/m2 5 octas 0 m', [62.5, 5, 0, False], [2, 'low']], ['150 mW/m2 5 octas 0 m', [150, 5, 0, False], [4, 'moderate']], ['150 mW/m2 5 octas 1500 m', [150, 5, 1500, False], [5, 'moderate']], ['150 mW/m2 8 octas 0 m', [150, 8, 0, False], [1, 'low']], ['150 mW/m2 8 octas 1500 m', [150, 8, 1500, False], [1, 'low']], ['187.5 mW/m2 0 octas 0 m', [187.5, 0, 0, False], [8, 'very high']], ['187.5 mW/m2 0 octas 1500 m', [187.5, 0, 1500, False], [8, 'very high']], ['187.5 mW/m2 3 octas 0 m', [187.5, 3, 0, False], [7, 'high']]]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 10 mW/m2 0 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 0 octas 1500 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 3 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 3 octas 1500 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 5 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 5 octas 1500 m | [0, 'low'] | [0, 'low'] | Passed |
| 10 mW/m2 8 octas 0 m | [0, 'low'] | [0, 'low'] | Passed |
| 62.5 mW/m2 0 octas 1500 m | [3, 'moderate'] | [3, 'moderate'] | Passed |
SHA-256 / a8382f1c15d4f24200c4775a73427d7b2c57b96b6fae2a46814cc2be04181ed4
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:48:26.308474+00:00.
Case digest / e0ca6f26d17f198e664554bd7a430161c5e56d31dc55410de1916e884aa45929