FA-95811 / Shipping rate zone lookup / Open access
LTL breaks: deficit bill shows actual weight · case 01
Invoices rated at a deficit break show the actual weight, so the charge cannot be reproduced from the bill.
ROOT CAUSE
When a heavier break wins, the rated weight is left at the actual weight instead of the break minimum.
VERIFIED REPAIR
Report the break minimum as rated weight when deficit rating applies.
Unsuccessful approach: Reporting the original break index with the deficit weight mislabels which rate was used.
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, w]
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 = [[['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['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]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 8', [450, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]]], [['generated mix 8', [450, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['generated mix 7', [480, [4200, 3600, 3000, 2500, 2100, 1800], 0], [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]], ['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 11', [480, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [20000, 1, 500]], ['generated mix 19', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [28836, 1, 801]]], [['generated mix 21', [1700, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [50000, 3, 2000]], ['generated mix 14', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]], ['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 22', [499.5, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['generated mix 30', [1999.2, [5000, 4900, 1000, 900, 800, 700], 9000], [18000, 3, 2000]]], [['generated mix 40', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]], ['generated mix 26', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 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 32', [850, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['generated mix 41', [4200, [5000, 4900, 1000, 900, 800, 700], 9000], [37800, 3, 4200]]], [['generated mix 57', [450, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 1, 500]], ['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]], ['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]]]]
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 |
|---|---|---|---|
| deficit to 500 | [18000, 1, 450] | [18000, 1, 500] | Failed |
| deficit to 1000 | [30000, 2, 850] | [30000, 2, 1000] | Failed |
| on break | [18000, 1, 500] | [18000, 1, 500] | Passed |
| fraction | [28836, 1, 801] | [28836, 1, 801] | Passed |
| skip a break | [10000, 2, 400] | [10000, 2, 1000] | Failed |
| minimum | [9000, 0, 100] | [9000, 0, 100] | Passed |
| tie keeps actual | [18000, 0, 450] | [18000, 0, 450] | Passed |
| generated mix 8 | [10000, 2, 450] | [10000, 2, 1000] | Failed |
SHA-256 / 105878f7dff1828b2188bbe83d4e492622df10f8817314197fec82a7cb087fa8
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 < best[0]:
best = [alt, idx, 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 = [[['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['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]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 8', [450, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]]], [['generated mix 8', [450, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['generated mix 7', [480, [4200, 3600, 3000, 2500, 2100, 1800], 0], [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]], ['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 11', [480, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [20000, 1, 500]], ['generated mix 19', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [28836, 1, 801]]], [['generated mix 21', [1700, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [50000, 3, 2000]], ['generated mix 14', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]], ['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 22', [499.5, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['generated mix 30', [1999.2, [5000, 4900, 1000, 900, 800, 700], 9000], [18000, 3, 2000]]], [['generated mix 40', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]], ['generated mix 26', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 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 32', [850, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['generated mix 41', [4200, [5000, 4900, 1000, 900, 800, 700], 9000], [37800, 3, 4200]]], [['generated mix 57', [450, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 1, 500]], ['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]], ['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]]]]
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 |
|---|---|---|---|
| deficit to 500 | [18000, 0, 500] | [18000, 1, 500] | Failed |
| deficit to 1000 | [30000, 1, 1000] | [30000, 2, 1000] | Failed |
| on break | [18000, 1, 500] | [18000, 1, 500] | Passed |
| fraction | [28836, 1, 801] | [28836, 1, 801] | Passed |
| skip a break | [10000, 0, 1000] | [10000, 2, 1000] | Failed |
| minimum | [9000, 0, 100] | [9000, 0, 100] | Passed |
| tie keeps actual | [18000, 0, 450] | [18000, 0, 450] | Passed |
| generated mix 8 | [10000, 0, 1000] | [10000, 2, 1000] | Failed |
SHA-256 / aa229407973cbd4a73c2b002d7c87b5c1faadd1b746829947b5e2b13d01bbeda
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 = [[['deficit to 500', [450, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 1, 500]], ['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]], ['fraction', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [28836, 1, 801]], ['skip a break', [400, [5000, 4900, 1000, 900, 800, 700], 0], [10000, 2, 1000]], ['minimum', [100, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [9000, 0, 100]], ['tie keeps actual', [450, [4000, 3600, 3000, 2500, 2100, 1800], 9000], [18000, 0, 450]], ['generated mix 8', [450, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]]], [['generated mix 8', [450, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['generated mix 7', [480, [4200, 3600, 3000, 2500, 2100, 1800], 0], [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]], ['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 11', [480, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [20000, 1, 500]], ['generated mix 19', [800.5, [4200, 3600, 3000, 2500, 2100, 1800], 20000], [28836, 1, 801]]], [['generated mix 21', [1700, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [50000, 3, 2000]], ['generated mix 14', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]], ['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 22', [499.5, [5000, 4900, 1000, 900, 800, 700], 20000], [20000, 2, 1000]], ['generated mix 30', [1999.2, [5000, 4900, 1000, 900, 800, 700], 9000], [18000, 3, 2000]]], [['generated mix 40', [9000, [4237, 3611, 3044, 2517, 2150, 1833], 0], [183300, 5, 10000]], ['generated mix 26', [850, [4200, 3600, 3000, 2500, 2100, 1800], 9000], [30000, 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 32', [850, [5000, 4900, 1000, 900, 800, 700], 9000], [10000, 2, 1000]], ['generated mix 41', [4200, [5000, 4900, 1000, 900, 800, 700], 9000], [37800, 3, 4200]]], [['generated mix 57', [450, [4237, 3611, 3044, 2517, 2150, 1833], 20000], [20000, 1, 500]], ['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]], ['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]]]]
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 |
|---|---|---|---|
| deficit to 500 | [18000, 1, 500] | [18000, 1, 500] | Passed |
| deficit to 1000 | [30000, 2, 1000] | [30000, 2, 1000] | Passed |
| on break | [18000, 1, 500] | [18000, 1, 500] | Passed |
| fraction | [28836, 1, 801] | [28836, 1, 801] | Passed |
| skip a break | [10000, 2, 1000] | [10000, 2, 1000] | Passed |
| minimum | [9000, 0, 100] | [9000, 0, 100] | Passed |
| tie keeps actual | [18000, 0, 450] | [18000, 0, 450] | Passed |
| generated mix 8 | [10000, 2, 1000] | [10000, 2, 1000] | Passed |
SHA-256 / 1985c05e20f2415c2a5b885c909908249ab9e4afd5b960e66a66680ea9b01ea7
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.079743+00:00.
Case digest / d39801c1f57ae3cd4aa1d2c0a9029b42888a36c9bd8d3b29cc68cb2677409e24