{"abstract":"Downgrades report a collection below the fee, sometimes negative.","category":"Airline fare rule evaluation","checks":10,"contract":"Input {'paid','new_fare','fee','fee_pct','fee_rule' FLAT|HIGHER,'residual' CREDIT|FORFEIT,'waiver_h','hours_since_ticket'}. Fee waived when hours_since_ticket <= waiver_h; FLAT fee = fee; HIGHER = max(fee, fee_pct% of the original paid fare). Collect = max(0, new-paid) + fee; residual credit = max(0, paid-new) only when residual is CREDIT (the fee is never netted against credit). Return [collect, credit] rounded 2.","evaluation_group":"w2-airline-fare-rules-voluntary-change-fee","failed_approach":"Using the absolute difference charges customers for downgrading.","family":"w2-airline-fare-rules-voluntary-change-fee-negative-difference","id":"FA-66476","implementations":{"attempt":{"sha256":"054221a64b1b428c3e654bb1dbc931a06de18fabdaa87845caeda7275510f175","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    paid, new = x['paid'], x['new_fare']\n    if x['hours_since_ticket'] <= x['waiver_h']:\n        fee = 0.0\n    elif x['fee_rule'] == 'FLAT':\n        fee = x['fee']\n    else:\n        fee = max(x['fee'], x['fee_pct'] * paid / 100)\n    collect = abs(new - paid) + fee\n    credit = max(0.0, paid - new) if x['residual'] == 'CREDIT' else 0.0\n    return [round(collect, 2), round(credit, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1101.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [291.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 51}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 421.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 310.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 0.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 945.21, 'new_fare': 746.1, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 397}, [141.78, 0.0]], ['sampled case 2', {'paid': 616.49, 'new_fare': 852.38, 'fee': 150.0, 'fee_pct': 10, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [385.89, 0.0]], ['sampled case 3', {'paid': 832.44, 'new_fare': 589.1, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [0.0, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1102.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [292.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 52}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 422.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 320.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 10.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 187.06, 'new_fare': 196.65, 'fee': 150.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [9.59, 0.0]], ['sampled case 2', {'paid': 1518.15, 'new_fare': 1549.03, 'fee': 150.0, 'fee_pct': 20, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [30.88, 0.0]], ['sampled case 3', {'paid': 1212.02, 'new_fare': 1432.47, 'fee': 100.0, 'fee_pct': 5, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 49}, [320.45, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1103.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [293.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 53}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 423.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 330.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 20.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 1440.92, 'new_fare': 1296.99, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [0.0, 143.93]], ['sampled case 2', {'paid': 1622.18, 'new_fare': 873.9, 'fee': 150.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [243.33, 0.0]], ['sampled case 3', {'paid': 1642.66, 'new_fare': 1568.49, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 48}, [0.0, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1104.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [294.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 54}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 424.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 340.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 30.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 1227.57, 'new_fare': 1031.14, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [245.51, 0.0]], ['sampled case 2', {'paid': 762.01, 'new_fare': 1039.32, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [277.31, 0.0]], ['sampled case 3', {'paid': 1675.54, 'new_fare': 1027.22, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [0.0, 648.32]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1105.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [295.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 55}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 425.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 350.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 40.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 938.24, 'new_fare': 955.89, 'fee': 100.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'waiver_h': 48, 'hours_since_ticket': 57.2}, [117.65, 0.0]], ['sampled case 2', {'paid': 1989.4, 'new_fare': 2128.3, 'fee': 150.0, 'fee_pct': 10, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 12.8}, [138.9, 0.0]], ['sampled case 3', {'paid': 1315.4, 'new_fare': 1527.5, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [212.1, 0.0]]]]\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":"efb5b63cf0798792ce09199059ff82a4a8e84bb8a700cde690862b172a681179","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    paid, new = x['paid'], x['new_fare']\n    if x['hours_since_ticket'] <= x['waiver_h']:\n        fee = 0.0\n    elif x['fee_rule'] == 'FLAT':\n        fee = x['fee']\n    else:\n        fee = max(x['fee'], x['fee_pct'] * paid / 100)\n    collect = (new - paid) + fee\n    credit = max(0.0, paid - new) if x['residual'] == 'CREDIT' else 0.0\n    return [round(collect, 2), round(credit, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1101.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [291.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 51}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 421.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 310.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 0.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 945.21, 'new_fare': 746.1, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 397}, [141.78, 0.0]], ['sampled case 2', {'paid': 616.49, 'new_fare': 852.38, 'fee': 150.0, 'fee_pct': 10, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [385.89, 0.0]], ['sampled case 3', {'paid': 832.44, 'new_fare': 589.1, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [0.0, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1102.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [292.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 52}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 422.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 320.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 10.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 187.06, 'new_fare': 196.65, 'fee': 150.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [9.59, 0.0]], ['sampled case 2', {'paid': 1518.15, 'new_fare': 1549.03, 'fee': 150.0, 'fee_pct': 20, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [30.88, 0.0]], ['sampled case 3', {'paid': 1212.02, 'new_fare': 1432.47, 'fee': 100.0, 'fee_pct': 5, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 49}, [320.45, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1103.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [293.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 53}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 423.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 330.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 20.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 1440.92, 'new_fare': 1296.99, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [0.0, 143.93]], ['sampled case 2', {'paid': 1622.18, 'new_fare': 873.9, 'fee': 150.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [243.33, 0.0]], ['sampled case 3', {'paid': 1642.66, 'new_fare': 1568.49, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 48}, [0.0, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1104.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [294.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 54}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 424.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 340.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 30.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 1227.57, 'new_fare': 1031.14, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [245.51, 0.0]], ['sampled case 2', {'paid': 762.01, 'new_fare': 1039.32, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [277.31, 0.0]], ['sampled case 3', {'paid': 1675.54, 'new_fare': 1027.22, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [0.0, 648.32]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1105.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [295.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 55}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 425.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 350.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 40.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 938.24, 'new_fare': 955.89, 'fee': 100.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'waiver_h': 48, 'hours_since_ticket': 57.2}, [117.65, 0.0]], ['sampled case 2', {'paid': 1989.4, 'new_fare': 2128.3, 'fee': 150.0, 'fee_pct': 10, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 12.8}, [138.9, 0.0]], ['sampled case 3', {'paid': 1315.4, 'new_fare': 1527.5, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [212.1, 0.0]]]]\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":"62966235379743b4049403fd2564a334b52d40c96eae5386430cd1cd4ca5a9a8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    paid, new = x['paid'], x['new_fare']\n    if x['hours_since_ticket'] <= x['waiver_h']:\n        fee = 0.0\n    elif x['fee_rule'] == 'FLAT':\n        fee = x['fee']\n    else:\n        fee = max(x['fee'], x['fee_pct'] * paid / 100)\n    collect = max(0.0, new - paid) + fee\n    credit = max(0.0, paid - new) if x['residual'] == 'CREDIT' else 0.0\n    return [round(collect, 2), round(credit, 2)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1101.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [291.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 51}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 421.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 310.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 0.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 945.21, 'new_fare': 746.1, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 397}, [141.78, 0.0]], ['sampled case 2', {'paid': 616.49, 'new_fare': 852.38, 'fee': 150.0, 'fee_pct': 10, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [385.89, 0.0]], ['sampled case 3', {'paid': 832.44, 'new_fare': 589.1, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [0.0, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1102.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [292.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 52}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 422.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 320.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 10.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 187.06, 'new_fare': 196.65, 'fee': 150.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [9.59, 0.0]], ['sampled case 2', {'paid': 1518.15, 'new_fare': 1549.03, 'fee': 150.0, 'fee_pct': 20, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [30.88, 0.0]], ['sampled case 3', {'paid': 1212.02, 'new_fare': 1432.47, 'fee': 100.0, 'fee_pct': 5, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 49}, [320.45, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1103.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [293.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 53}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 423.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 330.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 20.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 1440.92, 'new_fare': 1296.99, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [0.0, 143.93]], ['sampled case 2', {'paid': 1622.18, 'new_fare': 873.9, 'fee': 150.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [243.33, 0.0]], ['sampled case 3', {'paid': 1642.66, 'new_fare': 1568.49, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 48}, [0.0, 0.0]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1104.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [294.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 54}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 424.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 340.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 30.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 1227.57, 'new_fare': 1031.14, 'fee': 75.0, 'fee_pct': 20, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 48}, [245.51, 0.0]], ['sampled case 2', {'paid': 762.01, 'new_fare': 1039.32, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [277.31, 0.0]], ['sampled case 3', {'paid': 1675.54, 'new_fare': 1027.22, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'waiver_h': 24, 'hours_since_ticket': 24}, [0.0, 648.32]]], [['upgrade HIGHER rule', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 900.0, 'new_fare': 1105.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 100}, [295.0, 0.0]], ['downgrade with credit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 450.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 55}, [75.0, 150.0]], ['downgrade forfeit', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 600.0, 'new_fare': 425.0, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'hours_since_ticket': 72}, [75.0, 0.0]], ['exactly 24h after ticketing', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 520.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 24}, [20.0, 0.0]], ['cheap fare minimum fee', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 350.0, 'new_fare': 310.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 30}, [75.0, 40.0]], ['pct fee exceeds flat', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 1500.0, 'new_fare': 1200.0, 'fee_rule': 'HIGHER', 'residual': 'CREDIT', 'hours_since_ticket': 200}, [150.0, 300.0]], ['fee larger than residual', {'waiver_h': 24, 'fee': 75.0, 'fee_pct': 10, 'paid': 500.0, 'new_fare': 460.0, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'hours_since_ticket': 48}, [75.0, 40.0]], ['sampled case 1', {'paid': 938.24, 'new_fare': 955.89, 'fee': 100.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'CREDIT', 'waiver_h': 48, 'hours_since_ticket': 57.2}, [117.65, 0.0]], ['sampled case 2', {'paid': 1989.4, 'new_fare': 2128.3, 'fee': 150.0, 'fee_pct': 10, 'fee_rule': 'HIGHER', 'residual': 'FORFEIT', 'waiver_h': 24, 'hours_since_ticket': 12.8}, [138.9, 0.0]], ['sampled case 3', {'paid': 1315.4, 'new_fare': 1527.5, 'fee': 50.0, 'fee_pct': 15, 'fee_rule': 'FLAT', 'residual': 'FORFEIT', 'waiver_h': 48, 'hours_since_ticket': 24}, [212.1, 0.0]]]]\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":"A stipulated toy fare-rule contract with invented constants; it is not an ATPCO or carrier tariff implementation and makes no claim of industry-standard conformance. 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-airline-fare-rules-voluntary-change-fee-negative-difference","generated_at":"2026-09-29T14:47:44.136510+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Voluntary change pricing combines a fare difference, a penalty with a higher-of rule, a free-change window and residual value handling.","repair":"Clamp the collected fare difference at zero.","root_cause":"The fare difference is not clamped at zero before the fee is added.","sha256":"e6f43267ba78d444a96f224b1604e1a59b425c4eec1ac9ff68aafa7ac47100ff","title":"Downgrade fare difference reduces the amount collected · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.559,"exit_code":1,"observations":[{"actual":[291.0,0.0],"check":"upgrade HIGHER rule","expected":[291.0,0.0],"passed":true},{"actual":[225.0,150.0],"check":"downgrade with credit","expected":[75.0,150.0],"passed":false},{"actual":[254.0,0.0],"check":"downgrade forfeit","expected":[75.0,0.0],"passed":false},{"actual":[20.0,0.0],"check":"exactly 24h after ticketing","expected":[20.0,0.0],"passed":true},{"actual":[75.0,0.0],"check":"cheap fare minimum fee","expected":[75.0,0.0],"passed":true},{"actual":[450.0,300.0],"check":"pct fee exceeds flat","expected":[150.0,300.0],"passed":false},{"actual":[115.0,40.0],"check":"fee larger than residual","expected":[75.0,40.0],"passed":false},{"actual":[340.89,0.0],"check":"sampled case 1","expected":[141.78,0.0],"passed":false},{"actual":[385.89,0.0],"check":"sampled case 2","expected":[385.89,0.0],"passed":true},{"actual":[243.34,0.0],"check":"sampled case 3","expected":[0.0,0.0],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"upgrade HIGHER rule\", \"actual\": [291.0, 0.0], \"expected\": [291.0, 0.0], \"passed\": true}, {\"check\": \"downgrade with credit\", \"actual\": [225.0, 150.0], \"expected\": [75.0, 150.0], \"passed\": false}, {\"check\": \"downgrade forfeit\", \"actual\": [254.0, 0.0], \"expected\": [75.0, 0.0], \"passed\": false}, {\"check\": \"exactly 24h after ticketing\", \"actual\": [20.0, 0.0], \"expected\": [20.0, 0.0], \"passed\": true}, {\"check\": \"cheap fare minimum fee\", \"actual\": [75.0, 0.0], \"expected\": [75.0, 0.0], \"passed\": true}, {\"check\": \"pct fee exceeds flat\", \"actual\": [450.0, 300.0], \"expected\": [150.0, 300.0], \"passed\": false}, {\"check\": \"fee larger than residual\", \"actual\": [115.0, 40.0], \"expected\": [75.0, 40.0], \"passed\": false}, {\"check\": \"sampled case 1\", \"actual\": [340.89, 0.0], \"expected\": [141.78, 0.0], \"passed\": false}, {\"check\": \"sampled case 2\", \"actual\": [385.89, 0.0], \"expected\": [385.89, 0.0], \"passed\": true}, {\"check\": \"sampled case 3\", \"actual\": [243.34, 0.0], \"expected\": [0.0, 0.0], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.523,"exit_code":1,"observations":[{"actual":[291.0,0.0],"check":"upgrade HIGHER rule","expected":[291.0,0.0],"passed":true},{"actual":[-75.0,150.0],"check":"downgrade with credit","expected":[75.0,150.0],"passed":false},{"actual":[-104.0,0.0],"check":"downgrade forfeit","expected":[75.0,0.0],"passed":false},{"actual":[20.0,0.0],"check":"exactly 24h after ticketing","expected":[20.0,0.0],"passed":true},{"actual":[75.0,0.0],"check":"cheap fare minimum fee","expected":[75.0,0.0],"passed":true},{"actual":[-150.0,300.0],"check":"pct fee exceeds flat","expected":[150.0,300.0],"passed":false},{"actual":[35.0,40.0],"check":"fee larger than residual","expected":[75.0,40.0],"passed":false},{"actual":[-57.33,0.0],"check":"sampled case 1","expected":[141.78,0.0],"passed":false},{"actual":[385.89,0.0],"check":"sampled case 2","expected":[385.89,0.0],"passed":true},{"actual":[-243.34,0.0],"check":"sampled case 3","expected":[0.0,0.0],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"upgrade HIGHER rule\", \"actual\": [291.0, 0.0], \"expected\": [291.0, 0.0], \"passed\": true}, {\"check\": \"downgrade with credit\", \"actual\": [-75.0, 150.0], \"expected\": [75.0, 150.0], \"passed\": false}, {\"check\": \"downgrade forfeit\", \"actual\": [-104.0, 0.0], \"expected\": [75.0, 0.0], \"passed\": false}, {\"check\": \"exactly 24h after ticketing\", \"actual\": [20.0, 0.0], \"expected\": [20.0, 0.0], \"passed\": true}, {\"check\": \"cheap fare minimum fee\", \"actual\": [75.0, 0.0], \"expected\": [75.0, 0.0], \"passed\": true}, {\"check\": \"pct fee exceeds flat\", \"actual\": [-150.0, 300.0], \"expected\": [150.0, 300.0], \"passed\": false}, {\"check\": \"fee larger than residual\", \"actual\": [35.0, 40.0], \"expected\": [75.0, 40.0], \"passed\": false}, {\"check\": \"sampled case 1\", \"actual\": [-57.33, 0.0], \"expected\": [141.78, 0.0], \"passed\": false}, {\"check\": \"sampled case 2\", \"actual\": [385.89, 0.0], \"expected\": [385.89, 0.0], \"passed\": true}, {\"check\": \"sampled case 3\", \"actual\": [-243.34, 0.0], \"expected\": [0.0, 0.0], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":40.294,"exit_code":0,"observations":[{"actual":[291.0,0.0],"check":"upgrade HIGHER rule","expected":[291.0,0.0],"passed":true},{"actual":[75.0,150.0],"check":"downgrade with credit","expected":[75.0,150.0],"passed":true},{"actual":[75.0,0.0],"check":"downgrade forfeit","expected":[75.0,0.0],"passed":true},{"actual":[20.0,0.0],"check":"exactly 24h after ticketing","expected":[20.0,0.0],"passed":true},{"actual":[75.0,0.0],"check":"cheap fare minimum fee","expected":[75.0,0.0],"passed":true},{"actual":[150.0,300.0],"check":"pct fee exceeds flat","expected":[150.0,300.0],"passed":true},{"actual":[75.0,40.0],"check":"fee larger than residual","expected":[75.0,40.0],"passed":true},{"actual":[141.78,0.0],"check":"sampled case 1","expected":[141.78,0.0],"passed":true},{"actual":[385.89,0.0],"check":"sampled case 2","expected":[385.89,0.0],"passed":true},{"actual":[0.0,0.0],"check":"sampled case 3","expected":[0.0,0.0],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"upgrade HIGHER rule\", \"actual\": [291.0, 0.0], \"expected\": [291.0, 0.0], \"passed\": true}, {\"check\": \"downgrade with credit\", \"actual\": [75.0, 150.0], \"expected\": [75.0, 150.0], \"passed\": true}, {\"check\": \"downgrade forfeit\", \"actual\": [75.0, 0.0], \"expected\": [75.0, 0.0], \"passed\": true}, {\"check\": \"exactly 24h after ticketing\", \"actual\": [20.0, 0.0], \"expected\": [20.0, 0.0], \"passed\": true}, {\"check\": \"cheap fare minimum fee\", \"actual\": [75.0, 0.0], \"expected\": [75.0, 0.0], \"passed\": true}, {\"check\": \"pct fee exceeds flat\", \"actual\": [150.0, 300.0], \"expected\": [150.0, 300.0], \"passed\": true}, {\"check\": \"fee larger than residual\", \"actual\": [75.0, 40.0], \"expected\": [75.0, 40.0], \"passed\": true}, {\"check\": \"sampled case 1\", \"actual\": [141.78, 0.0], \"expected\": [141.78, 0.0], \"passed\": true}, {\"check\": \"sampled case 2\", \"actual\": [385.89, 0.0], \"expected\": [385.89, 0.0], \"passed\": true}, {\"check\": \"sampled case 3\", \"actual\": [0.0, 0.0], \"expected\": [0.0, 0.0], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}