FAILURE MAP
← Case archive

FA-95791 / Shipping rate zone lookup / Open access

Ounce tiers: fractional ounces rounded to nearest · case 01

A 4.2 oz parcel is priced in the first tier.

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

ROOT CAUSE

Ounces are rounded to nearest instead of up.

VERIFIED REPAIR

Round ounces up before tiering.

Unsuccessful approach: Truncating ounces drops every fraction.

Case contract

Parcels under 16 oz are priced in ounce tiers: ounces rounded up to a whole ounce, tier = ceil(oz/4) capped at 4. 16 oz and above price by pounds = ceil(ounces/16). Zones 1 and 2 share price group 1; zone z >= 3 is group z-1. Return [kind, n, group].

Why this case matters

Lightweight services price by ounce tier before switching to pounds.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(ounces, zone):
    group = 1 if zone <= 2 else zone - 1
    if ounces < 16:
        oz = round(ounces)
        return ['OZ', min(4, -(-oz // 4)), group]
    return ['LB', math.ceil(ounces / 16), group]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tier two', [4.2, 5], ['OZ', 2, 4]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['small', [3.2, 2], ['OZ', 1, 1]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['generated mix 6', [15.99, 6], ['OZ', 4, 5]], ['generated mix 14', [8.4, 5], ['OZ', 3, 4]]], [['generated mix 24', [12.4, 2], ['OZ', 4, 1]], ['generated mix 16', [4.6, 9], ['OZ', 2, 8]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['tier two', [4.2, 5], ['OZ', 2, 4]], ['generated mix 8', [12.4, 5], ['OZ', 4, 4]], ['generated mix 17', [4.6, 6], ['OZ', 2, 5]]], [['generated mix 65', [4.2, 7], ['OZ', 2, 6]], ['generated mix 27', [4.6, 6], ['OZ', 2, 5]], ['tier edge', [8, 2], ['OZ', 2, 1]], ['small', [3.2, 2], ['OZ', 1, 1]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['just over a pound', [17, 8], ['LB', 2, 7]], ['generated mix 19', [8, 8], ['OZ', 2, 7]], ['generated mix 28', [16, 7], ['LB', 1, 6]]], [['generated mix 5', [4.2, 8], ['OZ', 2, 7]], ['generated mix 50', [12.4, 5], ['OZ', 4, 4]], ['tier two', [4.2, 5], ['OZ', 2, 4]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['generated mix 31', [15.5, 3], ['OZ', 4, 2]], ['generated mix 39', [24, 3], ['LB', 2, 2]]], [['generated mix 43', [12.4, 9], ['OZ', 4, 8]], ['generated mix 70', [0.3, 7], ['OZ', 1, 6]], ['just over a pound', [17, 8], ['LB', 2, 7]], ['tier edge', [8, 2], ['OZ', 2, 1]], ['small', [3.2, 2], ['OZ', 1, 1]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['generated mix 41', [8, 8], ['OZ', 2, 7]], ['generated mix 50', [12.4, 5], ['OZ', 4, 4]]]]
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
tier two['OZ', 1, 4]['OZ', 2, 4]Failed
rounded to 13['OZ', 3, 3]['OZ', 4, 3]Failed
small['OZ', 1, 1]['OZ', 1, 1]Passed
one pound['LB', 1, 2]['LB', 1, 2]Passed
two pounds['LB', 2, 8]['LB', 2, 8]Passed
almost a pound['OZ', 4, 1]['OZ', 4, 1]Passed
generated mix 6['OZ', 4, 5]['OZ', 4, 5]Passed
generated mix 14['OZ', 2, 4]['OZ', 3, 4]Failed

SHA-256 / d060b9b0f4c6d1e523ae60493f5b3a0e3b5c0db3049b372a9b4f403fcb2a8777

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(ounces, zone):
    group = 1 if zone <= 2 else zone - 1
    if ounces < 16:
        oz = int(ounces)
        return ['OZ', min(4, -(-oz // 4)), group]
    return ['LB', math.ceil(ounces / 16), group]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tier two', [4.2, 5], ['OZ', 2, 4]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['small', [3.2, 2], ['OZ', 1, 1]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['generated mix 6', [15.99, 6], ['OZ', 4, 5]], ['generated mix 14', [8.4, 5], ['OZ', 3, 4]]], [['generated mix 24', [12.4, 2], ['OZ', 4, 1]], ['generated mix 16', [4.6, 9], ['OZ', 2, 8]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['tier two', [4.2, 5], ['OZ', 2, 4]], ['generated mix 8', [12.4, 5], ['OZ', 4, 4]], ['generated mix 17', [4.6, 6], ['OZ', 2, 5]]], [['generated mix 65', [4.2, 7], ['OZ', 2, 6]], ['generated mix 27', [4.6, 6], ['OZ', 2, 5]], ['tier edge', [8, 2], ['OZ', 2, 1]], ['small', [3.2, 2], ['OZ', 1, 1]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['just over a pound', [17, 8], ['LB', 2, 7]], ['generated mix 19', [8, 8], ['OZ', 2, 7]], ['generated mix 28', [16, 7], ['LB', 1, 6]]], [['generated mix 5', [4.2, 8], ['OZ', 2, 7]], ['generated mix 50', [12.4, 5], ['OZ', 4, 4]], ['tier two', [4.2, 5], ['OZ', 2, 4]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['generated mix 31', [15.5, 3], ['OZ', 4, 2]], ['generated mix 39', [24, 3], ['LB', 2, 2]]], [['generated mix 43', [12.4, 9], ['OZ', 4, 8]], ['generated mix 70', [0.3, 7], ['OZ', 1, 6]], ['just over a pound', [17, 8], ['LB', 2, 7]], ['tier edge', [8, 2], ['OZ', 2, 1]], ['small', [3.2, 2], ['OZ', 1, 1]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['generated mix 41', [8, 8], ['OZ', 2, 7]], ['generated mix 50', [12.4, 5], ['OZ', 4, 4]]]]
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
tier two['OZ', 1, 4]['OZ', 2, 4]Failed
rounded to 13['OZ', 3, 3]['OZ', 4, 3]Failed
small['OZ', 1, 1]['OZ', 1, 1]Passed
one pound['LB', 1, 2]['LB', 1, 2]Passed
two pounds['LB', 2, 8]['LB', 2, 8]Passed
almost a pound['OZ', 4, 1]['OZ', 4, 1]Passed
generated mix 6['OZ', 4, 5]['OZ', 4, 5]Passed
generated mix 14['OZ', 2, 4]['OZ', 3, 4]Failed

SHA-256 / c92f2b53a68961b4ddd9d143a8f27cb57ed08b80dd34750192981fc9db276826

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(ounces, zone):
    group = 1 if zone <= 2 else zone - 1
    if ounces < 16:
        oz = math.ceil(ounces)
        return ['OZ', min(4, -(-oz // 4)), group]
    return ['LB', math.ceil(ounces / 16), group]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tier two', [4.2, 5], ['OZ', 2, 4]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['small', [3.2, 2], ['OZ', 1, 1]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['generated mix 6', [15.99, 6], ['OZ', 4, 5]], ['generated mix 14', [8.4, 5], ['OZ', 3, 4]]], [['generated mix 24', [12.4, 2], ['OZ', 4, 1]], ['generated mix 16', [4.6, 9], ['OZ', 2, 8]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['tier two', [4.2, 5], ['OZ', 2, 4]], ['generated mix 8', [12.4, 5], ['OZ', 4, 4]], ['generated mix 17', [4.6, 6], ['OZ', 2, 5]]], [['generated mix 65', [4.2, 7], ['OZ', 2, 6]], ['generated mix 27', [4.6, 6], ['OZ', 2, 5]], ['tier edge', [8, 2], ['OZ', 2, 1]], ['small', [3.2, 2], ['OZ', 1, 1]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['just over a pound', [17, 8], ['LB', 2, 7]], ['generated mix 19', [8, 8], ['OZ', 2, 7]], ['generated mix 28', [16, 7], ['LB', 1, 6]]], [['generated mix 5', [4.2, 8], ['OZ', 2, 7]], ['generated mix 50', [12.4, 5], ['OZ', 4, 4]], ['tier two', [4.2, 5], ['OZ', 2, 4]], ['one pound', [16, 3], ['LB', 1, 2]], ['two pounds', [32, 9], ['LB', 2, 8]], ['rounded to 13', [12.4, 4], ['OZ', 4, 3]], ['generated mix 31', [15.5, 3], ['OZ', 4, 2]], ['generated mix 39', [24, 3], ['LB', 2, 2]]], [['generated mix 43', [12.4, 9], ['OZ', 4, 8]], ['generated mix 70', [0.3, 7], ['OZ', 1, 6]], ['just over a pound', [17, 8], ['LB', 2, 7]], ['tier edge', [8, 2], ['OZ', 2, 1]], ['small', [3.2, 2], ['OZ', 1, 1]], ['almost a pound', [15.5, 1], ['OZ', 4, 1]], ['generated mix 41', [8, 8], ['OZ', 2, 7]], ['generated mix 50', [12.4, 5], ['OZ', 4, 4]]]]
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
tier two['OZ', 2, 4]['OZ', 2, 4]Passed
rounded to 13['OZ', 4, 3]['OZ', 4, 3]Passed
small['OZ', 1, 1]['OZ', 1, 1]Passed
one pound['LB', 1, 2]['LB', 1, 2]Passed
two pounds['LB', 2, 8]['LB', 2, 8]Passed
almost a pound['OZ', 4, 1]['OZ', 4, 1]Passed
generated mix 6['OZ', 4, 5]['OZ', 4, 5]Passed
generated mix 14['OZ', 3, 4]['OZ', 3, 4]Passed

SHA-256 / afbd1d034bc342d9ea1686b2c7c3843e102e970728c38178f8476390f5e7ee6e

Verification & scope

Stipulated tier sizes and zone groups. 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:52:16.896506+00:00.

Case digest / 39327e0b8a8b4ea3cd2511a4350d17b38fee0633691b9161b958ba0ea95fceef