FAILURE MAP
← Case archive

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

Grace period billed once exceeded · case 01

A wait one second past the grace is billed for the full wait including the free minutes.

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

ROOT CAUSE

After the grace test passes, the whole wait is billed.

VERIFIED REPAIR

Bill only the seconds beyond the grace period.

Unsuccessful approach: Adding one minute to the floored excess overbills exact minute multiples.

Case contract

Wait time starts at driver arrival, or at the scheduled pickup time if the ride was scheduled and the driver arrived early. The first grace seconds are free; beyond that each started minute is billed at per_min cents, up to cap_min billed minutes. Return the wait fee 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(ev, policy):
    start = ev['arrive'] if ev['scheduled'] is None else max(ev['arrive'], ev['scheduled'])
    wait = ev['board'] - start
    if wait <= policy['grace']:
        return 0
    minutes = -(-wait // 60)
    return min(minutes, policy['cap_min']) * policy['per_min']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: grace deduction',
   [{'arrive': 10000, 'board': 10301, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   50),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10600, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   200),
  ('second regression',
   [{'arrive': 10000, 'board': 10180, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11020, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   250),
  ('normal control 2',
   [{'arrive': 10000, 'board': 10600, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10181, 'scheduled': 9940}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 70),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   320),
  ('second regression',
   [{'arrive': 10000, 'board': 10301, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   80),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11483, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 25}],
   125)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 70),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10480, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   40),
  ('second regression',
   [{'arrive': 10000, 'board': 10180, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 35),
  ('normal control 1',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 25}],
   125),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11020, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 35}],
   350),
  ('normal control 3',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 35}],
   350),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10600, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10121, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10300, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   40),
  ('second regression',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 25}], 50),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11487, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   250),
  ('normal control 2',
   [{'arrive': 10000, 'board': 10000, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10120, 'scheduled': 10120}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10120, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 0)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10121, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10480, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   25),
  ('second regression',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 50),
  ('normal control 1',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 0),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 40}], 0)]]
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: grace deduction10050Failed
partial repair probe: grace deduction250200Failed
second regression7525Failed
normal control 1250250Passed
normal control 2175175Passed
normal control 300Passed
normal control 4200200Passed

SHA-256 / 52a1e636e35c67789f9531899a32d8aa105540a9f5d0247b3c656dd0a0d484bf

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(ev, policy):
    start = ev['arrive'] if ev['scheduled'] is None else max(ev['arrive'], ev['scheduled'])
    wait = ev['board'] - start
    if wait <= policy['grace']:
        return 0
    minutes = (wait - policy['grace']) // 60 + 1
    return min(minutes, policy['cap_min']) * policy['per_min']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: grace deduction',
   [{'arrive': 10000, 'board': 10301, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   50),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10600, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   200),
  ('second regression',
   [{'arrive': 10000, 'board': 10180, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11020, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   250),
  ('normal control 2',
   [{'arrive': 10000, 'board': 10600, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10181, 'scheduled': 9940}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 70),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   320),
  ('second regression',
   [{'arrive': 10000, 'board': 10301, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   80),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11483, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 25}],
   125)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 70),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10480, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   40),
  ('second regression',
   [{'arrive': 10000, 'board': 10180, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 35),
  ('normal control 1',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 25}],
   125),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11020, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 35}],
   350),
  ('normal control 3',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 35}],
   350),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10600, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10121, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10300, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   40),
  ('second regression',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 25}], 50),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11487, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   250),
  ('normal control 2',
   [{'arrive': 10000, 'board': 10000, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10120, 'scheduled': 10120}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10120, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 0)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10121, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10480, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   25),
  ('second regression',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 50),
  ('normal control 1',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 0),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 40}], 0)]]
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: grace deduction5050Passed
partial repair probe: grace deduction225200Failed
second regression5025Failed
normal control 1250250Passed
normal control 2175175Passed
normal control 300Passed
normal control 4200200Passed

SHA-256 / e063f54485efa1b386518ac2e01cc6dd4818f49a010879f0d13b8b54c96072de

3 / The verified repair

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

N = 1
observations = []
def solve(ev, policy):
    start = ev['arrive'] if ev['scheduled'] is None else max(ev['arrive'], ev['scheduled'])
    wait = ev['board'] - start
    if wait <= policy['grace']:
        return 0
    minutes = -(-(wait - policy['grace']) // 60)
    return min(minutes, policy['cap_min']) * policy['per_min']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: grace deduction',
   [{'arrive': 10000, 'board': 10301, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   50),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10600, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   200),
  ('second regression',
   [{'arrive': 10000, 'board': 10180, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11020, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   250),
  ('normal control 2',
   [{'arrive': 10000, 'board': 10600, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10181, 'scheduled': 9940}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 70),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   320),
  ('second regression',
   [{'arrive': 10000, 'board': 10301, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   80),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11483, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 25}],
   125)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 70),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10480, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   40),
  ('second regression',
   [{'arrive': 10000, 'board': 10180, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 35),
  ('normal control 1',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 25}],
   125),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11020, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 35}],
   350),
  ('normal control 3',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 35}],
   350),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10600, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10121, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10300, 'scheduled': 10120}, {'cap_min': 10, 'grace': 120, 'per_min': 40}],
   40),
  ('second regression',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 25}], 50),
  ('normal control 1',
   [{'arrive': 10000, 'board': 11487, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   250),
  ('normal control 2',
   [{'arrive': 10000, 'board': 10000, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10120, 'scheduled': 10120}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 0),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10120, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 35}], 0)],
 [('regression: grace deduction',
   [{'arrive': 10000, 'board': 10121, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 25),
  ('partial repair probe: grace deduction',
   [{'arrive': 10000, 'board': 10480, 'scheduled': 10300}, {'cap_min': 10, 'grace': 120, 'per_min': 25}],
   25),
  ('second regression',
   [{'arrive': 10000, 'board': 10181, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 50),
  ('normal control 1',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 5, 'grace': 120, 'per_min': 25}], 0),
  ('normal control 2',
   [{'arrive': 10000, 'board': 11200, 'scheduled': 10300}, {'cap_min': 5, 'grace': 120, 'per_min': 40}],
   200),
  ('normal control 3',
   [{'arrive': 10000, 'board': 10900, 'scheduled': 9940}, {'cap_min': 5, 'grace': 120, 'per_min': 35}], 175),
  ('normal control 4',
   [{'arrive': 10000, 'board': 10000, 'scheduled': None}, {'cap_min': 10, 'grace': 120, 'per_min': 40}], 0)]]
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: grace deduction5050Passed
partial repair probe: grace deduction200200Passed
second regression2525Passed
normal control 1250250Passed
normal control 2175175Passed
normal control 300Passed
normal control 4200200Passed

SHA-256 / 8c16965b43e968f6f9c6e5f3649ef9a2806e49910467f586677b9683e45a35ff

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

Case digest / 61d386c6ca745f8995a2873e64bc5ec13c79244fa0c7808e8e3435354c4ea864