FAILURE MAP
← Case archive

FA-70876 / Weather index computation / Open access

Wind chill from km/h anemometer: calm wind gate units · case 01

Winds between 3 and 4.8 km/h produce a wind chill although they are below 3 mph.

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

ROOT CAUSE

The calm threshold is compared against km/h rather than the converted mph speed.

THE FAILURE

The calm threshold is compared against km/h rather than the converted mph speed.

Unsuccessful approach: Combining the gates with and applies the formula to warm air and to calm cold air.

Case contract

Input temperature in degF and wind in km/h. Convert wind to mph (divide by 1.609344). If T > 50 degF or wind below 3 mph, return T rounded to 0.1. Otherwise return 35.74 + 0.6215T - 35.75V^0.16 + 0.4275T*V^0.16 rounded to 0.1.

Why this case matters

Cold-weather advisories and frostbite timing use the wind chill index.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(t_f, wind_kmh):
    mph = wind_kmh / 1.609344
    if t_f > 50 or wind_kmh < 3:
        return round(t_f, 1)
    v = mph ** 0.16
    wc = 35.74 + 0.6215 * t_f - 35.75 * v + 0.4275 * t_f * v
    return round(wc, 1)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['-40F with 0 km/h wind', [-40, 0], -40], ['-40F with 3 km/h wind', [-40, 3], -40], ['-40F with 4 km/h wind', [-40, 4], -40], ['-40F with 4.8 km/h wind', [-40, 4.8], -40], ['-40F with 5 km/h wind', [-40, 5], -52.5], ['-40F with 8 km/h wind', [-40, 8], -57.4], ['-40F with 16 km/h wind', [-40, 16], -65.4], ['-40F with 32 km/h wind', [-40, 32], -74.4]], [['-40F with 32 km/h wind', [-40, 32], -74.4], ['-40F with 64 km/h wind', [-40, 64], -84.4], ['-40F with 100 km/h wind', [-40, 100], -91.4], ['-20F with 0 km/h wind', [-20, 0], -20], ['-20F with 3 km/h wind', [-20, 3], -20], ['-20F with 4 km/h wind', [-20, 4], -20], ['-20F with 4.8 km/h wind', [-20, 4.8], -20], ['-20F with 5 km/h wind', [-20, 5], -29.8]], [['-20F with 5 km/h wind', [-20, 5], -29.8], ['-20F with 8 km/h wind', [-20, 8], -33.9], ['-20F with 16 km/h wind', [-20, 16], -40.7], ['-20F with 32 km/h wind', [-20, 32], -48.2], ['-20F with 64 km/h wind', [-20, 64], -56.5], ['-20F with 100 km/h wind', [-20, 100], -62.5], ['-5F with 3 km/h wind', [-5, 3], -5], ['-5F with 4.8 km/h wind', [-5, 4.8], -5]], [['-5F with 3 km/h wind', [-5, 3], -5], ['-5F with 4 km/h wind', [-5, 4], -5], ['-5F with 4.8 km/h wind', [-5, 4.8], -5], ['-5F with 5 km/h wind', [-5, 5], -12.8], ['-5F with 8 km/h wind', [-5, 8], -16.3], ['-5F with 16 km/h wind', [-5, 16], -22.1], ['0F with 3 km/h wind', [0, 3], 0], ['10F with 0 km/h wind', [10, 0], 10]], [['-5F with 64 km/h wind', [-5, 64], -35.7], ['-5F with 100 km/h wind', [-5, 100], -40.7], ['0F with 0 km/h wind', [0, 0], 0], ['0F with 3 km/h wind', [0, 3], 0], ['0F with 4 km/h wind', [0, 4], 0], ['0F with 4.8 km/h wind', [0, 4.8], 0], ['10F with 3 km/h wind', [10, 3], 10], ['32F with 3 km/h wind', [32, 3], 32]]]
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
-40F with 0 km/h wind-40-40Passed
-40F with 3 km/h wind-47.5-40Failed
-40F with 4 km/h wind-50.3-40Failed
-40F with 4.8 km/h wind-52.1-40Failed
-40F with 5 km/h wind-52.5-52.5Passed
-40F with 8 km/h wind-57.4-57.4Passed
-40F with 16 km/h wind-65.4-65.4Passed
-40F with 32 km/h wind-74.4-74.4Passed

