{"abstract":"Garage hourly fee with grace and daily maximum returns a wrong result when the lost ticket fee replaces a larger computed fee.","category":"Toll and parking fee computation","checks":8,"contract":"Input {entry, exit (absolute minutes), grace, hourly, daily_max, lost_ticket, lost_fee}; cents. Exit before entry is 'invalid'. A stay no longer than grace is free (grace is not deducted from longer stays). Otherwise each full 1440-minute block costs daily_max and the remainder costs hourly per started hour, capped at daily_max. A lost ticket pays the greater of the computed fee and lost_fee.","evaluation_group":"w2-toll_and_parking_fee_computation-garage-grace-daily","failed_approach":"Adding the lost fee to the computed fee double charges.","family":"w2-toll_and_parking_fee_computation-garage-grace-daily-lost-ticket","id":"FA-68361","implementations":{"attempt":{"sha256":"6397121356ed714c262a050cdb48a1544ca3cb09430a47543274ec95f10c476f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    if x['exit'] < x['entry']:\n        return 'invalid'\n    dur = x['exit'] - x['entry']\n    if dur <= x['grace']:\n        fee = 0\n    else:\n        days, rem = divmod(dur, 1440)\n        fee = days * x['daily_max'] + min(x['daily_max'], -(-rem // 60) * x['hourly'])\n    if x['lost_ticket']:\n        fee = fee + x['lost_fee']\n    return fee\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'entry': 1082, 'exit': 5693, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 6000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 184, 'exit': 280, 'grace': 20, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 2107, 'exit': 2568, 'grace': 10, 'hourly': 200, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600), ({'entry': 2424, 'exit': 6728, 'grace': 15, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4500), ({'entry': 2475, 'exit': 5355, 'grace': 20, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 3000), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500)], [({'entry': 124, 'exit': 143, 'grace': 0, 'hourly': 200, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 318, 'exit': 5189, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 9600), ({'entry': 927, 'exit': 1380, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 69, 'exit': 4389, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4500), ({'entry': 648, 'exit': 2644, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 4800), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600)], [({'entry': 2135, 'exit': 5612, 'grace': 20, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 7200), ({'entry': 166, 'exit': 2354, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 3000), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600), ({'entry': 1120, 'exit': 1138, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 429, 'exit': 683, 'grace': 20, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 4, 'exit': 2884, 'grace': 20, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 4800)], [({'entry': 2108, 'exit': 4988, 'grace': 20, 'hourly': 450, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 4000), ({'entry': 1675, 'exit': 6410, 'grace': 15, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 6000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 2388, 'exit': 2625, 'grace': 15, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 903, 'exit': 4042, 'grace': 15, 'hourly': 200, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4000), ({'entry': 1659, 'exit': 2168, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600)], [({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 445, 'exit': 3325, 'grace': 0, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 4800), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 1568, 'exit': 2228, 'grace': 15, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 2826, 'exit': 7146, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 7200), ({'entry': 2274, 'exit': 5519, 'grace': 15, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 4500), ({'entry': 1853, 'exit': 1872, 'grace': 10, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 3000)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('fee oracle' + ' %d' % i, 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":"e1559c8de843f36f819f810daacbecaea7048645d4599267c0155a0b54b269d7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    if x['exit'] < x['entry']:\n        return 'invalid'\n    dur = x['exit'] - x['entry']\n    if dur <= x['grace']:\n        fee = 0\n    else:\n        days, rem = divmod(dur, 1440)\n        fee = days * x['daily_max'] + min(x['daily_max'], -(-rem // 60) * x['hourly'])\n    if x['lost_ticket']:\n        fee = x['lost_fee']\n    return fee\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'entry': 1082, 'exit': 5693, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 6000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 184, 'exit': 280, 'grace': 20, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 2107, 'exit': 2568, 'grace': 10, 'hourly': 200, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600), ({'entry': 2424, 'exit': 6728, 'grace': 15, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4500), ({'entry': 2475, 'exit': 5355, 'grace': 20, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 3000), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500)], [({'entry': 124, 'exit': 143, 'grace': 0, 'hourly': 200, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 318, 'exit': 5189, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 9600), ({'entry': 927, 'exit': 1380, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 69, 'exit': 4389, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4500), ({'entry': 648, 'exit': 2644, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 4800), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600)], [({'entry': 2135, 'exit': 5612, 'grace': 20, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 7200), ({'entry': 166, 'exit': 2354, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 3000), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600), ({'entry': 1120, 'exit': 1138, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 429, 'exit': 683, 'grace': 20, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 4, 'exit': 2884, 'grace': 20, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 4800)], [({'entry': 2108, 'exit': 4988, 'grace': 20, 'hourly': 450, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 4000), ({'entry': 1675, 'exit': 6410, 'grace': 15, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 6000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 2388, 'exit': 2625, 'grace': 15, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 903, 'exit': 4042, 'grace': 15, 'hourly': 200, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4000), ({'entry': 1659, 'exit': 2168, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600)], [({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 445, 'exit': 3325, 'grace': 0, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 4800), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 1568, 'exit': 2228, 'grace': 15, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 2826, 'exit': 7146, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 7200), ({'entry': 2274, 'exit': 5519, 'grace': 15, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 4500), ({'entry': 1853, 'exit': 1872, 'grace': 10, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 3000)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('fee oracle' + ' %d' % i, 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"},"fixed":{"sha256":"d63ef84b936883bc1dd3f7efa63fa05d00c3fdcd1802b31dbd1bf7ac92c3191e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    if x['exit'] < x['entry']:\n        return 'invalid'\n    dur = x['exit'] - x['entry']\n    if dur <= x['grace']:\n        fee = 0\n    else:\n        days, rem = divmod(dur, 1440)\n        fee = days * x['daily_max'] + min(x['daily_max'], -(-rem // 60) * x['hourly'])\n    if x['lost_ticket']:\n        fee = max(fee, x['lost_fee'])\n    return fee\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'entry': 1082, 'exit': 5693, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 6000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 184, 'exit': 280, 'grace': 20, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 2107, 'exit': 2568, 'grace': 10, 'hourly': 200, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600), ({'entry': 2424, 'exit': 6728, 'grace': 15, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4500), ({'entry': 2475, 'exit': 5355, 'grace': 20, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 3000), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500)], [({'entry': 124, 'exit': 143, 'grace': 0, 'hourly': 200, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 318, 'exit': 5189, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 9600), ({'entry': 927, 'exit': 1380, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 69, 'exit': 4389, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4500), ({'entry': 648, 'exit': 2644, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 4800), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600)], [({'entry': 2135, 'exit': 5612, 'grace': 20, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 7200), ({'entry': 166, 'exit': 2354, 'grace': 10, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 3000), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600), ({'entry': 1120, 'exit': 1138, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 429, 'exit': 683, 'grace': 20, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 4, 'exit': 2884, 'grace': 20, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 4800)], [({'entry': 2108, 'exit': 4988, 'grace': 20, 'hourly': 450, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 4000), ({'entry': 1675, 'exit': 6410, 'grace': 15, 'hourly': 450, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 6000), ({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 2388, 'exit': 2625, 'grace': 15, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 903, 'exit': 4042, 'grace': 15, 'hourly': 200, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 3000}, 4000), ({'entry': 1659, 'exit': 2168, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 3000), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 0, 'exit': 1560, 'grace': 10, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 2600)], [({'entry': 60, 'exit': 240, 'grace': 15, 'hourly': 450, 'daily_max': 2400, 'lost_ticket': False, 'lost_fee': 3000}, 1350), ({'entry': 445, 'exit': 3325, 'grace': 0, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 2500}, 4800), ({'entry': 500, 'exit': 500, 'grace': 0, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 1568, 'exit': 2228, 'grace': 15, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 2500), ({'entry': 100, 'exit': 115, 'grace': 15, 'hourly': 300, 'daily_max': 2000, 'lost_ticket': False, 'lost_fee': 2500}, 0), ({'entry': 2826, 'exit': 7146, 'grace': 0, 'hourly': 300, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 7200), ({'entry': 2274, 'exit': 5519, 'grace': 15, 'hourly': 300, 'daily_max': 1500, 'lost_ticket': True, 'lost_fee': 2500}, 4500), ({'entry': 1853, 'exit': 1872, 'grace': 10, 'hourly': 200, 'daily_max': 2400, 'lost_ticket': True, 'lost_fee': 3000}, 3000)]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check('fee oracle' + ' %d' % i, 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, bounded toy model with a stipulated contract; it makes no claim of conformance to any agency manual or standard. 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-toll_and_parking_fee_computation-garage-grace-daily-lost-ticket","generated_at":"2026-09-29T14:48:01.527984+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Fee engines bill customers in integer cents; a wrong boundary, rounding stage or cap scope silently over- or under-charges.","repair":"Restore the lost ticket rule rule so that the step reads `fee = max(fee, x['lost_fee'])`.","root_cause":"A lost ticket on a long stay pays only the flat lost fee instead of the greater of the two.","sha256":"b8d6e917bd48ea548ce9eb6a3e594eb161760203639be9a3e371e9be31ed8d54","title":"Garage hourly fee with grace and daily maximum: the lost ticket fee replaces a larger computed fee · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.398,"exit_code":1,"observations":[{"actual":8500,"check":"fee oracle 0","expected":6000,"passed":false},{"actual":1350,"check":"fee oracle 1","expected":1350,"passed":true},{"actual":3600,"check":"fee oracle 2","expected":3000,"passed":false},{"actual":4600,"check":"fee oracle 3","expected":3000,"passed":false},{"actual":2600,"check":"fee oracle 4","expected":2600,"passed":true},{"actual":7500,"check":"fee oracle 5","expected":4500,"passed":false},{"actual":5500,"check":"fee oracle 6","expected":3000,"passed":false},{"actual":2500,"check":"fee oracle 7","expected":2500,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": 8500, \"expected\": 6000, \"passed\": false}, {\"check\": \"fee oracle 1\", \"actual\": 1350, \"expected\": 1350, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": 3600, \"expected\": 3000, \"passed\": false}, {\"check\": \"fee oracle 3\", \"actual\": 4600, \"expected\": 3000, \"passed\": false}, {\"check\": \"fee oracle 4\", \"actual\": 2600, \"expected\": 2600, \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": 7500, \"expected\": 4500, \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": 5500, \"expected\": 3000, \"passed\": false}, {\"check\": \"fee oracle 7\", \"actual\": 2500, \"expected\": 2500, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.356,"exit_code":1,"observations":[{"actual":2500,"check":"fee oracle 0","expected":6000,"passed":false},{"actual":1350,"check":"fee oracle 1","expected":1350,"passed":true},{"actual":3000,"check":"fee oracle 2","expected":3000,"passed":true},{"actual":3000,"check":"fee oracle 3","expected":3000,"passed":true},{"actual":2600,"check":"fee oracle 4","expected":2600,"passed":true},{"actual":3000,"check":"fee oracle 5","expected":4500,"passed":false},{"actual":2500,"check":"fee oracle 6","expected":3000,"passed":false},{"actual":2500,"check":"fee oracle 7","expected":2500,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": 2500, \"expected\": 6000, \"passed\": false}, {\"check\": \"fee oracle 1\", \"actual\": 1350, \"expected\": 1350, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": 3000, \"expected\": 3000, \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": 3000, \"expected\": 3000, \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": 2600, \"expected\": 2600, \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": 3000, \"expected\": 4500, \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": 2500, \"expected\": 3000, \"passed\": false}, {\"check\": \"fee oracle 7\", \"actual\": 2500, \"expected\": 2500, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":37.797,"exit_code":0,"observations":[{"actual":6000,"check":"fee oracle 0","expected":6000,"passed":true},{"actual":1350,"check":"fee oracle 1","expected":1350,"passed":true},{"actual":3000,"check":"fee oracle 2","expected":3000,"passed":true},{"actual":3000,"check":"fee oracle 3","expected":3000,"passed":true},{"actual":2600,"check":"fee oracle 4","expected":2600,"passed":true},{"actual":4500,"check":"fee oracle 5","expected":4500,"passed":true},{"actual":3000,"check":"fee oracle 6","expected":3000,"passed":true},{"actual":2500,"check":"fee oracle 7","expected":2500,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": 6000, \"expected\": 6000, \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": 1350, \"expected\": 1350, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": 3000, \"expected\": 3000, \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": 3000, \"expected\": 3000, \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": 2600, \"expected\": 2600, \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": 4500, \"expected\": 4500, \"passed\": true}, {\"check\": \"fee oracle 6\", \"actual\": 3000, \"expected\": 3000, \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": 2500, \"expected\": 2500, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}