{"abstract":"Discounts come out a cent short on half-cent results.","category":"Shipping rate zone lookup","checks":8,"contract":"Cents. Weekly spend (dollars, may have cents) selects the discount: >= 5000 -> 25%, >= 2000 -> 18%, >= 500 -> 12%, else 0. Discount = list * pct / 100 rounded half up. Net is floored at the minimum charge, but never above the list rate. Return [pct, net].","evaluation_group":"w2-shipping-zone-contract-discount","failed_approach":"Round-half-even still rounds some half cents down.","family":"w2-shipping-zone-contract-discount-discount-rounding","id":"FA-95681","implementations":{"attempt":{"sha256":"7df39373a3c1becbd3ac02e52df76cc6cdc5a4a6ece184a3ad04363ac81d0132","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(list_rate, spend, min_charge):\n    pct = 0\n    for limit, p in ((5000, 25), (2000, 18), (500, 12)):\n        if spend >= limit:\n            pct = p\n            break\n    disc = round(list_rate * pct / 100)\n    net = list_rate - disc\n    floor_amt = min(min_charge, list_rate)\n    return [pct, max(net, floor_amt)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['half cent discount', [1025, 2000, 500], [18, 840]], ['generated mix 15', [1250, 8000, 900], [25, 937]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['generated mix 6', [2000, 4999.5, 500], [18, 1640]], ['generated mix 14', [4999, 1999.6, 1200], [12, 4399]]], [['generated mix 27', [1250, 5000, 900], [25, 937]], ['generated mix 50', [1025, 2000, 500], [18, 840]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['generated mix 9', [1000, 500, 900], [12, 900]], ['generated mix 17', [1250, 8000, 900], [25, 937]]], [['generated mix 64', [4999, 5000, 900], [25, 3749]], ['generated mix 30', [1250, 8000, 500], [25, 937]], ['no discount', [1000, 100, 500], [0, 1000]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['generated mix 20', [4999, 5000, 500], [25, 3749]], ['generated mix 28', [1333, 2000, 1200], [18, 1200]]], [['generated mix 5', [4999, 500, 0], [12, 4399]], ['generated mix 17', [1250, 8000, 900], [25, 937]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum applies', [1000, 6000, 900], [25, 900]], ['no discount', [1000, 100, 500], [0, 1000]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['generated mix 33', [1025, 1999.6, 500], [12, 902]], ['generated mix 41', [1025, 499.99, 0], [0, 1025]]], [['generated mix 29', [1333, 1999.6, 0], [12, 1173]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['generated mix 43', [1333, 499.99, 500], [0, 1333]], ['generated mix 51', [1025, 2000, 900], [18, 900]], ['generated mix 59', [1333, 100, 1200], [0, 1333]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"3f8044e9ef6a919c74093beab8a4f73cd3bbd481b10b6f3b428815b97c8fc072","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(list_rate, spend, min_charge):\n    pct = 0\n    for limit, p in ((5000, 25), (2000, 18), (500, 12)):\n        if spend >= limit:\n            pct = p\n            break\n    disc = list_rate * pct // 100\n    net = list_rate - disc\n    floor_amt = min(min_charge, list_rate)\n    return [pct, max(net, floor_amt)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['half cent discount', [1025, 2000, 500], [18, 840]], ['generated mix 15', [1250, 8000, 900], [25, 937]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['generated mix 6', [2000, 4999.5, 500], [18, 1640]], ['generated mix 14', [4999, 1999.6, 1200], [12, 4399]]], [['generated mix 27', [1250, 5000, 900], [25, 937]], ['generated mix 50', [1025, 2000, 500], [18, 840]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['generated mix 9', [1000, 500, 900], [12, 900]], ['generated mix 17', [1250, 8000, 900], [25, 937]]], [['generated mix 64', [4999, 5000, 900], [25, 3749]], ['generated mix 30', [1250, 8000, 500], [25, 937]], ['no discount', [1000, 100, 500], [0, 1000]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['generated mix 20', [4999, 5000, 500], [25, 3749]], ['generated mix 28', [1333, 2000, 1200], [18, 1200]]], [['generated mix 5', [4999, 500, 0], [12, 4399]], ['generated mix 17', [1250, 8000, 900], [25, 937]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum applies', [1000, 6000, 900], [25, 900]], ['no discount', [1000, 100, 500], [0, 1000]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['generated mix 33', [1025, 1999.6, 500], [12, 902]], ['generated mix 41', [1025, 499.99, 0], [0, 1025]]], [['generated mix 29', [1333, 1999.6, 0], [12, 1173]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['generated mix 43', [1333, 499.99, 500], [0, 1333]], ['generated mix 51', [1025, 2000, 900], [18, 900]], ['generated mix 59', [1333, 100, 1200], [0, 1333]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"cd516325bca7da5cacf60d6814ac72ffd0fba0481191ad191fa3da3601838e5b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(list_rate, spend, min_charge):\n    pct = 0\n    for limit, p in ((5000, 25), (2000, 18), (500, 12)):\n        if spend >= limit:\n            pct = p\n            break\n    disc = (list_rate * pct + 50) // 100\n    net = list_rate - disc\n    floor_amt = min(min_charge, list_rate)\n    return [pct, max(net, floor_amt)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['half cent discount', [1025, 2000, 500], [18, 840]], ['generated mix 15', [1250, 8000, 900], [25, 937]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['generated mix 6', [2000, 4999.5, 500], [18, 1640]], ['generated mix 14', [4999, 1999.6, 1200], [12, 4399]]], [['generated mix 27', [1250, 5000, 900], [25, 937]], ['generated mix 50', [1025, 2000, 500], [18, 840]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['generated mix 9', [1000, 500, 900], [12, 900]], ['generated mix 17', [1250, 8000, 900], [25, 937]]], [['generated mix 64', [4999, 5000, 900], [25, 3749]], ['generated mix 30', [1250, 8000, 500], [25, 937]], ['no discount', [1000, 100, 500], [0, 1000]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['generated mix 20', [4999, 5000, 500], [25, 3749]], ['generated mix 28', [1333, 2000, 1200], [18, 1200]]], [['generated mix 5', [4999, 500, 0], [12, 4399]], ['generated mix 17', [1250, 8000, 900], [25, 937]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum applies', [1000, 6000, 900], [25, 900]], ['no discount', [1000, 100, 500], [0, 1000]], ['just under tier', [1000, 1999.6, 500], [12, 880]], ['generated mix 33', [1025, 1999.6, 500], [12, 902]], ['generated mix 41', [1025, 499.99, 0], [0, 1025]]], [['generated mix 29', [1333, 1999.6, 0], [12, 1173]], ['half cent discount', [1025, 2000, 500], [18, 840]], ['tier edge', [1000, 2000, 500], [18, 820]], ['top tier', [1000, 6000, 500], [25, 750]], ['minimum capped by list', [700, 6000, 900], [25, 700]], ['generated mix 43', [1333, 499.99, 500], [0, 1333]], ['generated mix 51', [1025, 2000, 900], [18, 900]], ['generated mix 59', [1333, 100, 1200], [0, 1333]]]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Stipulated tiers; no earned incentive periods. 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-shipping-zone-contract-discount-discount-rounding","generated_at":"2026-09-29T14:52:15.876577+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Contract pricing discounts list rates by volume tier subject to a minimum.","repair":"Round the discount half up to the cent.","root_cause":"The discount amount is floored instead of rounded half up.","sha256":"5eb14d22c8d24990b97a2ac664b1f87d4ab9f29c399a5376b9fb5b959113dc95","title":"Contract discount: discount cents truncated · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.574,"exit_code":1,"observations":[{"actual":[18,841],"check":"half cent discount","expected":[18,840],"passed":false},{"actual":[25,938],"check":"generated mix 15","expected":[25,937],"passed":false},{"actual":[18,820],"check":"tier edge","expected":[18,820],"passed":true},{"actual":[25,750],"check":"top tier","expected":[25,750],"passed":true},{"actual":[25,700],"check":"minimum capped by list","expected":[25,700],"passed":true},{"actual":[12,880],"check":"just under tier","expected":[12,880],"passed":true},{"actual":[18,1640],"check":"generated mix 6","expected":[18,1640],"passed":true},{"actual":[12,4399],"check":"generated mix 14","expected":[12,4399],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"half cent discount\", \"actual\": [18, 841], \"expected\": [18, 840], \"passed\": false}, {\"check\": \"generated mix 15\", \"actual\": [25, 938], \"expected\": [25, 937], \"passed\": false}, {\"check\": \"tier edge\", \"actual\": [18, 820], \"expected\": [18, 820], \"passed\": true}, {\"check\": \"top tier\", \"actual\": [25, 750], \"expected\": [25, 750], \"passed\": true}, {\"check\": \"minimum capped by list\", \"actual\": [25, 700], \"expected\": [25, 700], \"passed\": true}, {\"check\": \"just under tier\", \"actual\": [12, 880], \"expected\": [12, 880], \"passed\": true}, {\"check\": \"generated mix 6\", \"actual\": [18, 1640], \"expected\": [18, 1640], \"passed\": true}, {\"check\": \"generated mix 14\", \"actual\": [12, 4399], \"expected\": [12, 4399], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.669,"exit_code":1,"observations":[{"actual":[18,841],"check":"half cent discount","expected":[18,840],"passed":false},{"actual":[25,938],"check":"generated mix 15","expected":[25,937],"passed":false},{"actual":[18,820],"check":"tier edge","expected":[18,820],"passed":true},{"actual":[25,750],"check":"top tier","expected":[25,750],"passed":true},{"actual":[25,700],"check":"minimum capped by list","expected":[25,700],"passed":true},{"actual":[12,880],"check":"just under tier","expected":[12,880],"passed":true},{"actual":[18,1640],"check":"generated mix 6","expected":[18,1640],"passed":true},{"actual":[12,4400],"check":"generated mix 14","expected":[12,4399],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"half cent discount\", \"actual\": [18, 841], \"expected\": [18, 840], \"passed\": false}, {\"check\": \"generated mix 15\", \"actual\": [25, 938], \"expected\": [25, 937], \"passed\": false}, {\"check\": \"tier edge\", \"actual\": [18, 820], \"expected\": [18, 820], \"passed\": true}, {\"check\": \"top tier\", \"actual\": [25, 750], \"expected\": [25, 750], \"passed\": true}, {\"check\": \"minimum capped by list\", \"actual\": [25, 700], \"expected\": [25, 700], \"passed\": true}, {\"check\": \"just under tier\", \"actual\": [12, 880], \"expected\": [12, 880], \"passed\": true}, {\"check\": \"generated mix 6\", \"actual\": [18, 1640], \"expected\": [18, 1640], \"passed\": true}, {\"check\": \"generated mix 14\", \"actual\": [12, 4400], \"expected\": [12, 4399], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.772,"exit_code":0,"observations":[{"actual":[18,840],"check":"half cent discount","expected":[18,840],"passed":true},{"actual":[25,937],"check":"generated mix 15","expected":[25,937],"passed":true},{"actual":[18,820],"check":"tier edge","expected":[18,820],"passed":true},{"actual":[25,750],"check":"top tier","expected":[25,750],"passed":true},{"actual":[25,700],"check":"minimum capped by list","expected":[25,700],"passed":true},{"actual":[12,880],"check":"just under tier","expected":[12,880],"passed":true},{"actual":[18,1640],"check":"generated mix 6","expected":[18,1640],"passed":true},{"actual":[12,4399],"check":"generated mix 14","expected":[12,4399],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"half cent discount\", \"actual\": [18, 840], \"expected\": [18, 840], \"passed\": true}, {\"check\": \"generated mix 15\", \"actual\": [25, 937], \"expected\": [25, 937], \"passed\": true}, {\"check\": \"tier edge\", \"actual\": [18, 820], \"expected\": [18, 820], \"passed\": true}, {\"check\": \"top tier\", \"actual\": [25, 750], \"expected\": [25, 750], \"passed\": true}, {\"check\": \"minimum capped by list\", \"actual\": [25, 700], \"expected\": [25, 700], \"passed\": true}, {\"check\": \"just under tier\", \"actual\": [12, 880], \"expected\": [12, 880], \"passed\": true}, {\"check\": \"generated mix 6\", \"actual\": [18, 1640], \"expected\": [18, 1640], \"passed\": true}, {\"check\": \"generated mix 14\", \"actual\": [12, 4399], \"expected\": [12, 4399], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}