FAILURE MAP
← Case archive

FA-95826 / Shipping rate zone lookup / Open access

LTL breaks: equal deficit charge replaces actual · case 01

When deficit and actual charges are equal the bill shows phantom deficit weight.

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

ROOT CAUSE

The deficit comparison is inclusive.

VERIFIED REPAIR

Switch to a heavier break only when strictly cheaper.

Unsuccessful approach: Comparing each break with the original cost can replace a cheaper deficit with a costlier later one.

Case contract

Weight breaks 0, 500, 1000, 2000, 5000, 10000 lb with cents-per-cwt rates for the lane. Weight rounds up to a whole lb (min 1) and is rated at its break: ceil(w * rate / 100). Deficit rating: if billing any heavier break minimum at that break rate is strictly cheaper, use the cheapest such. Charge is at least min_charge. Return [charge, break index, rated weight].

Why this case matters

LTL lane rates use weight breaks with deficit weight rating.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(weight, rates, min_charge):
    BREAKS = [0, 500, 1000, 2000, 5000, 10000]
    w = max(1, math.ceil(weight))
    idx = max(i for i, b in enumerate(BREAKS) if w >= b)
    cost = -(-w * rates[idx] // 100)
    best = [cost, idx, w]
    for j in range(idx + 1, len(BREAKS)):
        alt = BREAKS[j] * rates[j] // 100
        if alt <= best[0]:
            best = [alt, j, BREAKS[j]]
    return [max(best[0], min_charge), best[1], best[2]]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 7', [480, [4200, 3600, 3000, 2500, 2100, 1800], 0], [18000, 1, 500]], ['generated mix 15', [1700, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1700]]], [['generated mix 67', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [105000, 3, 4200]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['generated mix 9', [499.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 17', [333.3, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 0, 334]]], [['generated mix 55', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [105000, 3, 4200]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 21', [1700, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [50000, 3, 2000]], ['generated mix 29', [499.5, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 1, 500]]], [['generated mix 34', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [105000, 3, 4200]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 31', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['generated mix 40', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]]], [['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['generated mix 51', [9000, [5000, 4900, 1000, 900, 800, 700], 0], [70000, 5, 10000]], ['generated mix 59', [12000, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [216000, 5, 12000]]]]
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
tie keeps actual[18000, 1, 500][18000, 0, 450]Failed
generated mix 5[10000, 2, 1000][10000, 2, 1000]Passed
deficit to 500[18000, 1, 500][18000, 1, 500]Passed
minimum[9000, 0, 100][9000, 0, 100]Passed
deficit to 1000[30000, 2, 1000][30000, 2, 1000]Passed
on break[18000, 1, 500][18000, 1, 500]Passed
generated mix 7[18000, 1, 500][18000, 1, 500]Passed
generated mix 15[20000, 2, 1700][20000, 2, 1700]Passed

SHA-256 / ec61e8ba6485d7c1e5f9b7ba0f711c4e870456574cda6db49cdb60723138aa54

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(weight, rates, min_charge):
    BREAKS = [0, 500, 1000, 2000, 5000, 10000]
    w = max(1, math.ceil(weight))
    idx = max(i for i, b in enumerate(BREAKS) if w >= b)
    cost = -(-w * rates[idx] // 100)
    best = [cost, idx, w]
    for j in range(idx + 1, len(BREAKS)):
        alt = BREAKS[j] * rates[j] // 100
        if alt < cost:
            best = [alt, j, BREAKS[j]]
    return [max(best[0], min_charge), best[1], best[2]]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 7', [480, [4200, 3600, 3000, 2500, 2100, 1800], 0], [18000, 1, 500]], ['generated mix 15', [1700, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1700]]], [['generated mix 67', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [105000, 3, 4200]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['generated mix 9', [499.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 17', [333.3, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 0, 334]]], [['generated mix 55', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [105000, 3, 4200]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 21', [1700, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [50000, 3, 2000]], ['generated mix 29', [499.5, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 1, 500]]], [['generated mix 34', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [105000, 3, 4200]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 31', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['generated mix 40', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]]], [['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['generated mix 51', [9000, [5000, 4900, 1000, 900, 800, 700], 0], [70000, 5, 10000]], ['generated mix 59', [12000, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [216000, 5, 12000]]]]
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
tie keeps actual[18000, 0, 450][18000, 0, 450]Passed
generated mix 5[18000, 3, 2000][10000, 2, 1000]Failed
deficit to 500[18000, 1, 500][18000, 1, 500]Passed
minimum[9000, 0, 100][9000, 0, 100]Passed
deficit to 1000[30000, 2, 1000][30000, 2, 1000]Passed
on break[18000, 1, 500][18000, 1, 500]Passed
generated mix 7[18000, 1, 500][18000, 1, 500]Passed
generated mix 15[20000, 2, 1700][20000, 2, 1700]Passed

SHA-256 / 8f8172771229e611bfa58683e88927ab65c0d6cdef1992cfff8b4e8055245ea7

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(weight, rates, min_charge):
    BREAKS = [0, 500, 1000, 2000, 5000, 10000]
    w = max(1, math.ceil(weight))
    idx = max(i for i, b in enumerate(BREAKS) if w >= b)
    cost = -(-w * rates[idx] // 100)
    best = [cost, idx, w]
    for j in range(idx + 1, len(BREAKS)):
        alt = BREAKS[j] * rates[j] // 100
        if alt < best[0]:
            best = [alt, j, BREAKS[j]]
    return [max(best[0], min_charge), best[1], best[2]]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 7', [480, [4200, 3600, 3000, 2500, 2100, 1800], 0], [18000, 1, 500]], ['generated mix 15', [1700, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1700]]], [['generated mix 67', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [105000, 3, 4200]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['generated mix 9', [499.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 17', [333.3, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 0, 334]]], [['generated mix 55', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [105000, 3, 4200]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 21', [1700, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [50000, 3, 2000]], ['generated mix 29', [499.5, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 1, 500]]], [['generated mix 34', [4200, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [105000, 3, 4200]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['on break', [500, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['generated mix 31', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['generated mix 40', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]]], [['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 5', [480, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['deficit to 1000', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 2, 1000]], ['generated mix 43', [850, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['generated mix 51', [9000, [5000, 4900, 1000, 900, 800, 700], 0], [70000, 5, 10000]], ['generated mix 59', [12000, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [216000, 5, 12000]]]]
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
tie keeps actual[18000, 0, 450][18000, 0, 450]Passed
generated mix 5[10000, 2, 1000][10000, 2, 1000]Passed
deficit to 500[18000, 1, 500][18000, 1, 500]Passed
minimum[9000, 0, 100][9000, 0, 100]Passed
deficit to 1000[30000, 2, 1000][30000, 2, 1000]Passed
on break[18000, 1, 500][18000, 1, 500]Passed
generated mix 7[18000, 1, 500][18000, 1, 500]Passed
generated mix 15[20000, 2, 1700][20000, 2, 1700]Passed

SHA-256 / d304fc9704ff58f71ac466a7dca04ad02e93a29a6ebd922ba605edd83fa50cea

Verification & scope

Stipulated break table; no freight class or accessorials. 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:17.154112+00:00.

Case digest / 94fd340c017ef87d6976c8080e5ce57d5dde3c9582a7f27022bc0fb91612ec84