FAILURE MAP
← Case archive

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

Quick long pickup reduces the distance fee · case 01

A fast long-distance pickup gets a negative time component that offsets the distance fee.

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

ROOT CAUSE

Time excess is not clamped at zero.

VERIFIED REPAIR

Clamp the time excess at zero.

Unsuccessful approach: Absolute value charges time for pickups under the threshold.

Case contract

A long-pickup fee compensates drivers for pickups beyond thr_m meters and thr_s seconds. The distance part is per_km on meters beyond thr_m (prorated, half up); the time part is per_min on each started minute beyond thr_s; each part uses only its own positive excess. The total is capped at cap 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(pickup_m, pickup_s, policy):
    ex_m = max(0, pickup_m - policy['thr_m'])
    ex_s = pickup_s - policy['thr_s']
    fee = (ex_m * policy['per_km'] * 2 + 1000) // 2000 + -(-ex_s // 60) * policy['per_min']
    return min(fee, policy['cap'])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative time excess',
   [3000, 300, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4800, 300, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [3000, 300, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [4801, 900, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225),
  ('normal control 2', [4801, 600, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 3', [2000, 600, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 4', [2000, 600, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0)],
 [('regression: negative time excess',
   [4800, 400, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4800, 400, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [4800, 400, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [6000, 601, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   117),
  ('normal control 2', [3000, 900, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150),
  ('normal control 3', [6000, 660, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   138),
  ('normal control 4', [3000, 600, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0)],
 [('regression: negative time excess',
   [2000, 300, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [12000, 300, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 432),
  ('second regression', [2000, 400, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [4801, 660, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 2', [6000, 900, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   222),
  ('normal control 3', [3000, 900, {'cap': 900, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225),
  ('normal control 4', [4800, 900, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225)],
 [('regression: negative time excess',
   [12000, 400, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 432),
  ('partial repair probe: negative time excess',
   [2000, 400, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [3000, 300, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [2000, 660, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   45),
  ('normal control 2', [4800, 601, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 3', [2000, 900, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150),
  ('normal control 4', [3000, 900, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150)],
 [('regression: negative time excess',
   [4801, 400, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4801, 300, {'cap': 900, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [12000, 300, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   648),
  ('normal control 1', [2000, 600, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 2', [4801, 600, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 3', [3000, 601, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 4', [2000, 660, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   45)]]
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: negative time excess-2250Failed
partial repair probe: negative time excess-2250Failed
second regression-2250Failed
normal control 1225225Passed
normal control 200Passed
normal control 300Passed
normal control 400Passed

SHA-256 / 1fda1e5d8657b5bfa7ad587610a35bf8001c508844836cf6d4d1b890d314f512

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(pickup_m, pickup_s, policy):
    ex_m = max(0, pickup_m - policy['thr_m'])
    ex_s = abs(pickup_s - policy['thr_s'])
    fee = (ex_m * policy['per_km'] * 2 + 1000) // 2000 + -(-ex_s // 60) * policy['per_min']
    return min(fee, policy['cap'])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative time excess',
   [3000, 300, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4800, 300, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [3000, 300, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [4801, 900, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225),
  ('normal control 2', [4801, 600, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 3', [2000, 600, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 4', [2000, 600, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0)],
 [('regression: negative time excess',
   [4800, 400, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4800, 400, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [4800, 400, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [6000, 601, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   117),
  ('normal control 2', [3000, 900, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150),
  ('normal control 3', [6000, 660, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   138),
  ('normal control 4', [3000, 600, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0)],
 [('regression: negative time excess',
   [2000, 300, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [12000, 300, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 432),
  ('second regression', [2000, 400, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [4801, 660, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 2', [6000, 900, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   222),
  ('normal control 3', [3000, 900, {'cap': 900, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225),
  ('normal control 4', [4800, 900, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225)],
 [('regression: negative time excess',
   [12000, 400, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 432),
  ('partial repair probe: negative time excess',
   [2000, 400, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [3000, 300, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [2000, 660, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   45),
  ('normal control 2', [4800, 601, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 3', [2000, 900, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150),
  ('normal control 4', [3000, 900, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150)],
 [('regression: negative time excess',
   [4801, 400, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4801, 300, {'cap': 900, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [12000, 300, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   648),
  ('normal control 1', [2000, 600, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 2', [4801, 600, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 3', [3000, 601, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 4', [2000, 660, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   45)]]
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: negative time excess2250Failed
partial repair probe: negative time excess2250Failed
second regression2250Failed
normal control 1225225Passed
normal control 200Passed
normal control 300Passed
normal control 400Passed

SHA-256 / 379c862955d63280a1b7ec596e94bf41538b0011ae508b6e0adc017390b1adf7

3 / The verified repair

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

N = 1
observations = []
def solve(pickup_m, pickup_s, policy):
    ex_m = max(0, pickup_m - policy['thr_m'])
    ex_s = max(0, pickup_s - policy['thr_s'])
    fee = (ex_m * policy['per_km'] * 2 + 1000) // 2000 + -(-ex_s // 60) * policy['per_min']
    return min(fee, policy['cap'])
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: negative time excess',
   [3000, 300, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4800, 300, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [3000, 300, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [4801, 900, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225),
  ('normal control 2', [4801, 600, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 3', [2000, 600, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 4', [2000, 600, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0)],
 [('regression: negative time excess',
   [4800, 400, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4800, 400, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [4800, 400, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [6000, 601, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   117),
  ('normal control 2', [3000, 900, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150),
  ('normal control 3', [6000, 660, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   138),
  ('normal control 4', [3000, 600, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0)],
 [('regression: negative time excess',
   [2000, 300, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [12000, 300, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}], 432),
  ('second regression', [2000, 400, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [4801, 660, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 2', [6000, 900, {'cap': 600, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   222),
  ('normal control 3', [3000, 900, {'cap': 900, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225),
  ('normal control 4', [4800, 900, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   225)],
 [('regression: negative time excess',
   [12000, 400, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 432),
  ('partial repair probe: negative time excess',
   [2000, 400, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [3000, 300, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 1', [2000, 660, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   45),
  ('normal control 2', [4800, 601, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 3', [2000, 900, {'cap': 900, 'per_km': 60, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150),
  ('normal control 4', [3000, 900, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   150)],
 [('regression: negative time excess',
   [4801, 400, {'cap': 600, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('partial repair probe: negative time excess',
   [4801, 300, {'cap': 900, 'per_km': 90, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}], 0),
  ('second regression', [12000, 300, {'cap': 900, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   648),
  ('normal control 1', [2000, 600, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 2', [4801, 600, {'cap': 900, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   0),
  ('normal control 3', [3000, 601, {'cap': 600, 'per_km': 90, 'per_min': 30, 'thr_m': 4800, 'thr_s': 600}],
   30),
  ('normal control 4', [2000, 660, {'cap': 600, 'per_km': 60, 'per_min': 45, 'thr_m': 4800, 'thr_s': 600}],
   45)]]
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: negative time excess00Passed
partial repair probe: negative time excess00Passed
second regression00Passed
normal control 1225225Passed
normal control 200Passed
normal control 300Passed
normal control 400Passed

SHA-256 / 564d25f00e8a2507706ebd3c408fef9e46009d6e3e801c72d9289284ab9c91c6

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:42.487826+00:00.

Case digest / be5a4be4b34a31b259173a939100c39aee2185f747efb54632b6123b2d3d8559