{"abstract":"Street meter time purchase returns a wrong result when the time limit is measured from the extension start.","category":"Toll and parking fee computation","checks":8,"contract":"Input {now, expiry (or null), paid_cents, rate_per_hour, max_minutes, enf_start, enf_end, increment}. Only whole increments are credited. At or after enforcement end nothing is sold: [null, 0]. Paid time starts at the later of now, enforcement start and any unexpired expiry; it ends at the earliest of start + purchased minutes (floor), max(now, enf_start) + max_minutes, and enf_end. Accepted cents = min(credited, ceil(used minutes * rate/60)). Return [new expiry, accepted cents].","evaluation_group":"w2-toll_and_parking_fee_computation-meter-purchase","failed_approach":"Measuring the limit from now wrongly shortens purchases made before enforcement starts.","family":"w2-toll_and_parking_fee_computation-meter-purchase-time-limit","id":"FA-68466","implementations":{"attempt":{"sha256":"71db3986b2912b548d0153d79cec19df90b464308e83c39b406f6fe3299c5b54","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    inc = x['increment']\n    c = x['paid_cents'] - x['paid_cents'] % inc\n    now = x['now']\n    if now >= x['enf_end']:\n        return [None, 0]\n    base = max(now, x['enf_start'])\n    start = base if x['expiry'] is None else max(base, x['expiry'])\n    mins = c * 60 // x['rate_per_hour']\n    end = min(start + mins, now + x['max_minutes'], x['enf_end'])\n    used = max(0, end - start)\n    cost = min(c, -(-used * x['rate_per_hour'] // 60))\n    return [max(end, start), cost]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'now': 480, 'expiry': 532, 'paid_cents': 270, 'rate_per_hour': 100, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [600, 114]), ({'now': 646, 'expiry': 691, 'paid_cents': 468, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [766, 188]), ({'now': 1080, 'expiry': 1100, 'paid_cents': 100, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [None, 0]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 182, 'expiry': 191, 'paid_cents': 258, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 42, 'expiry': None, 'paid_cents': 361, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 591, 'expiry': 603, 'paid_cents': 339, 'rate_per_hour': 100, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [651, 80])], [({'now': 798, 'expiry': 823, 'paid_cents': 558, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [858, 88]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': None, 'paid_cents': 257, 'rate_per_hour': 150, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [582, 255]), ({'now': 180, 'expiry': None, 'paid_cents': 342, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 436, 'expiry': 444, 'paid_cents': 152, 'rate_per_hour': 100, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 100]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 480, 'expiry': 564, 'paid_cents': 165, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [564, 0])], [({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 453, 'expiry': None, 'paid_cents': 545, 'rate_per_hour': 100, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [720, 400]), ({'now': 480, 'expiry': 548, 'paid_cents': 563, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [600, 130]), ({'now': 396, 'expiry': None, 'paid_cents': 250, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 150]), ({'now': 480, 'expiry': 429, 'paid_cents': 333, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [579, 330]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': 527, 'paid_cents': 369, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 44])], [({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': 514, 'paid_cents': 358, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 65]), ({'now': 480, 'expiry': 556, 'paid_cents': 47, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [556, 0]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 1000, 'expiry': 966, 'paid_cents': 599, 'rate_per_hour': 200, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [1080, 267]), ({'now': 228, 'expiry': 243, 'paid_cents': 594, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 1080, 'expiry': 1100, 'paid_cents': 100, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [None, 0]), ({'now': 16, 'expiry': None, 'paid_cents': 295, 'rate_per_hour': 200, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [568, 294])], [({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 914, 'expiry': 980, 'paid_cents': 538, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [980, 0]), ({'now': 758, 'expiry': 791, 'paid_cents': 478, 'rate_per_hour': 150, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [981, 475]), ({'now': 413, 'expiry': None, 'paid_cents': 368, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [585, 350]), ({'now': 701, 'expiry': 740, 'paid_cents': 590, 'rate_per_hour': 100, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [821, 135]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 62, 'expiry': None, 'paid_cents': 358, 'rate_per_hour': 250, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [564, 350])]]\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":"116dc3cd054e25b5d24a388aee310c4b1e6c9c05eb3b81d9119d40478d04df5b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    inc = x['increment']\n    c = x['paid_cents'] - x['paid_cents'] % inc\n    now = x['now']\n    if now >= x['enf_end']:\n        return [None, 0]\n    base = max(now, x['enf_start'])\n    start = base if x['expiry'] is None else max(base, x['expiry'])\n    mins = c * 60 // x['rate_per_hour']\n    end = min(start + mins, start + x['max_minutes'], x['enf_end'])\n    used = max(0, end - start)\n    cost = min(c, -(-used * x['rate_per_hour'] // 60))\n    return [max(end, start), cost]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'now': 480, 'expiry': 532, 'paid_cents': 270, 'rate_per_hour': 100, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [600, 114]), ({'now': 646, 'expiry': 691, 'paid_cents': 468, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [766, 188]), ({'now': 1080, 'expiry': 1100, 'paid_cents': 100, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [None, 0]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 182, 'expiry': 191, 'paid_cents': 258, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 42, 'expiry': None, 'paid_cents': 361, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 591, 'expiry': 603, 'paid_cents': 339, 'rate_per_hour': 100, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [651, 80])], [({'now': 798, 'expiry': 823, 'paid_cents': 558, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [858, 88]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': None, 'paid_cents': 257, 'rate_per_hour': 150, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [582, 255]), ({'now': 180, 'expiry': None, 'paid_cents': 342, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 436, 'expiry': 444, 'paid_cents': 152, 'rate_per_hour': 100, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 100]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 480, 'expiry': 564, 'paid_cents': 165, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [564, 0])], [({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 453, 'expiry': None, 'paid_cents': 545, 'rate_per_hour': 100, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [720, 400]), ({'now': 480, 'expiry': 548, 'paid_cents': 563, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [600, 130]), ({'now': 396, 'expiry': None, 'paid_cents': 250, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 150]), ({'now': 480, 'expiry': 429, 'paid_cents': 333, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [579, 330]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': 527, 'paid_cents': 369, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 44])], [({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': 514, 'paid_cents': 358, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 65]), ({'now': 480, 'expiry': 556, 'paid_cents': 47, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [556, 0]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 1000, 'expiry': 966, 'paid_cents': 599, 'rate_per_hour': 200, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [1080, 267]), ({'now': 228, 'expiry': 243, 'paid_cents': 594, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 1080, 'expiry': 1100, 'paid_cents': 100, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [None, 0]), ({'now': 16, 'expiry': None, 'paid_cents': 295, 'rate_per_hour': 200, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [568, 294])], [({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 914, 'expiry': 980, 'paid_cents': 538, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [980, 0]), ({'now': 758, 'expiry': 791, 'paid_cents': 478, 'rate_per_hour': 150, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [981, 475]), ({'now': 413, 'expiry': None, 'paid_cents': 368, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [585, 350]), ({'now': 701, 'expiry': 740, 'paid_cents': 590, 'rate_per_hour': 100, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [821, 135]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 62, 'expiry': None, 'paid_cents': 358, 'rate_per_hour': 250, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [564, 350])]]\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":"2ad34048def842d0a20ffdc33f9bf617b48e25f6ad3ea6ced01fe660f0a1e8d3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    inc = x['increment']\n    c = x['paid_cents'] - x['paid_cents'] % inc\n    now = x['now']\n    if now >= x['enf_end']:\n        return [None, 0]\n    base = max(now, x['enf_start'])\n    start = base if x['expiry'] is None else max(base, x['expiry'])\n    mins = c * 60 // x['rate_per_hour']\n    end = min(start + mins, base + x['max_minutes'], x['enf_end'])\n    used = max(0, end - start)\n    cost = min(c, -(-used * x['rate_per_hour'] // 60))\n    return [max(end, start), cost]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'now': 480, 'expiry': 532, 'paid_cents': 270, 'rate_per_hour': 100, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [600, 114]), ({'now': 646, 'expiry': 691, 'paid_cents': 468, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [766, 188]), ({'now': 1080, 'expiry': 1100, 'paid_cents': 100, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [None, 0]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 182, 'expiry': 191, 'paid_cents': 258, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 42, 'expiry': None, 'paid_cents': 361, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 591, 'expiry': 603, 'paid_cents': 339, 'rate_per_hour': 100, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [651, 80])], [({'now': 798, 'expiry': 823, 'paid_cents': 558, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [858, 88]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': None, 'paid_cents': 257, 'rate_per_hour': 150, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [582, 255]), ({'now': 180, 'expiry': None, 'paid_cents': 342, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 436, 'expiry': 444, 'paid_cents': 152, 'rate_per_hour': 100, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 100]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 480, 'expiry': 564, 'paid_cents': 165, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [564, 0])], [({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 453, 'expiry': None, 'paid_cents': 545, 'rate_per_hour': 100, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [720, 400]), ({'now': 480, 'expiry': 548, 'paid_cents': 563, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [600, 130]), ({'now': 396, 'expiry': None, 'paid_cents': 250, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 150]), ({'now': 480, 'expiry': 429, 'paid_cents': 333, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [579, 330]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': 527, 'paid_cents': 369, 'rate_per_hour': 200, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 44])], [({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 480, 'expiry': 514, 'paid_cents': 358, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 65]), ({'now': 480, 'expiry': 556, 'paid_cents': 47, 'rate_per_hour': 150, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [556, 0]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 1000, 'expiry': 966, 'paid_cents': 599, 'rate_per_hour': 200, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [1080, 267]), ({'now': 228, 'expiry': 243, 'paid_cents': 594, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [540, 250]), ({'now': 1080, 'expiry': 1100, 'paid_cents': 100, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [None, 0]), ({'now': 16, 'expiry': None, 'paid_cents': 295, 'rate_per_hour': 200, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [568, 294])], [({'now': 1040, 'expiry': None, 'paid_cents': 333, 'rate_per_hour': 150, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [1080, 100]), ({'now': 914, 'expiry': 980, 'paid_cents': 538, 'rate_per_hour': 250, 'max_minutes': 60, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [980, 0]), ({'now': 758, 'expiry': 791, 'paid_cents': 478, 'rate_per_hour': 150, 'max_minutes': 240, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [981, 475]), ({'now': 413, 'expiry': None, 'paid_cents': 368, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [585, 350]), ({'now': 701, 'expiry': 740, 'paid_cents': 590, 'rate_per_hour': 100, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [821, 135]), ({'now': 600, 'expiry': 650, 'paid_cents': 400, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 5}, [720, 234]), ({'now': 420, 'expiry': None, 'paid_cents': 200, 'rate_per_hour': 200, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [540, 200]), ({'now': 62, 'expiry': None, 'paid_cents': 358, 'rate_per_hour': 250, 'max_minutes': 120, 'enf_start': 480, 'enf_end': 1080, 'increment': 25}, [564, 350])]]\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-meter-purchase-time-limit","generated_at":"2026-09-29T14:48:02.442457+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 maximum stay limit rule so that the step reads `base + x['max_minutes']`.","root_cause":"Stacking purchases pushes expiry beyond the posted time limit.","sha256":"3ace017914820a9833c751fb2457a4c48a50f0e51d00684b9a24ca97b9bf6c9e","title":"Street meter time purchase: the time limit is measured from the extension start · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.4,"exit_code":1,"observations":[{"actual":[600,114],"check":"fee oracle 0","expected":[600,114],"passed":true},{"actual":[766,188],"check":"fee oracle 1","expected":[766,188],"passed":true},{"actual":[null,0],"check":"fee oracle 2","expected":[null,0],"passed":true},{"actual":[540,200],"check":"fee oracle 3","expected":[540,200],"passed":true},{"actual":[1080,100],"check":"fee oracle 4","expected":[1080,100],"passed":true},{"actual":[480,0],"check":"fee oracle 5","expected":[540,250],"passed":false},{"actual":[480,0],"check":"fee oracle 6","expected":[540,200],"passed":false},{"actual":[651,80],"check":"fee oracle 7","expected":[651,80],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": [600, 114], \"expected\": [600, 114], \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": [766, 188], \"expected\": [766, 188], \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": [null, 0], \"expected\": [null, 0], \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": [540, 200], \"expected\": [540, 200], \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": [1080, 100], \"expected\": [1080, 100], \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": [480, 0], \"expected\": [540, 250], \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": [480, 0], \"expected\": [540, 200], \"passed\": false}, {\"check\": \"fee oracle 7\", \"actual\": [651, 80], \"expected\": [651, 80], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.121,"exit_code":1,"observations":[{"actual":[652,200],"check":"fee oracle 0","expected":[600,114],"passed":false},{"actual":[811,300],"check":"fee oracle 1","expected":[766,188],"passed":false},{"actual":[null,0],"check":"fee oracle 2","expected":[null,0],"passed":true},{"actual":[540,200],"check":"fee oracle 3","expected":[540,200],"passed":true},{"actual":[1080,100],"check":"fee oracle 4","expected":[1080,100],"passed":true},{"actual":[540,250],"check":"fee oracle 5","expected":[540,250],"passed":true},{"actual":[540,200],"check":"fee oracle 6","expected":[540,200],"passed":true},{"actual":[663,100],"check":"fee oracle 7","expected":[651,80],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": [652, 200], \"expected\": [600, 114], \"passed\": false}, {\"check\": \"fee oracle 1\", \"actual\": [811, 300], \"expected\": [766, 188], \"passed\": false}, {\"check\": \"fee oracle 2\", \"actual\": [null, 0], \"expected\": [null, 0], \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": [540, 200], \"expected\": [540, 200], \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": [1080, 100], \"expected\": [1080, 100], \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": [540, 250], \"expected\": [540, 250], \"passed\": true}, {\"check\": \"fee oracle 6\", \"actual\": [540, 200], \"expected\": [540, 200], \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": [663, 100], \"expected\": [651, 80], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.778,"exit_code":0,"observations":[{"actual":[600,114],"check":"fee oracle 0","expected":[600,114],"passed":true},{"actual":[766,188],"check":"fee oracle 1","expected":[766,188],"passed":true},{"actual":[null,0],"check":"fee oracle 2","expected":[null,0],"passed":true},{"actual":[540,200],"check":"fee oracle 3","expected":[540,200],"passed":true},{"actual":[1080,100],"check":"fee oracle 4","expected":[1080,100],"passed":true},{"actual":[540,250],"check":"fee oracle 5","expected":[540,250],"passed":true},{"actual":[540,200],"check":"fee oracle 6","expected":[540,200],"passed":true},{"actual":[651,80],"check":"fee oracle 7","expected":[651,80],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": [600, 114], \"expected\": [600, 114], \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": [766, 188], \"expected\": [766, 188], \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": [null, 0], \"expected\": [null, 0], \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": [540, 200], \"expected\": [540, 200], \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": [1080, 100], \"expected\": [1080, 100], \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": [540, 250], \"expected\": [540, 250], \"passed\": true}, {\"check\": \"fee oracle 6\", \"actual\": [540, 200], \"expected\": [540, 200], \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": [651, 80], \"expected\": [651, 80], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}