FAILURE MAP
← Case archive

FA-71081 / Weather index computation / Open access

Cloud and altitude adjusted UV index: high category upper edge · case 01

A UV index of 7 is labelled very high.

Verified by executionVariant 1 · 8 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The high category excludes 7.

VERIFIED REPAIR

Keep 6 and 7 in the high category.

Unsuccessful approach: Extending high to 8 mislabels the first very-high value.

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 / 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']], ['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['187.5 mW/m2 0 octas 1500 m', [187.5, 0, 1500, False], [8, 'very high']]], [['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']], ['187.5 mW/m2 0 octas 0 m', [187.5, 0, 0, False], [8, 'very high']], ['212.5 mW/m2 5 octas 1500 m', [212.5, 5, 1500, False], [7, 'high']]], [['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']], ['187.5 mW/m2 3 octas 1500 m', [187.5, 3, 1500, False], [7, 'high']], ['262.5 mW/m2 5 octas 1500 m', [262.5, 5, 1500, False], [8, 'very high']]], [['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']], ['187.5 mW/m2 3 octas 0 m', [187.5, 3, 0, False], [7, 'high']], ['262.5 mW/m2 5 octas 0 m', [262.5, 5, 0, False], [8, 'very high']]], [['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['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']], ['212.5 mW/m2 3 octas 1500 m', [212.5, 3, 1500, False], [8, 'very 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 fixtureActualExpectedOutcome
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
150 mW/m2 0 octas 1500 m[7, 'very high'][7, 'high']Failed
187.5 mW/m2 0 octas 1500 m[8, 'very high'][8, 'very high']Passed

SHA-256 / 0a79093c3d819ab4291c3caf30f682415cf5fb1ee8f0f3805e143e7038d8f792

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 / 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 <= 8:
        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']], ['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['187.5 mW/m2 0 octas 1500 m', [187.5, 0, 1500, False], [8, 'very high']]], [['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']], ['187.5 mW/m2 0 octas 0 m', [187.5, 0, 0, False], [8, 'very high']], ['212.5 mW/m2 5 octas 1500 m', [212.5, 5, 1500, False], [7, 'high']]], [['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']], ['187.5 mW/m2 3 octas 1500 m', [187.5, 3, 1500, False], [7, 'high']], ['262.5 mW/m2 5 octas 1500 m', [262.5, 5, 1500, False], [8, 'very high']]], [['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']], ['187.5 mW/m2 3 octas 0 m', [187.5, 3, 0, False], [7, 'high']], ['262.5 mW/m2 5 octas 0 m', [262.5, 5, 0, False], [8, 'very high']]], [['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['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']], ['212.5 mW/m2 3 octas 1500 m', [212.5, 3, 1500, False], [8, 'very 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 fixtureActualExpectedOutcome
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
150 mW/m2 0 octas 1500 m[7, 'high'][7, 'high']Passed
187.5 mW/m2 0 octas 1500 m[8, 'high'][8, 'very high']Failed

SHA-256 / 8e753c4c646b3a381b846bf381429d075244f67dc1a654a8a41e2e344a8c2dd1

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']], ['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['187.5 mW/m2 0 octas 1500 m', [187.5, 0, 1500, False], [8, 'very high']]], [['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']], ['187.5 mW/m2 0 octas 0 m', [187.5, 0, 0, False], [8, 'very high']], ['212.5 mW/m2 5 octas 1500 m', [212.5, 5, 1500, False], [7, 'high']]], [['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']], ['187.5 mW/m2 3 octas 1500 m', [187.5, 3, 1500, False], [7, 'high']], ['262.5 mW/m2 5 octas 1500 m', [262.5, 5, 1500, False], [8, 'very high']]], [['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']], ['187.5 mW/m2 3 octas 0 m', [187.5, 3, 0, False], [7, 'high']], ['262.5 mW/m2 5 octas 0 m', [262.5, 5, 0, False], [8, 'very high']]], [['150 mW/m2 0 octas 1500 m', [150, 0, 1500, False], [7, 'high']], ['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']], ['212.5 mW/m2 3 octas 1500 m', [212.5, 3, 1500, False], [8, 'very 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 fixtureActualExpectedOutcome
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
150 mW/m2 0 octas 1500 m[7, 'high'][7, 'high']Passed
187.5 mW/m2 0 octas 1500 m[8, 'very high'][8, 'very high']Passed

SHA-256 / 5ea9fcfe65c8f7ed6afab785df1ca63dcf970b768fb2913368181bcf191df81d

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.559744+00:00.

Case digest / b426d0e22960745b6bd2f9554471df11a400f4716b56b8275144807351d279d4