{"abstract":"Merchant parking validations returns a wrong result when the free-minute cap is applied per validation.","category":"Toll and parking fee computation","checks":8,"contract":"Input {minutes (single day), validations: [[free_min|pct|flat, value]], hourly, daily_max, max_free_min}. Free minutes from all validations are summed, capped at max_free_min and deducted from the stay before rating. The fee is started hours * hourly capped at daily_max. Only the largest percentage validation applies (discount floored to cents), then all flat validations are subtracted, never below zero.","evaluation_group":"w2-toll_and_parking_fee_computation-merchant-validation","failed_approach":"Honouring only the largest validation ignores the stated stacking up to the cap.","family":"w2-toll_and_parking_fee_computation-merchant-validation-free-cap","id":"FA-68666","implementations":{"attempt":{"sha256":"95ca1a6df22b90df2e7ba2ea2c988861614561b1339e7f79617d7fe7c9c34254","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    free = max([0] + [v for k, v in x['validations'] if k == 'free_min'])\n    bill = max(0, x['minutes'] - free)\n    fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])\n    pcts = [v for k, v in x['validations'] if k == 'pct']\n    if pcts:\n        fee -= fee * max(pcts) // 100\n    flat = sum(v for k, v in x['validations'] if k == 'flat')\n    return max(0, fee - flat)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 242, 'validations': [['free_min', 60], ['free_min', 15]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 800), ({'minutes': 405, 'validations': [['free_min', 90], ['free_min', 15], ['free_min', 60], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1350), ({'minutes': 1305, 'validations': [['free_min', 30], ['free_min', 15], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1800), ({'minutes': 527, 'validations': [['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 1550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 850, 'validations': [['pct', 10], ['free_min', 60], ['free_min', 30], ['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2090)], [({'minutes': 761, 'validations': [['free_min', 120], ['free_min', 120], ['free_min', 60]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 1800), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 967, 'validations': [['free_min', 120]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 3000), ({'minutes': 212, 'validations': [['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 900), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 203, 'validations': [['free_min', 120], ['flat', 250], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 20), ({'minutes': 999, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400)], [({'minutes': 188, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 600), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 583, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1800), ({'minutes': 598, 'validations': [['flat', 100]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2900), ({'minutes': 72, 'validations': [['free_min', 15], ['flat', 250], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 50), ({'minutes': 282, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 720)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 431, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1600), ({'minutes': 580, 'validations': [['flat', 500], ['free_min', 60], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 1309, 'validations': [['free_min', 30], ['pct', 10], ['pct', 25]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 120}, 2250), ({'minutes': 596, 'validations': [['pct', 10], ['free_min', 90], ['free_min', 120], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 361, 'validations': [['free_min', 120], ['pct', 50], ['free_min', 15], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 750)], [({'minutes': 143, 'validations': [['free_min', 15], ['pct', 25], ['flat', 500], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 449, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400), ({'minutes': 328, 'validations': [['free_min', 15], ['flat', 250], ['flat', 100], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1150), ({'minutes': 302, 'validations': [['free_min', 30], ['free_min', 15], ['free_min', 90]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1500), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 244, 'validations': [['free_min', 30], ['flat', 500], ['free_min', 60], ['free_min', 15]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)]]\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":"2a10759cee9ef3c6ba1db9753d0b0a5fd99491ccb4d3d65b5de6d935f48acff0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    free = sum(min(v, x['max_free_min']) for k, v in x['validations'] if k == 'free_min')\n    bill = max(0, x['minutes'] - free)\n    fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])\n    pcts = [v for k, v in x['validations'] if k == 'pct']\n    if pcts:\n        fee -= fee * max(pcts) // 100\n    flat = sum(v for k, v in x['validations'] if k == 'flat')\n    return max(0, fee - flat)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 242, 'validations': [['free_min', 60], ['free_min', 15]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 800), ({'minutes': 405, 'validations': [['free_min', 90], ['free_min', 15], ['free_min', 60], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1350), ({'minutes': 1305, 'validations': [['free_min', 30], ['free_min', 15], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1800), ({'minutes': 527, 'validations': [['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 1550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 850, 'validations': [['pct', 10], ['free_min', 60], ['free_min', 30], ['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2090)], [({'minutes': 761, 'validations': [['free_min', 120], ['free_min', 120], ['free_min', 60]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 1800), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 967, 'validations': [['free_min', 120]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 3000), ({'minutes': 212, 'validations': [['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 900), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 203, 'validations': [['free_min', 120], ['flat', 250], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 20), ({'minutes': 999, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400)], [({'minutes': 188, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 600), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 583, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1800), ({'minutes': 598, 'validations': [['flat', 100]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2900), ({'minutes': 72, 'validations': [['free_min', 15], ['flat', 250], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 50), ({'minutes': 282, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 720)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 431, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1600), ({'minutes': 580, 'validations': [['flat', 500], ['free_min', 60], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 1309, 'validations': [['free_min', 30], ['pct', 10], ['pct', 25]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 120}, 2250), ({'minutes': 596, 'validations': [['pct', 10], ['free_min', 90], ['free_min', 120], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 361, 'validations': [['free_min', 120], ['pct', 50], ['free_min', 15], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 750)], [({'minutes': 143, 'validations': [['free_min', 15], ['pct', 25], ['flat', 500], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 449, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400), ({'minutes': 328, 'validations': [['free_min', 15], ['flat', 250], ['flat', 100], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1150), ({'minutes': 302, 'validations': [['free_min', 30], ['free_min', 15], ['free_min', 90]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1500), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 244, 'validations': [['free_min', 30], ['flat', 500], ['free_min', 60], ['free_min', 15]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)]]\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":"98f3047e17b44a01f442d91e2571c2064db19d1585646901b91fd1a9cfa62857","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    free = min(x['max_free_min'], sum(v for k, v in x['validations'] if k == 'free_min'))\n    bill = max(0, x['minutes'] - free)\n    fee = min(x['daily_max'], -(-bill // 60) * x['hourly'])\n    pcts = [v for k, v in x['validations'] if k == 'pct']\n    if pcts:\n        fee -= fee * max(pcts) // 100\n    flat = sum(v for k, v in x['validations'] if k == 'flat')\n    return max(0, fee - flat)\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 242, 'validations': [['free_min', 60], ['free_min', 15]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 60}, 800), ({'minutes': 405, 'validations': [['free_min', 90], ['free_min', 15], ['free_min', 60], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1350), ({'minutes': 1305, 'validations': [['free_min', 30], ['free_min', 15], ['pct', 25]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1800), ({'minutes': 527, 'validations': [['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 1550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 850, 'validations': [['pct', 10], ['free_min', 60], ['free_min', 30], ['flat', 250]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 180}, 2090)], [({'minutes': 761, 'validations': [['free_min', 120], ['free_min', 120], ['free_min', 60]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 1800), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 967, 'validations': [['free_min', 120]], 'hourly': 300, 'daily_max': 3000, 'max_free_min': 60}, 3000), ({'minutes': 212, 'validations': [['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 900), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 203, 'validations': [['free_min', 120], ['flat', 250], ['pct', 10], ['free_min', 120]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 20), ({'minutes': 999, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400)], [({'minutes': 188, 'validations': [['free_min', 120], ['free_min', 30]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 60}, 600), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 583, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1800), ({'minutes': 598, 'validations': [['flat', 100]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 120}, 2900), ({'minutes': 72, 'validations': [['free_min', 15], ['flat', 250], ['free_min', 60], ['free_min', 30]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 50), ({'minutes': 282, 'validations': [['pct', 10], ['free_min', 30], ['free_min', 30]], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 120}, 720)], [({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300), ({'minutes': 431, 'validations': [], 'hourly': 200, 'daily_max': 1800, 'max_free_min': 60}, 1600), ({'minutes': 580, 'validations': [['flat', 500], ['free_min', 60], ['pct', 50]], 'hourly': 350, 'daily_max': 1800, 'max_free_min': 60}, 400), ({'minutes': 1309, 'validations': [['free_min', 30], ['pct', 10], ['pct', 25]], 'hourly': 200, 'daily_max': 3000, 'max_free_min': 120}, 2250), ({'minutes': 596, 'validations': [['pct', 10], ['free_min', 90], ['free_min', 120], ['free_min', 90]], 'hourly': 350, 'daily_max': 3000, 'max_free_min': 60}, 2700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 361, 'validations': [['free_min', 120], ['pct', 50], ['free_min', 15], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 750)], [({'minutes': 143, 'validations': [['free_min', 15], ['pct', 25], ['flat', 500], ['pct', 10]], 'hourly': 200, 'daily_max': 2400, 'max_free_min': 120}, 0), ({'minutes': 449, 'validations': [['free_min', 15]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 2400), ({'minutes': 328, 'validations': [['free_min', 15], ['flat', 250], ['flat', 100], ['free_min', 30]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 180}, 1150), ({'minutes': 302, 'validations': [['free_min', 30], ['free_min', 15], ['free_min', 90]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 60}, 1500), ({'minutes': 95, 'validations': [['free_min', 30]], 'hourly': 350, 'daily_max': 2400, 'max_free_min': 120}, 700), ({'minutes': 244, 'validations': [['free_min', 30], ['flat', 500], ['free_min', 60], ['free_min', 15]], 'hourly': 300, 'daily_max': 1800, 'max_free_min': 60}, 700), ({'minutes': 200, 'validations': [['pct', 25], ['pct', 10], ['flat', 100], ['flat', 250]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 550), ({'minutes': 150, 'validations': [['free_min', 60], ['free_min', 60], ['free_min', 60]], 'hourly': 300, 'daily_max': 2400, 'max_free_min': 120}, 300)]]\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-merchant-validation-free-cap","generated_at":"2026-09-29T14:48:04.320588+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 stacked free minutes rule so that the step reads `min(x['max_free_min'], sum(v for k, v in x['validations'] if k == 'free_min'))`.","root_cause":"Capping each validation separately lets stacked validations exceed the per-stay free limit.","sha256":"ddfd8ae84f23407d7486b1c9ab034d2d64d25395d41ab5dafe7e790c83392022","title":"Merchant parking validations: the free-minute cap is applied per validation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.915,"exit_code":1,"observations":[{"actual":700,"check":"fee oracle 0","expected":700,"passed":true},{"actual":800,"check":"fee oracle 1","expected":800,"passed":true},{"actual":1350,"check":"fee oracle 2","expected":1350,"passed":true},{"actual":1800,"check":"fee oracle 3","expected":1800,"passed":true},{"actual":1550,"check":"fee oracle 4","expected":1550,"passed":true},{"actual":600,"check":"fee oracle 5","expected":300,"passed":false},{"actual":550,"check":"fee oracle 6","expected":550,"passed":true},{"actual":2270,"check":"fee oracle 7","expected":2090,"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": 700, \"expected\": 700, \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": 800, \"expected\": 800, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": 1350, \"expected\": 1350, \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": 1800, \"expected\": 1800, \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": 1550, \"expected\": 1550, \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": 600, \"expected\": 300, \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": 550, \"expected\": 550, \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": 2270, \"expected\": 2090, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.699,"exit_code":1,"observations":[{"actual":700,"check":"fee oracle 0","expected":700,"passed":true},{"actual":600,"check":"fee oracle 1","expected":800,"passed":false},{"actual":1125,"check":"fee oracle 2","expected":1350,"passed":false},{"actual":1800,"check":"fee oracle 3","expected":1800,"passed":true},{"actual":1550,"check":"fee oracle 4","expected":1550,"passed":true},{"actual":0,"check":"fee oracle 5","expected":300,"passed":false},{"actual":550,"check":"fee oracle 6","expected":550,"passed":true},{"actual":2090,"check":"fee oracle 7","expected":2090,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": 700, \"expected\": 700, \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": 600, \"expected\": 800, \"passed\": false}, {\"check\": \"fee oracle 2\", \"actual\": 1125, \"expected\": 1350, \"passed\": false}, {\"check\": \"fee oracle 3\", \"actual\": 1800, \"expected\": 1800, \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": 1550, \"expected\": 1550, \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": 0, \"expected\": 300, \"passed\": false}, {\"check\": \"fee oracle 6\", \"actual\": 550, \"expected\": 550, \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": 2090, \"expected\": 2090, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.12,"exit_code":0,"observations":[{"actual":700,"check":"fee oracle 0","expected":700,"passed":true},{"actual":800,"check":"fee oracle 1","expected":800,"passed":true},{"actual":1350,"check":"fee oracle 2","expected":1350,"passed":true},{"actual":1800,"check":"fee oracle 3","expected":1800,"passed":true},{"actual":1550,"check":"fee oracle 4","expected":1550,"passed":true},{"actual":300,"check":"fee oracle 5","expected":300,"passed":true},{"actual":550,"check":"fee oracle 6","expected":550,"passed":true},{"actual":2090,"check":"fee oracle 7","expected":2090,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fee oracle 0\", \"actual\": 700, \"expected\": 700, \"passed\": true}, {\"check\": \"fee oracle 1\", \"actual\": 800, \"expected\": 800, \"passed\": true}, {\"check\": \"fee oracle 2\", \"actual\": 1350, \"expected\": 1350, \"passed\": true}, {\"check\": \"fee oracle 3\", \"actual\": 1800, \"expected\": 1800, \"passed\": true}, {\"check\": \"fee oracle 4\", \"actual\": 1550, \"expected\": 1550, \"passed\": true}, {\"check\": \"fee oracle 5\", \"actual\": 300, \"expected\": 300, \"passed\": true}, {\"check\": \"fee oracle 6\", \"actual\": 550, \"expected\": 550, \"passed\": true}, {\"check\": \"fee oracle 7\", \"actual\": 2090, \"expected\": 2090, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}