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.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| -40F with 0 km/h wind | -40 | -40 | Passed |
| -40F with 3 km/h wind | -47.5 | -40 | Failed |
| -40F with 4 km/h wind | -50.3 | -40 | Failed |
| -40F with 4.8 km/h wind | -52.1 | -40 | Failed |
| -40F with 5 km/h wind | -52.5 | -52.5 | Passed |
| -40F with 8 km/h wind | -57.4 | -57.4 | Passed |
| -40F with 16 km/h wind | -65.4 | -65.4 | Passed |
| -40F with 32 km/h wind | -74.4 | -74.4 | Passed |
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| -40F with 0 km/h wind | 10.9 | -40 | Failed |
| -40F with 3 km/h wind | -47.5 | -40 | Failed |
| -40F with 4 km/h wind | -50.3 | -40 | Failed |
| -40F with 4.8 km/h wind | -52.1 | -40 | Failed |
| -40F with 5 km/h wind | -52.5 | -52.5 | Passed |
| -40F with 8 km/h wind | -57.4 | -57.4 | Passed |
| -40F with 16 km/h wind | -65.4 | -65.4 | Passed |
| -40F with 32 km/h wind | -74.4 | -74.4 | Passed |
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