SHA-256 / fb27df55b31a6ed6da15ea7a15f45f9bd6e38816a95f1f8461673c05d57839ca

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(t_f, wind_kmh):
    mph = wind_kmh / 1.609344
    if t_f > 50 and mph < 3:
        return round(t_f, 1)
    v = mph ** 0.16
    wc = 35.74 + 0.6215 * t_f - 35.75 * v + 0.4275 * t_f * v
    return round(wc, 1)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['-40F with 0 km/h wind', [-40, 0], -40], ['-40F with 3 km/h wind', [-40, 3], -40], ['-40F with 4 km/h wind', [-40, 4], -40], ['-40F with 4.8 km/h wind', [-40, 4.8], -40], ['-40F with 5 km/h wind', [-40, 5], -52.5], ['-40F with 8 km/h wind', [-40, 8], -57.4], ['-40F with 16 km/h wind', [-40, 16], -65.4], ['-40F with 32 km/h wind', [-40, 32], -74.4]], [['-40F with 32 km/h wind', [-40, 32], -74.4], ['-40F with 64 km/h wind', [-40, 64], -84.4], ['-40F with 100 km/h wind', [-40, 100], -91.4], ['-20F with 0 km/h wind', [-20, 0], -20], ['-20F with 3 km/h wind', [-20, 3], -20], ['-20F with 4 km/h wind', [-20, 4], -20], ['-20F with 4.8 km/h wind', [-20, 4.8], -20], ['-20F with 5 km/h wind', [-20, 5], -29.8]], [['-20F with 5 km/h wind', [-20, 5], -29.8], ['-20F with 8 km/h wind', [-20, 8], -33.9], ['-20F with 16 km/h wind', [-20, 16], -40.7], ['-20F with 32 km/h wind', [-20, 32], -48.2], ['-20F with 64 km/h wind', [-20, 64], -56.5], ['-20F with 100 km/h wind', [-20, 100], -62.5], ['-5F with 3 km/h wind', [-5, 3], -5], ['-5F with 4.8 km/h wind', [-5, 4.8], -5]], [['-5F with 3 km/h wind', [-5, 3], -5], ['-5F with 4 km/h wind', [-5, 4], -5], ['-5F with 4.8 km/h wind', [-5, 4.8], -5], ['-5F with 5 km/h wind', [-5, 5], -12.8], ['-5F with 8 km/h wind', [-5, 8], -16.3], ['-5F with 16 km/h wind', [-5, 16], -22.1], ['0F with 3 km/h wind', [0, 3], 0], ['10F with 0 km/h wind', [10, 0], 10]], [['-5F with 64 km/h wind', [-5, 64], -35.7], ['-5F with 100 km/h wind', [-5, 100], -40.7], ['0F with 0 km/h wind', [0, 0], 0], ['0F with 3 km/h wind', [0, 3], 0], ['0F with 4 km/h wind', [0, 4], 0], ['0F with 4.8 km/h wind', [0, 4.8], 0], ['10F with 3 km/h wind', [10, 3], 10], ['32F with 3 km/h wind', [32, 3], 32]]]
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
-40F with 0 km/h wind10.9-40Failed
-40F with 3 km/h wind-47.5-40Failed
-40F with 4 km/h wind-50.3-40Failed
-40F with 4.8 km/h wind-52.1-40Failed
-40F with 5 km/h wind-52.5-52.5Passed
-40F with 8 km/h wind-57.4-57.4Passed
-40F with 16 km/h wind-65.4-65.4Passed
-40F with 32 km/h wind-74.4-74.4Passed

SHA-256 / 690f31d42bc2a8fc97412fce1fb757bd5bfcffbe73815c71b24172f157b3e727

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 8 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

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

Case digest / 43625fb3337ec2376907b0e10438921e51224fdc0bef8762e739ef42376e25ca