FAILURE MAP
← Case archive

FA-85801 / Ride-hailing fare and surge pricing / Open access

Member discount applied to fees · case 01

Members get 10% off the booking fee as well.

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

ROOT CAUSE

The discount base includes fees.

VERIFIED REPAIR

Discount only the surged fare.

Unsuccessful approach: Subtracting the fee share after flooring leaves a cent of fee discount on some fares.

Case contract

Membership is active if the flag is set and today is on or before the expiry day. Active members have surge capped at 2.0x (20 tenths) and, when the (capped) surge is at most 1.5x, get 10% off the surged fare (floored); fees are never discounted. Return the amount due in cents.

Why this case matters

Ride-hailing prices are computed per trip at scale; ordering, unit and boundary slips become systematic over- or under-charging.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(fare, member, now):
    active = member['active'] and now <= member['expires']
    surge = fare['surge']
    if active:
        surge = min(surge, 20)
    surged = (fare['core'] * surge * 2 + 10) // 20
    disc = 0
    if active and surge <= 15:
        disc = (surged + fare['fees']) // 10
    return surged - disc + fare['fees']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: fees excluded from discount',
   [{'core': 1234, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 100], 1578),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100], 2545),
  ('second regression', [{'core': 1234, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1578),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 101], 3702),
  ('normal control 2', [{'core': 999, 'fees': 250, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   2748),
  ('normal control 3', [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': False, 'expires': 100}, 101],
   1481),
  ('normal control 4', [{'core': 1000, 'fees': 199, 'surge': 17}, {'active': False, 'expires': 100}, 99],
   1899)],
 [('regression: fees excluded from discount',
   [{'core': 2555, 'fees': 199, 'surge': 15}, {'active': True, 'expires': 100}, 100], 3649),
  ('partial repair probe: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99], 1325),
  ('second regression', [{'core': 2555, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 100],
   3695),
  ('normal control 1', [{'core': 2555, 'fees': 250, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   3316),
  ('normal control 2', [{'core': 2555, 'fees': 245, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5355),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 15}, {'active': True, 'expires': 100}, 99], 3450),
  ('normal control 4', [{'core': 1000, 'fees': 245, 'surge': 17}, {'active': True, 'expires': 100}, 100],
   1945)],
 [('regression: fees excluded from discount',
   [{'core': 1000, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 99], 1595),
  ('partial repair probe: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 99], 1145),
  ('second regression', [{'core': 999, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 99],
   1595),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   1481),
  ('normal control 2', [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2718),
  ('normal control 3', [{'core': 999, 'fees': 250, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   2748),
  ('normal control 4', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2468)],
 [('regression: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100], 2545),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99], 3005),
  ('second regression', [{'core': 999, 'fees': 250, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   1150),
  ('normal control 1', [{'core': 1000, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 1700),
  ('normal control 2', [{'core': 1234, 'fees': 199, 'surge': 17}, {'active': True, 'expires': 100}, 101],
   2297),
  ('normal control 3', [{'core': 2555, 'fees': 245, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   5355),
  ('normal control 4', [{'core': 2555, 'fees': 245, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5355)],
 [('regression: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 100], 1325),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99], 2959),
  ('second regression', [{'core': 1000, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   1145),
  ('normal control 1', [{'core': 1000, 'fees': 0, 'surge': 15}, {'active': True, 'expires': 100}, 100], 1350),
  ('normal control 2', [{'core': 1000, 'fees': 250, 'surge': 17}, {'active': True, 'expires': 100}, 100],
   1950),
  ('normal control 3', [{'core': 1234, 'fees': 245, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   3330),
  ('normal control 4', [{'core': 999, 'fees': 0, 'surge': 15}, {'active': False, 'expires': 100}, 99], 1499)]]
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
regression: fees excluded from discount15541578Failed
partial repair probe: fees excluded from discount25202545Failed
second regression15541578Failed
normal control 137023702Passed
normal control 227482748Passed
normal control 314811481Passed
normal control 418991899Passed

SHA-256 / 70df2f3e8816806ff1d36c7450dd0e466c1715497a3f36dee6bc0633046d1d2a

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(fare, member, now):
    active = member['active'] and now <= member['expires']
    surge = fare['surge']
    if active:
        surge = min(surge, 20)
    surged = (fare['core'] * surge * 2 + 10) // 20
    disc = 0
    if active and surge <= 15:
        disc = (surged + fare['fees']) // 10 - fare['fees'] // 10
    return surged - disc + fare['fees']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: fees excluded from discount',
   [{'core': 1234, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 100], 1578),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100], 2545),
  ('second regression', [{'core': 1234, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1578),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 101], 3702),
  ('normal control 2', [{'core': 999, 'fees': 250, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   2748),
  ('normal control 3', [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': False, 'expires': 100}, 101],
   1481),
  ('normal control 4', [{'core': 1000, 'fees': 199, 'surge': 17}, {'active': False, 'expires': 100}, 99],
   1899)],
 [('regression: fees excluded from discount',
   [{'core': 2555, 'fees': 199, 'surge': 15}, {'active': True, 'expires': 100}, 100], 3649),
  ('partial repair probe: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99], 1325),
  ('second regression', [{'core': 2555, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 100],
   3695),
  ('normal control 1', [{'core': 2555, 'fees': 250, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   3316),
  ('normal control 2', [{'core': 2555, 'fees': 245, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5355),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 15}, {'active': True, 'expires': 100}, 99], 3450),
  ('normal control 4', [{'core': 1000, 'fees': 245, 'surge': 17}, {'active': True, 'expires': 100}, 100],
   1945)],
 [('regression: fees excluded from discount',
   [{'core': 1000, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 99], 1595),
  ('partial repair probe: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 99], 1145),
  ('second regression', [{'core': 999, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 99],
   1595),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   1481),
  ('normal control 2', [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2718),
  ('normal control 3', [{'core': 999, 'fees': 250, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   2748),
  ('normal control 4', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2468)],
 [('regression: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100], 2545),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99], 3005),
  ('second regression', [{'core': 999, 'fees': 250, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   1150),
  ('normal control 1', [{'core': 1000, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 1700),
  ('normal control 2', [{'core': 1234, 'fees': 199, 'surge': 17}, {'active': True, 'expires': 100}, 101],
   2297),
  ('normal control 3', [{'core': 2555, 'fees': 245, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   5355),
  ('normal control 4', [{'core': 2555, 'fees': 245, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5355)],
 [('regression: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 100], 1325),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99], 2959),
  ('second regression', [{'core': 1000, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   1145),
  ('normal control 1', [{'core': 1000, 'fees': 0, 'surge': 15}, {'active': True, 'expires': 100}, 100], 1350),
  ('normal control 2', [{'core': 1000, 'fees': 250, 'surge': 17}, {'active': True, 'expires': 100}, 100],
   1950),
  ('normal control 3', [{'core': 1234, 'fees': 245, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   3330),
  ('normal control 4', [{'core': 999, 'fees': 0, 'surge': 15}, {'active': False, 'expires': 100}, 99], 1499)]]
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
regression: fees excluded from discount15781578Passed
partial repair probe: fees excluded from discount25442545Failed
second regression15781578Passed
normal control 137023702Passed
normal control 227482748Passed
normal control 314811481Passed
normal control 418991899Passed

SHA-256 / 30c252efe6b101ac3c1eceb088b4ed0f337da8e0f237b884bfc54fc30c4dc01f

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(fare, member, now):
    active = member['active'] and now <= member['expires']
    surge = fare['surge']
    if active:
        surge = min(surge, 20)
    surged = (fare['core'] * surge * 2 + 10) // 20
    disc = 0
    if active and surge <= 15:
        disc = surged // 10
    return surged - disc + fare['fees']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: fees excluded from discount',
   [{'core': 1234, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 100], 1578),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100], 2545),
  ('second regression', [{'core': 1234, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1578),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 101], 3702),
  ('normal control 2', [{'core': 999, 'fees': 250, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   2748),
  ('normal control 3', [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': False, 'expires': 100}, 101],
   1481),
  ('normal control 4', [{'core': 1000, 'fees': 199, 'surge': 17}, {'active': False, 'expires': 100}, 99],
   1899)],
 [('regression: fees excluded from discount',
   [{'core': 2555, 'fees': 199, 'surge': 15}, {'active': True, 'expires': 100}, 100], 3649),
  ('partial repair probe: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99], 1325),
  ('second regression', [{'core': 2555, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 100],
   3695),
  ('normal control 1', [{'core': 2555, 'fees': 250, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   3316),
  ('normal control 2', [{'core': 2555, 'fees': 245, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5355),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 15}, {'active': True, 'expires': 100}, 99], 3450),
  ('normal control 4', [{'core': 1000, 'fees': 245, 'surge': 17}, {'active': True, 'expires': 100}, 100],
   1945)],
 [('regression: fees excluded from discount',
   [{'core': 1000, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 99], 1595),
  ('partial repair probe: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 99], 1145),
  ('second regression', [{'core': 999, 'fees': 245, 'surge': 15}, {'active': True, 'expires': 100}, 99],
   1595),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   1481),
  ('normal control 2', [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2718),
  ('normal control 3', [{'core': 999, 'fees': 250, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   2748),
  ('normal control 4', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2468)],
 [('regression: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100], 2545),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 99], 3005),
  ('second regression', [{'core': 999, 'fees': 250, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   1150),
  ('normal control 1', [{'core': 1000, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 1700),
  ('normal control 2', [{'core': 1234, 'fees': 199, 'surge': 17}, {'active': True, 'expires': 100}, 101],
   2297),
  ('normal control 3', [{'core': 2555, 'fees': 245, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   5355),
  ('normal control 4', [{'core': 2555, 'fees': 245, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5355)],
 [('regression: fees excluded from discount',
   [{'core': 999, 'fees': 245, 'surge': 12}, {'active': True, 'expires': 100}, 100], 1325),
  ('partial repair probe: fees excluded from discount',
   [{'core': 2555, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99], 2959),
  ('second regression', [{'core': 1000, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   1145),
  ('normal control 1', [{'core': 1000, 'fees': 0, 'surge': 15}, {'active': True, 'expires': 100}, 100], 1350),
  ('normal control 2', [{'core': 1000, 'fees': 250, 'surge': 17}, {'active': True, 'expires': 100}, 100],
   1950),
  ('normal control 3', [{'core': 1234, 'fees': 245, 'surge': 25}, {'active': False, 'expires': 100}, 100],
   3330),
  ('normal control 4', [{'core': 999, 'fees': 0, 'surge': 15}, {'active': False, 'expires': 100}, 99], 1499)]]
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
regression: fees excluded from discount15781578Passed
partial repair probe: fees excluded from discount25452545Passed
second regression15781578Passed
normal control 137023702Passed
normal control 227482748Passed
normal control 314811481Passed
normal control 418991899Passed

SHA-256 / d82be244b44a901524db41efaab076ab9d562ba1313e54bee707ce56980c74e5

Verification & scope

A deterministic toy pricing contract stipulated for this example; it does not reproduce the pricing of any real ride-hailing operator or regulator. 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:50:43.728740+00:00.

Case digest / b81695931fab73fa57e9165b69cacbb1f4c6764580f597ff0b2c929a6c7c9c3d