{"abstract":"Riders adding the third allowed stop get an error.","category":"Ride-hailing fare and surge pricing","checks":7,"contract":"Intermediate stops each add stop_fee; up to max_stops stops are allowed, more is an error. Each stop has its own free waiting allowance of free_wait seconds; waiting beyond it at that stop is billed per started minute at per_min. Return the stop fee total in cents.","contract_signature":"stops, policy","evaluation_group":"w2-ride-hailing-fare-surge-multi-stop-fees","failed_approach":"Allowing one extra stop accepts a fourth stop.","family":"w2-ride-hailing-fare-surge-multi-stop-fees-stop-limit","id":"FA-85701","implementations":{"attempt":{"sha256":"fe1c6b69ae8622bdba59065e2593eb67f64d62e5d6143c4f14a914ee4afc0ffe","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(stops, policy):\n    if len(stops) > policy['max_stops'] + 1:\n        return {'error': 'too_many_stops'}\n    waits = [s['wait_s'] for s in stops]\n    fee = policy['stop_fee'] * len(stops)\n    for w in waits:\n        over = w - policy['free_wait']\n        if over > 0:\n            fee += -(-over // 60) * policy['per_min']\n    return {'fee': fee}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: stop limit',\n   [[{'wait_s': 300}, {'wait_s': 420}, {'wait_s': 170}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 690}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 180}, {'wait_s': 240}, {'wait_s': 181}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 420}, {'wait_s': 60}, {'wait_s': 420}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 770}),\n  ('normal control 1', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}], {'fee': 0}),\n  ('normal control 2',\n   [[{'wait_s': 170}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 100}),\n  ('normal control 3',\n   [[{'wait_s': 300}, {'wait_s': 240}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'fee': 290}),\n  ('normal control 4', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 0})],\n [('regression: stop limit',\n   [[{'wait_s': 0}, {'wait_s': 420}, {'wait_s': 240}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'fee': 500}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 170}, {'wait_s': 300}, {'wait_s': 180}, {'wait_s': 240}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 420}, {'wait_s': 181}, {'wait_s': 300}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 730}),\n  ('normal control 1',\n   [[{'wait_s': 181}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 140}),\n  ('normal control 2',\n   [[{'wait_s': 181}, {'wait_s': 181}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'fee': 360}),\n  ('normal control 3',\n   [[{'wait_s': 180}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 100}),\n  ('normal control 4',\n   [[{'wait_s': 180}, {'wait_s': 300}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'fee': 280})],\n [('regression: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 60}, {'wait_s': 420}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'fee': 450}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 240}, {'wait_s': 170}, {'wait_s': 170}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 240}, {'wait_s': 181}, {'wait_s': 181}, {'wait_s': 60}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'error': 'too_many_stops'}),\n  ('normal control 1',\n   [[{'wait_s': 420}, {'wait_s': 60}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 460}),\n  ('normal control 2',\n   [[{'wait_s': 60}, {'wait_s': 0}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 300}),\n  ('normal control 3',\n   [[{'wait_s': 170}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}], {'fee': 150}),\n  ('normal control 4',\n   [[{'wait_s': 420}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 260})],\n [('regression: stop limit',\n   [[{'wait_s': 181}, {'wait_s': 170}, {'wait_s': 181}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'fee': 510}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 181}, {'wait_s': 240}, {'wait_s': 180}, {'wait_s': 240}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 0}, {'wait_s': 60}, {'wait_s': 180}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 450}),\n  ('normal control 1',\n   [[{'wait_s': 300}, {'wait_s': 170}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 380}),\n  ('normal control 2', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 0}),\n  ('normal control 3', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 0}),\n  ('normal control 4',\n   [[{'wait_s': 240}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}], {'fee': 190})],\n [('regression: stop limit',\n   [[{'wait_s': 300}, {'wait_s': 60}, {'wait_s': 420}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'fee': 540}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 420}, {'wait_s': 60}, {'wait_s': 0}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 181}, {'wait_s': 170}, {'wait_s': 180}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'fee': 330}),\n  ('normal control 1',\n   [[{'wait_s': 300}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 180}),\n  ('normal control 2', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 0}),\n  ('normal control 3',\n   [[{'wait_s': 240}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}], {'fee': 190}),\n  ('normal control 4', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 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":"c22733ce6b879b7a9e36d917e34b86616163a9efda8327ca38301533a8a00f17","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(stops, policy):\n    if len(stops) >= policy['max_stops']:\n        return {'error': 'too_many_stops'}\n    waits = [s['wait_s'] for s in stops]\n    fee = policy['stop_fee'] * len(stops)\n    for w in waits:\n        over = w - policy['free_wait']\n        if over > 0:\n            fee += -(-over // 60) * policy['per_min']\n    return {'fee': fee}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: stop limit',\n   [[{'wait_s': 300}, {'wait_s': 420}, {'wait_s': 170}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 690}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 180}, {'wait_s': 240}, {'wait_s': 181}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 420}, {'wait_s': 60}, {'wait_s': 420}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 770}),\n  ('normal control 1', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}], {'fee': 0}),\n  ('normal control 2',\n   [[{'wait_s': 170}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 100}),\n  ('normal control 3',\n   [[{'wait_s': 300}, {'wait_s': 240}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'fee': 290}),\n  ('normal control 4', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 0})],\n [('regression: stop limit',\n   [[{'wait_s': 0}, {'wait_s': 420}, {'wait_s': 240}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'fee': 500}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 170}, {'wait_s': 300}, {'wait_s': 180}, {'wait_s': 240}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 420}, {'wait_s': 181}, {'wait_s': 300}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 730}),\n  ('normal control 1',\n   [[{'wait_s': 181}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 140}),\n  ('normal control 2',\n   [[{'wait_s': 181}, {'wait_s': 181}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'fee': 360}),\n  ('normal control 3',\n   [[{'wait_s': 180}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 100}),\n  ('normal control 4',\n   [[{'wait_s': 180}, {'wait_s': 300}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'fee': 280})],\n [('regression: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 60}, {'wait_s': 420}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'fee': 450}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 240}, {'wait_s': 170}, {'wait_s': 170}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 240}, {'wait_s': 181}, {'wait_s': 181}, {'wait_s': 60}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'error': 'too_many_stops'}),\n  ('normal control 1',\n   [[{'wait_s': 420}, {'wait_s': 60}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 460}),\n  ('normal control 2',\n   [[{'wait_s': 60}, {'wait_s': 0}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 300}),\n  ('normal control 3',\n   [[{'wait_s': 170}], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}], {'fee': 150}),\n  ('normal control 4',\n   [[{'wait_s': 420}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 260})],\n [('regression: stop limit',\n   [[{'wait_s': 181}, {'wait_s': 170}, {'wait_s': 181}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'fee': 510}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 181}, {'wait_s': 240}, {'wait_s': 180}, {'wait_s': 240}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 0}, {'wait_s': 60}, {'wait_s': 180}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 450}),\n  ('normal control 1',\n   [[{'wait_s': 300}, {'wait_s': 170}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}],\n   {'fee': 380}),\n  ('normal control 2', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 0}),\n  ('normal control 3', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 0}),\n  ('normal control 4',\n   [[{'wait_s': 240}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}], {'fee': 190})],\n [('regression: stop limit',\n   [[{'wait_s': 300}, {'wait_s': 60}, {'wait_s': 420}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}],\n   {'fee': 540}),\n  ('partial repair probe: stop limit',\n   [[{'wait_s': 240}, {'wait_s': 420}, {'wait_s': 60}, {'wait_s': 0}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 150}],\n   {'error': 'too_many_stops'}),\n  ('second regression',\n   [[{'wait_s': 181}, {'wait_s': 170}, {'wait_s': 180}],\n    {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}],\n   {'fee': 330}),\n  ('normal control 1',\n   [[{'wait_s': 300}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 180}),\n  ('normal control 2', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 100}], {'fee': 0}),\n  ('normal control 3',\n   [[{'wait_s': 240}], {'free_wait': 180, 'max_stops': 3, 'per_min': 40, 'stop_fee': 150}], {'fee': 190}),\n  ('normal control 4', [[], {'free_wait': 180, 'max_stops': 3, 'per_min': 30, 'stop_fee': 100}], {'fee': 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 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-ride-hailing-fare-surge-multi-stop-fees-stop-limit","generated_at":"2026-09-29T14:50:42.876657+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Ride-hailing prices are computed per trip at scale; ordering, unit and boundary slips become systematic over- or under-charging.","root_cause":"The limit check uses >=.","sha256":"0a4a17b8c22e593f7731f3c6166e2233153e7b588934c857b2dac4e6ecd73cff","title":"Maximum number of stops rejected · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":43.333,"exit_code":1,"observations":[{"actual":{"fee":690},"check":"regression: stop limit","expected":{"fee":690},"passed":true},{"actual":{"fee":690},"check":"partial repair probe: stop limit","expected":{"error":"too_many_stops"},"passed":false},{"actual":{"fee":770},"check":"second regression","expected":{"fee":770},"passed":true},{"actual":{"fee":0},"check":"normal control 1","expected":{"fee":0},"passed":true},{"actual":{"fee":100},"check":"normal control 2","expected":{"fee":100},"passed":true},{"actual":{"fee":290},"check":"normal control 3","expected":{"fee":290},"passed":true},{"actual":{"fee":0},"check":"normal control 4","expected":{"fee":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: stop limit\", \"actual\": {\"fee\": 690}, \"expected\": {\"fee\": 690}, \"passed\": true}, {\"check\": \"partial repair probe: stop limit\", \"actual\": {\"fee\": 690}, \"expected\": {\"error\": \"too_many_stops\"}, \"passed\": false}, {\"check\": \"second regression\", \"actual\": {\"fee\": 770}, \"expected\": {\"fee\": 770}, \"passed\": true}, {\"check\": \"normal control 1\", \"actual\": {\"fee\": 0}, \"expected\": {\"fee\": 0}, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": {\"fee\": 100}, \"expected\": {\"fee\": 100}, \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": {\"fee\": 290}, \"expected\": {\"fee\": 290}, \"passed\": true}, {\"check\": \"normal control 4\", \"actual\": {\"fee\": 0}, \"expected\": {\"fee\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.211,"exit_code":1,"observations":[{"actual":{"error":"too_many_stops"},"check":"regression: stop limit","expected":{"fee":690},"passed":false},{"actual":{"error":"too_many_stops"},"check":"partial repair probe: stop limit","expected":{"error":"too_many_stops"},"passed":true},{"actual":{"error":"too_many_stops"},"check":"second regression","expected":{"fee":770},"passed":false},{"actual":{"fee":0},"check":"normal control 1","expected":{"fee":0},"passed":true},{"actual":{"fee":100},"check":"normal control 2","expected":{"fee":100},"passed":true},{"actual":{"fee":290},"check":"normal control 3","expected":{"fee":290},"passed":true},{"actual":{"fee":0},"check":"normal control 4","expected":{"fee":0},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: stop limit\", \"actual\": {\"error\": \"too_many_stops\"}, \"expected\": {\"fee\": 690}, \"passed\": false}, {\"check\": \"partial repair probe: stop limit\", \"actual\": {\"error\": \"too_many_stops\"}, \"expected\": {\"error\": \"too_many_stops\"}, \"passed\": true}, {\"check\": \"second regression\", \"actual\": {\"error\": \"too_many_stops\"}, \"expected\": {\"fee\": 770}, \"passed\": false}, {\"check\": \"normal control 1\", \"actual\": {\"fee\": 0}, \"expected\": {\"fee\": 0}, \"passed\": true}, {\"check\": \"normal control 2\", \"actual\": {\"fee\": 100}, \"expected\": {\"fee\": 100}, \"passed\": true}, {\"check\": \"normal control 3\", \"actual\": {\"fee\": 290}, \"expected\": {\"fee\": 290}, \"passed\": true}, {\"check\": \"normal control 4\", \"actual\": {\"fee\": 0}, \"expected\": {\"fee\": 0}, \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}