FAILURE MAP
← Case archive

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

Expired memberships still receive benefits · case 01

Former members keep the surge cap after lapsing.

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

ROOT CAUSE

The expiry day is not checked.

VERIFIED REPAIR

Require today to be on or before the expiry day.

Unsuccessful approach: A strict comparison ends the membership a day early.

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']
    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: membership expiry',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 101], 2800),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 0, 'surge': 25}, {'active': True, 'expires': 100}, 100], 5110),
  ('second regression', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2468),
  ('normal control 1', [{'core': 2555, 'fees': 199, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5309),
  ('normal control 2', [{'core': 999, 'fees': 250, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   2248),
  ('normal control 3', [{'core': 2555, 'fees': 199, 'surge': 30}, {'active': False, 'expires': 100}, 100],
   7864),
  ('normal control 4', [{'core': 2555, 'fees': 199, 'surge': 10}, {'active': False, 'expires': 100}, 100],
   2754)],
 [('regression: membership expiry',
   [{'core': 1000, 'fees': 0, 'surge': 25}, {'active': True, 'expires': 100}, 101], 2500),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 199, 'surge': 15}, {'active': True, 'expires': 100}, 100], 3649),
  ('second regression', [{'core': 1234, 'fees': 199, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2667),
  ('normal control 1', [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': False, 'expires': 100}, 101],
   3952),
  ('normal control 2', [{'core': 1000, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 1700),
  ('normal control 3', [{'core': 1000, 'fees': 250, 'surge': 15}, {'active': False, 'expires': 100}, 100],
   1750),
  ('normal control 4', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': False, 'expires': 100}, 101],
   3702)],
 [('regression: membership expiry',
   [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': True, 'expires': 100}, 101], 1481),
  ('partial repair probe: membership expiry',
   [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100], 2718),
  ('second regression', [{'core': 2555, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   5110),
  ('normal control 1', [{'core': 1234, 'fees': 250, 'surge': 20}, {'active': False, 'expires': 100}, 100],
   2718),
  ('normal control 2', [{'core': 999, 'fees': 199, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   2197),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 4344),
  ('normal control 4', [{'core': 2555, 'fees': 250, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   3316)],
 [('regression: membership expiry',
   [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 101], 3702),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100], 5110),
  ('second regression', [{'core': 999, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2248),
  ('normal control 1', [{'core': 1234, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1532),
  ('normal control 2', [{'core': 2555, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 4344),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 15}, {'active': False, 'expires': 100}, 101],
   3833),
  ('normal control 4', [{'core': 1234, 'fees': 199, 'surge': 10}, {'active': True, 'expires': 100}, 99],
   1310)],
 [('regression: membership expiry',
   [{'core': 999, 'fees': 0, 'surge': 12}, {'active': True, 'expires': 100}, 101], 1199),
  ('partial repair probe: membership expiry',
   [{'core': 1000, 'fees': 250, 'surge': 10}, {'active': True, 'expires': 100}, 100], 1150),
  ('second regression', [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   2545),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 17}, {'active': False, 'expires': 100}, 101],
   2098),
  ('normal control 2', [{'core': 1000, 'fees': 250, 'surge': 17}, {'active': False, 'expires': 100}, 101],
   1950),
  ('normal control 3', [{'core': 2555, 'fees': 250, 'surge': 15}, {'active': False, 'expires': 100}, 101],
   4083),
  ('normal control 4', [{'core': 1000, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1279)]]
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: membership expiry25452800Failed
partial repair probe: membership expiry51105110Passed
second regression24682468Passed
normal control 153095309Passed
normal control 222482248Passed
normal control 378647864Passed
normal control 427542754Passed

SHA-256 / f5e2cd8631d2f2602707a930846e5832ad76f970e4cb46181c8cc975ca5a4800

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 // 10
    return surged - disc + fare['fees']
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: membership expiry',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 101], 2800),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 0, 'surge': 25}, {'active': True, 'expires': 100}, 100], 5110),
  ('second regression', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2468),
  ('normal control 1', [{'core': 2555, 'fees': 199, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5309),
  ('normal control 2', [{'core': 999, 'fees': 250, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   2248),
  ('normal control 3', [{'core': 2555, 'fees': 199, 'surge': 30}, {'active': False, 'expires': 100}, 100],
   7864),
  ('normal control 4', [{'core': 2555, 'fees': 199, 'surge': 10}, {'active': False, 'expires': 100}, 100],
   2754)],
 [('regression: membership expiry',
   [{'core': 1000, 'fees': 0, 'surge': 25}, {'active': True, 'expires': 100}, 101], 2500),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 199, 'surge': 15}, {'active': True, 'expires': 100}, 100], 3649),
  ('second regression', [{'core': 1234, 'fees': 199, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2667),
  ('normal control 1', [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': False, 'expires': 100}, 101],
   3952),
  ('normal control 2', [{'core': 1000, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 1700),
  ('normal control 3', [{'core': 1000, 'fees': 250, 'surge': 15}, {'active': False, 'expires': 100}, 100],
   1750),
  ('normal control 4', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': False, 'expires': 100}, 101],
   3702)],
 [('regression: membership expiry',
   [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': True, 'expires': 100}, 101], 1481),
  ('partial repair probe: membership expiry',
   [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100], 2718),
  ('second regression', [{'core': 2555, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   5110),
  ('normal control 1', [{'core': 1234, 'fees': 250, 'surge': 20}, {'active': False, 'expires': 100}, 100],
   2718),
  ('normal control 2', [{'core': 999, 'fees': 199, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   2197),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 4344),
  ('normal control 4', [{'core': 2555, 'fees': 250, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   3316)],
 [('regression: membership expiry',
   [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 101], 3702),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100], 5110),
  ('second regression', [{'core': 999, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2248),
  ('normal control 1', [{'core': 1234, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1532),
  ('normal control 2', [{'core': 2555, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 4344),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 15}, {'active': False, 'expires': 100}, 101],
   3833),
  ('normal control 4', [{'core': 1234, 'fees': 199, 'surge': 10}, {'active': True, 'expires': 100}, 99],
   1310)],
 [('regression: membership expiry',
   [{'core': 999, 'fees': 0, 'surge': 12}, {'active': True, 'expires': 100}, 101], 1199),
  ('partial repair probe: membership expiry',
   [{'core': 1000, 'fees': 250, 'surge': 10}, {'active': True, 'expires': 100}, 100], 1150),
  ('second regression', [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   2545),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 17}, {'active': False, 'expires': 100}, 101],
   2098),
  ('normal control 2', [{'core': 1000, 'fees': 250, 'surge': 17}, {'active': False, 'expires': 100}, 101],
   1950),
  ('normal control 3', [{'core': 2555, 'fees': 250, 'surge': 15}, {'active': False, 'expires': 100}, 101],
   4083),
  ('normal control 4', [{'core': 1000, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1279)]]
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: membership expiry28002800Passed
partial repair probe: membership expiry63885110Failed
second regression37022468Failed
normal control 153095309Passed
normal control 222482248Passed
normal control 378647864Passed
normal control 427542754Passed

SHA-256 / ea4c1d7a47a9fd78b050a9f66bcb84cead20ac9ed2fc4a00efb92fb783c10536

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: membership expiry',
   [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 101], 2800),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 0, 'surge': 25}, {'active': True, 'expires': 100}, 100], 5110),
  ('second regression', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2468),
  ('normal control 1', [{'core': 2555, 'fees': 199, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   5309),
  ('normal control 2', [{'core': 999, 'fees': 250, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   2248),
  ('normal control 3', [{'core': 2555, 'fees': 199, 'surge': 30}, {'active': False, 'expires': 100}, 100],
   7864),
  ('normal control 4', [{'core': 2555, 'fees': 199, 'surge': 10}, {'active': False, 'expires': 100}, 100],
   2754)],
 [('regression: membership expiry',
   [{'core': 1000, 'fees': 0, 'surge': 25}, {'active': True, 'expires': 100}, 101], 2500),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 199, 'surge': 15}, {'active': True, 'expires': 100}, 100], 3649),
  ('second regression', [{'core': 1234, 'fees': 199, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2667),
  ('normal control 1', [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': False, 'expires': 100}, 101],
   3952),
  ('normal control 2', [{'core': 1000, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 1700),
  ('normal control 3', [{'core': 1000, 'fees': 250, 'surge': 15}, {'active': False, 'expires': 100}, 100],
   1750),
  ('normal control 4', [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': False, 'expires': 100}, 101],
   3702)],
 [('regression: membership expiry',
   [{'core': 1234, 'fees': 0, 'surge': 12}, {'active': True, 'expires': 100}, 101], 1481),
  ('partial repair probe: membership expiry',
   [{'core': 1234, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100], 2718),
  ('second regression', [{'core': 2555, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   5110),
  ('normal control 1', [{'core': 1234, 'fees': 250, 'surge': 20}, {'active': False, 'expires': 100}, 100],
   2718),
  ('normal control 2', [{'core': 999, 'fees': 199, 'surge': 20}, {'active': True, 'expires': 100}, 100],
   2197),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 4344),
  ('normal control 4', [{'core': 2555, 'fees': 250, 'surge': 12}, {'active': False, 'expires': 100}, 100],
   3316)],
 [('regression: membership expiry',
   [{'core': 1234, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 101], 3702),
  ('partial repair probe: membership expiry',
   [{'core': 2555, 'fees': 0, 'surge': 30}, {'active': True, 'expires': 100}, 100], 5110),
  ('second regression', [{'core': 999, 'fees': 250, 'surge': 30}, {'active': True, 'expires': 100}, 100],
   2248),
  ('normal control 1', [{'core': 1234, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1532),
  ('normal control 2', [{'core': 2555, 'fees': 0, 'surge': 17}, {'active': True, 'expires': 100}, 100], 4344),
  ('normal control 3', [{'core': 2555, 'fees': 0, 'surge': 15}, {'active': False, 'expires': 100}, 101],
   3833),
  ('normal control 4', [{'core': 1234, 'fees': 199, 'surge': 10}, {'active': True, 'expires': 100}, 99],
   1310)],
 [('regression: membership expiry',
   [{'core': 999, 'fees': 0, 'surge': 12}, {'active': True, 'expires': 100}, 101], 1199),
  ('partial repair probe: membership expiry',
   [{'core': 1000, 'fees': 250, 'surge': 10}, {'active': True, 'expires': 100}, 100], 1150),
  ('second regression', [{'core': 2555, 'fees': 245, 'surge': 10}, {'active': True, 'expires': 100}, 100],
   2545),
  ('normal control 1', [{'core': 1234, 'fees': 0, 'surge': 17}, {'active': False, 'expires': 100}, 101],
   2098),
  ('normal control 2', [{'core': 1000, 'fees': 250, 'surge': 17}, {'active': False, 'expires': 100}, 101],
   1950),
  ('normal control 3', [{'core': 2555, 'fees': 250, 'surge': 15}, {'active': False, 'expires': 100}, 101],
   4083),
  ('normal control 4', [{'core': 1000, 'fees': 199, 'surge': 12}, {'active': True, 'expires': 100}, 99],
   1279)]]
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: membership expiry28002800Passed
partial repair probe: membership expiry51105110Passed
second regression24682468Passed
normal control 153095309Passed
normal control 222482248Passed
normal control 378647864Passed
normal control 427542754Passed

SHA-256 / 66368a53e6c7fdb5072c3450fe296fba76b5c2c543095c601a331afc454bf82c

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

Case digest / 923634f6833db77c255fce15e6a6cd86be6116e3ac9f1d0b5c2975a774e14dce