{"abstract":"After an idle gap an old window's traffic still throttles the client.","category":"Rate limiter algorithms","checks":7,"contract":"Input {limit, window_ms, requests [t]} with nondecreasing t. Keep counts for the current and previous epoch windows; moving to the next window rotates cur into prev, skipping more than one window clears both. The estimate is prev * (W - elapsed)/W + cur with elapsed = t - window start, exactly. Allow when est + 1 <= limit (reporting est + 1), else deny (reporting est). Return [[decision, estimate as fraction string]], [window, prev, cur]].","evaluation_group":"w2-rate_limiter_algorithms-sliding-window-counter","failed_approach":"Clearing only cur after a gap keeps an older prev count.","family":"w2-rate_limiter_algorithms-sliding-window-counter-gap-rotation","id":"FA-73466","implementations":{"attempt":{"sha256":"f95fdd1997f656289f8c2ae11de133cc17a4cec4ea84cf6015cd8c1b66d6d8f4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    L = x['limit']\n    W = x['window_ms']\n    idx, prev, cur = 0, 0, 0\n    out = []\n    for t in x['requests']:\n        ci = t // W\n        if ci == idx + 1:\n            prev, cur = cur, 0\n        elif ci > idx + 1:\n            cur = 0\n        idx = ci\n        elapsed = t - idx * W\n        est = prev * Fraction(W - elapsed, W) + cur\n        if est + 1 <= L:\n            cur += 1\n            out.append(['allow', str(est + 1)])\n        else:\n            out.append(['deny', str(est)])\n    return [out, [idx, prev, cur]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1251, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '999/250'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2601, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3501, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1601, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '2197/1000'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 401, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '399/80'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [762, 1183, 1614, 1772, 2334, 2411, 2425, 2509, 2551, 2560, 2651, 2748, 2860, 2881],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '1817/1000'],\n     ['allow', '1193/500'],\n     ['allow', '807/250'],\n     ['allow', '1499/500'],\n     ['allow', '3767/1000'],\n     ['deny', '149/40'],\n     ['deny', '3473/1000'],\n     ['deny', '3347/1000'],\n     ['deny', '83/25'],\n     ['deny', '3047/1000'],\n     ['allow', '939/250'],\n     ['deny', '171/50'],\n     ['deny', '3357/1000']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 31], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1252, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '499/125'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2602, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3502, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1602, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '1097/500'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 402, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '199/40'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [2, 284, 685, 716, 946, 1419, 1442, 1550, 1788, 1900, 2219, 2384, 2628, 2704],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '4'],\n     ['allow', '831/250'],\n     ['deny', '404/125'],\n     ['allow', '19/5'],\n     ['allow', '481/125'],\n     ['deny', '17/5'],\n     ['allow', '3343/1000'],\n     ['allow', '481/125'],\n     ['deny', '779/250'],\n     ['allow', '486/125']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 32], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1253, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '997/250'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2603, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3503, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1603, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '2191/1000'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 403, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '397/80'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [88, 165, 511, 523, 538, 1193, 1202, 1389, 1722, 1826, 2373, 2548, 2774, 2968],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '4'],\n     ['deny', '807/250'],\n     ['deny', '399/125'],\n     ['allow', '861/250'],\n     ['allow', '389/125'],\n     ['allow', '462/125'],\n     ['allow', '2881/1000'],\n     ['allow', '839/250'],\n     ['allow', '1839/500'],\n     ['deny', '387/125']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 33], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1254, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '498/125'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2604, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3504, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1604, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '547/250'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 404, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '99/20'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [113, 180, 253, 634, 1224, 1448, 1496, 1722, 1887, 2254, 2425, 2792, 2877, 2945],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '388/125'],\n     ['allow', '401/125'],\n     ['deny', '377/125'],\n     ['allow', '389/125'],\n     ['allow', '863/250'],\n     ['allow', '1619/500'],\n     ['allow', '149/40'],\n     ['allow', '453/125'],\n     ['deny', '3369/1000'],\n     ['deny', '633/200']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 34], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1255, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '199/50'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2605, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3505, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1605, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '437/200'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 405, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '79/16'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [237, 850, 1324, 1370, 1559, 1744, 1852, 2112, 2117, 2141, 2288, 2346, 2510, 2979],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '294/125'],\n     ['allow', '163/50'],\n     ['allow', '1941/500'],\n     ['deny', '439/125'],\n     ['deny', '412/125'],\n     ['allow', '458/125'],\n     ['deny', '3649/1000'],\n     ['deny', '3577/1000'],\n     ['deny', '392/125'],\n     ['allow', '1981/500'],\n     ['deny', '347/100'],\n     ['allow', '3063/1000']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 35], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]]]\nfor label, args, expected in cases[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":"0c2bf4a21118270bd63265941e6e7262f452086ad4618cc8e7686578d9c8a181","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    L = x['limit']\n    W = x['window_ms']\n    idx, prev, cur = 0, 0, 0\n    out = []\n    for t in x['requests']:\n        ci = t // W\n        if ci > idx:\n            prev, cur = cur, 0\n        idx = ci\n        elapsed = t - idx * W\n        est = prev * Fraction(W - elapsed, W) + cur\n        if est + 1 <= L:\n            cur += 1\n            out.append(['allow', str(est + 1)])\n        else:\n            out.append(['deny', str(est)])\n    return [out, [idx, prev, cur]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1251, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '999/250'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2601, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3501, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1601, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '2197/1000'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 401, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '399/80'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [762, 1183, 1614, 1772, 2334, 2411, 2425, 2509, 2551, 2560, 2651, 2748, 2860, 2881],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '1817/1000'],\n     ['allow', '1193/500'],\n     ['allow', '807/250'],\n     ['allow', '1499/500'],\n     ['allow', '3767/1000'],\n     ['deny', '149/40'],\n     ['deny', '3473/1000'],\n     ['deny', '3347/1000'],\n     ['deny', '83/25'],\n     ['deny', '3047/1000'],\n     ['allow', '939/250'],\n     ['deny', '171/50'],\n     ['deny', '3357/1000']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 31], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1252, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '499/125'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2602, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3502, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1602, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '1097/500'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 402, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '199/40'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [2, 284, 685, 716, 946, 1419, 1442, 1550, 1788, 1900, 2219, 2384, 2628, 2704],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '4'],\n     ['allow', '831/250'],\n     ['deny', '404/125'],\n     ['allow', '19/5'],\n     ['allow', '481/125'],\n     ['deny', '17/5'],\n     ['allow', '3343/1000'],\n     ['allow', '481/125'],\n     ['deny', '779/250'],\n     ['allow', '486/125']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 32], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1253, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '997/250'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2603, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3503, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1603, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '2191/1000'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 403, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '397/80'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [88, 165, 511, 523, 538, 1193, 1202, 1389, 1722, 1826, 2373, 2548, 2774, 2968],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '4'],\n     ['deny', '807/250'],\n     ['deny', '399/125'],\n     ['allow', '861/250'],\n     ['allow', '389/125'],\n     ['allow', '462/125'],\n     ['allow', '2881/1000'],\n     ['allow', '839/250'],\n     ['allow', '1839/500'],\n     ['deny', '387/125']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 33], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1254, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '498/125'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2604, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3504, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1604, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '547/250'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 404, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '99/20'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [113, 180, 253, 634, 1224, 1448, 1496, 1722, 1887, 2254, 2425, 2792, 2877, 2945],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '388/125'],\n     ['allow', '401/125'],\n     ['deny', '377/125'],\n     ['allow', '389/125'],\n     ['allow', '863/250'],\n     ['allow', '1619/500'],\n     ['allow', '149/40'],\n     ['allow', '453/125'],\n     ['deny', '3369/1000'],\n     ['deny', '633/200']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 34], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1255, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '199/50'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2605, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3505, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1605, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '437/200'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 405, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '79/16'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [237, 850, 1324, 1370, 1559, 1744, 1852, 2112, 2117, 2141, 2288, 2346, 2510, 2979],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '294/125'],\n     ['allow', '163/50'],\n     ['allow', '1941/500'],\n     ['deny', '439/125'],\n     ['deny', '412/125'],\n     ['allow', '458/125'],\n     ['deny', '3649/1000'],\n     ['deny', '3577/1000'],\n     ['deny', '392/125'],\n     ['allow', '1981/500'],\n     ['deny', '347/100'],\n     ['allow', '3063/1000']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 35], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]]]\nfor label, args, expected in cases[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"},"fixed":{"sha256":"836e3d4e88b6b27cc6a242453cebbd413e62be8681b93adfe4a3252b4baa041e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nfrom fractions import Fraction\nN = 1\nobservations = []\ndef solve(x):\n    L = x['limit']\n    W = x['window_ms']\n    idx, prev, cur = 0, 0, 0\n    out = []\n    for t in x['requests']:\n        ci = t // W\n        if ci == idx + 1:\n            prev, cur = cur, 0\n        elif ci > idx + 1:\n            prev, cur = 0, 0\n        idx = ci\n        elapsed = t - idx * W\n        est = prev * Fraction(W - elapsed, W) + cur\n        if est + 1 <= L:\n            cur += 1\n            out.append(['allow', str(est + 1)])\n        else:\n            out.append(['deny', str(est)])\n    return [out, [idx, prev, cur]]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1251, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '999/250'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2601, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3501, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1601, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '2197/1000'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 401, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '399/80'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [762, 1183, 1614, 1772, 2334, 2411, 2425, 2509, 2551, 2560, 2651, 2748, 2860, 2881],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '1817/1000'],\n     ['allow', '1193/500'],\n     ['allow', '807/250'],\n     ['allow', '1499/500'],\n     ['allow', '3767/1000'],\n     ['deny', '149/40'],\n     ['deny', '3473/1000'],\n     ['deny', '3347/1000'],\n     ['deny', '83/25'],\n     ['deny', '3047/1000'],\n     ['allow', '939/250'],\n     ['deny', '171/50'],\n     ['deny', '3357/1000']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 31], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1252, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '499/125'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2602, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3502, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1602, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '1097/500'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 402, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '199/40'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [2, 284, 685, 716, 946, 1419, 1442, 1550, 1788, 1900, 2219, 2384, 2628, 2704],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '4'],\n     ['allow', '831/250'],\n     ['deny', '404/125'],\n     ['allow', '19/5'],\n     ['allow', '481/125'],\n     ['deny', '17/5'],\n     ['allow', '3343/1000'],\n     ['allow', '481/125'],\n     ['deny', '779/250'],\n     ['allow', '486/125']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 32], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1253, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '997/250'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2603, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3503, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1603, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '2191/1000'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 403, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '397/80'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [88, 165, 511, 523, 538, 1193, 1202, 1389, 1722, 1826, 2373, 2548, 2774, 2968],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '4'],\n     ['deny', '807/250'],\n     ['deny', '399/125'],\n     ['allow', '861/250'],\n     ['allow', '389/125'],\n     ['allow', '462/125'],\n     ['allow', '2881/1000'],\n     ['allow', '839/250'],\n     ['allow', '1839/500'],\n     ['deny', '387/125']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 33], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1254, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '498/125'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2604, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3504, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1604, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '547/250'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 404, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '99/20'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [113, 180, 253, 634, 1224, 1448, 1496, 1722, 1887, 2254, 2425, 2792, 2877, 2945],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['deny', '388/125'],\n     ['allow', '401/125'],\n     ['deny', '377/125'],\n     ['allow', '389/125'],\n     ['allow', '863/250'],\n     ['allow', '1619/500'],\n     ['allow', '149/40'],\n     ['allow', '453/125'],\n     ['deny', '3369/1000'],\n     ['deny', '633/200']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 34], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]],\n [['previous window weighting',\n   {'limit': 4, 'requests': [100, 200, 300, 400, 1255, 1500, 1750, 1800], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '199/50'],\n     ['allow', '4'],\n     ['allow', '4'],\n     ['deny', '19/5']],\n    [1, 4, 3]]],\n  ['gap clears history',\n   {'limit': 3, 'requests': [0, 1, 2, 2605, 2700, 2800, 2900], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['deny', '3']],\n    [2, 0, 3]]],\n  ['stale previous after gap',\n   {'limit': 3, 'requests': [100, 200, 1100, 1200, 3505, 3600, 3700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '14/5'],\n     ['deny', '13/5'],\n     ['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3']],\n    [3, 0, 3]]],\n  ['fractional estimate boundary',\n   {'limit': 3, 'requests': [0, 10, 20, 1500, 1605, 1700], 'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '5/2'],\n     ['deny', '437/200'],\n     ['allow', '29/10']],\n    [1, 3, 2]]],\n  ['early in window',\n   {'limit': 5, 'requests': [0, 50, 100, 150, 200, 405, 410, 420, 800, 801], 'window_ms': 400},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '3'],\n     ['allow', '4'],\n     ['allow', '5'],\n     ['deny', '79/16'],\n     ['deny', '39/8'],\n     ['deny', '19/4'],\n     ['allow', '1'],\n     ['allow', '2']],\n    [2, 0, 2]]],\n  ['random traffic',\n   {'limit': 4,\n    'requests': [237, 850, 1324, 1370, 1559, 1744, 1852, 2112, 2117, 2141, 2288, 2346, 2510, 2979],\n    'window_ms': 1000},\n   [[['allow', '1'],\n     ['allow', '2'],\n     ['allow', '294/125'],\n     ['allow', '163/50'],\n     ['allow', '1941/500'],\n     ['deny', '439/125'],\n     ['deny', '412/125'],\n     ['allow', '458/125'],\n     ['deny', '3649/1000'],\n     ['deny', '3577/1000'],\n     ['deny', '392/125'],\n     ['allow', '1981/500'],\n     ['deny', '347/100'],\n     ['allow', '3063/1000']],\n    [2, 3, 3]]],\n  ['single window',\n   {'limit': 2, 'requests': [10, 20, 35], 'window_ms': 1000},\n   [[['allow', '1'], ['allow', '2'], ['deny', '2']], [0, 0, 2]]]]]\nfor label, args, expected in cases[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, bounded teaching model with stipulated constants and pre-hashed or explicitly hashed inputs; it is not a production implementation and makes no claim of conformance to any library or paper beyond the stated contract. 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-rate_limiter_algorithms-sliding-window-counter-gap-rotation","generated_at":"2026-09-29T14:48:47.892330+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Edge proxies approximate a rolling window with two counters; the weighting and rotation rules determine whether boundary bursts are smoothed or doubled.","repair":"Clear both counters when more than one window has passed.","root_cause":"Any window advance rotates cur into prev, even when intermediate windows were empty.","sha256":"7487001c7233574693faf049428f2f0270d57c6e96cf3d3c54179726b736c93a","title":"Sliding-window counter approximation: stale window rotated in after a gap · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.093,"exit_code":1,"observations":[{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","999/250"],["allow","4"],["allow","4"],["deny","19/5"]],[1,4,3]],"check":"previous window weighting","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","999/250"],["allow","4"],["allow","4"],["deny","19/5"]],[1,4,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","1"],["allow","2"],["allow","3"],["deny","3"]],[2,0,3]],"check":"gap clears history","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","1"],["allow","2"],["allow","3"],["deny","3"]],[2,0,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","14/5"],["deny","13/5"],["allow","999/500"],["allow","14/5"],["deny","13/5"]],[3,2,2]],"check":"stale previous after gap","expected":[[["allow","1"],["allow","2"],["allow","14/5"],["deny","13/5"],["allow","1"],["allow","2"],["allow","3"]],[3,0,3]],"passed":false},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","5/2"],["deny","2197/1000"],["allow","29/10"]],[1,3,2]],"check":"fractional estimate boundary","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","5/2"],["deny","2197/1000"],["allow","29/10"]],[1,3,2]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","5"],["deny","399/80"],["deny","39/8"],["deny","19/4"],["allow","1"],["allow","2"]],[2,0,2]],"check":"early in window","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","5"],["deny","399/80"],["deny","39/8"],["deny","19/4"],["allow","1"],["allow","2"]],[2,0,2]],"passed":true},{"actual":[[["allow","1"],["allow","1817/1000"],["allow","1193/500"],["allow","807/250"],["allow","1499/500"],["allow","3767/1000"],["deny","149/40"],["deny","3473/1000"],["deny","3347/1000"],["deny","83/25"],["deny","3047/1000"],["allow","939/250"],["deny","171/50"],["deny","3357/1000"]],[2,3,3]],"check":"random traffic","expected":[[["allow","1"],["allow","1817/1000"],["allow","1193/500"],["allow","807/250"],["allow","1499/500"],["allow","3767/1000"],["deny","149/40"],["deny","3473/1000"],["deny","3347/1000"],["deny","83/25"],["deny","3047/1000"],["allow","939/250"],["deny","171/50"],["deny","3357/1000"]],[2,3,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["deny","2"]],[0,0,2]],"check":"single window","expected":[[["allow","1"],["allow","2"],["deny","2"]],[0,0,2]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"previous window weighting\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"999/250\"], [\"allow\", \"4\"], [\"allow\", \"4\"], [\"deny\", \"19/5\"]], [1, 4, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"999/250\"], [\"allow\", \"4\"], [\"allow\", \"4\"], [\"deny\", \"19/5\"]], [1, 4, 3]], \"passed\": true}, {\"check\": \"gap clears history\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"deny\", \"3\"]], [2, 0, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"deny\", \"3\"]], [2, 0, 3]], \"passed\": true}, {\"check\": \"stale previous after gap\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"], [\"allow\", \"999/500\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"]], [3, 2, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"]], [3, 0, 3]], \"passed\": false}, {\"check\": \"fractional estimate boundary\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"5/2\"], [\"deny\", \"2197/1000\"], [\"allow\", \"29/10\"]], [1, 3, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"5/2\"], [\"deny\", \"2197/1000\"], [\"allow\", \"29/10\"]], [1, 3, 2]], \"passed\": true}, {\"check\": \"early in window\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"5\"], [\"deny\", \"399/80\"], [\"deny\", \"39/8\"], [\"deny\", \"19/4\"], [\"allow\", \"1\"], [\"allow\", \"2\"]], [2, 0, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"5\"], [\"deny\", \"399/80\"], [\"deny\", \"39/8\"], [\"deny\", \"19/4\"], [\"allow\", \"1\"], [\"allow\", \"2\"]], [2, 0, 2]], \"passed\": true}, {\"check\": \"random traffic\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"1817/1000\"], [\"allow\", \"1193/500\"], [\"allow\", \"807/250\"], [\"allow\", \"1499/500\"], [\"allow\", \"3767/1000\"], [\"deny\", \"149/40\"], [\"deny\", \"3473/1000\"], [\"deny\", \"3347/1000\"], [\"deny\", \"83/25\"], [\"deny\", \"3047/1000\"], [\"allow\", \"939/250\"], [\"deny\", \"171/50\"], [\"deny\", \"3357/1000\"]], [2, 3, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"1817/1000\"], [\"allow\", \"1193/500\"], [\"allow\", \"807/250\"], [\"allow\", \"1499/500\"], [\"allow\", \"3767/1000\"], [\"deny\", \"149/40\"], [\"deny\", \"3473/1000\"], [\"deny\", \"3347/1000\"], [\"deny\", \"83/25\"], [\"deny\", \"3047/1000\"], [\"allow\", \"939/250\"], [\"deny\", \"171/50\"], [\"deny\", \"3357/1000\"]], [2, 3, 3]], \"passed\": true}, {\"check\": \"single window\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"deny\", \"2\"]], [0, 0, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"deny\", \"2\"]], [0, 0, 2]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.821,"exit_code":1,"observations":[{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","999/250"],["allow","4"],["allow","4"],["deny","19/5"]],[1,4,3]],"check":"previous window weighting","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","999/250"],["allow","4"],["allow","4"],["deny","19/5"]],[1,4,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","2197/1000"],["allow","29/10"],["deny","13/5"],["deny","23/10"]],[2,3,2]],"check":"gap clears history","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","1"],["allow","2"],["allow","3"],["deny","3"]],[2,0,3]],"passed":false},{"actual":[[["allow","1"],["allow","2"],["allow","14/5"],["deny","13/5"],["allow","1499/1000"],["allow","12/5"],["deny","23/10"]],[3,1,2]],"check":"stale previous after gap","expected":[[["allow","1"],["allow","2"],["allow","14/5"],["deny","13/5"],["allow","1"],["allow","2"],["allow","3"]],[3,0,3]],"passed":false},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","5/2"],["deny","2197/1000"],["allow","29/10"]],[1,3,2]],"check":"fractional estimate boundary","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","5/2"],["deny","2197/1000"],["allow","29/10"]],[1,3,2]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","5"],["deny","399/80"],["deny","39/8"],["deny","19/4"],["allow","1"],["allow","2"]],[2,0,2]],"check":"early in window","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","5"],["deny","399/80"],["deny","39/8"],["deny","19/4"],["allow","1"],["allow","2"]],[2,0,2]],"passed":true},{"actual":[[["allow","1"],["allow","1817/1000"],["allow","1193/500"],["allow","807/250"],["allow","1499/500"],["allow","3767/1000"],["deny","149/40"],["deny","3473/1000"],["deny","3347/1000"],["deny","83/25"],["deny","3047/1000"],["allow","939/250"],["deny","171/50"],["deny","3357/1000"]],[2,3,3]],"check":"random traffic","expected":[[["allow","1"],["allow","1817/1000"],["allow","1193/500"],["allow","807/250"],["allow","1499/500"],["allow","3767/1000"],["deny","149/40"],["deny","3473/1000"],["deny","3347/1000"],["deny","83/25"],["deny","3047/1000"],["allow","939/250"],["deny","171/50"],["deny","3357/1000"]],[2,3,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["deny","2"]],[0,0,2]],"check":"single window","expected":[[["allow","1"],["allow","2"],["deny","2"]],[0,0,2]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"previous window weighting\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"999/250\"], [\"allow\", \"4\"], [\"allow\", \"4\"], [\"deny\", \"19/5\"]], [1, 4, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"999/250\"], [\"allow\", \"4\"], [\"allow\", \"4\"], [\"deny\", \"19/5\"]], [1, 4, 3]], \"passed\": true}, {\"check\": \"gap clears history\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"2197/1000\"], [\"allow\", \"29/10\"], [\"deny\", \"13/5\"], [\"deny\", \"23/10\"]], [2, 3, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"deny\", \"3\"]], [2, 0, 3]], \"passed\": false}, {\"check\": \"stale previous after gap\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"], [\"allow\", \"1499/1000\"], [\"allow\", \"12/5\"], [\"deny\", \"23/10\"]], [3, 1, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"]], [3, 0, 3]], \"passed\": false}, {\"check\": \"fractional estimate boundary\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"5/2\"], [\"deny\", \"2197/1000\"], [\"allow\", \"29/10\"]], [1, 3, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"5/2\"], [\"deny\", \"2197/1000\"], [\"allow\", \"29/10\"]], [1, 3, 2]], \"passed\": true}, {\"check\": \"early in window\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"5\"], [\"deny\", \"399/80\"], [\"deny\", \"39/8\"], [\"deny\", \"19/4\"], [\"allow\", \"1\"], [\"allow\", \"2\"]], [2, 0, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"5\"], [\"deny\", \"399/80\"], [\"deny\", \"39/8\"], [\"deny\", \"19/4\"], [\"allow\", \"1\"], [\"allow\", \"2\"]], [2, 0, 2]], \"passed\": true}, {\"check\": \"random traffic\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"1817/1000\"], [\"allow\", \"1193/500\"], [\"allow\", \"807/250\"], [\"allow\", \"1499/500\"], [\"allow\", \"3767/1000\"], [\"deny\", \"149/40\"], [\"deny\", \"3473/1000\"], [\"deny\", \"3347/1000\"], [\"deny\", \"83/25\"], [\"deny\", \"3047/1000\"], [\"allow\", \"939/250\"], [\"deny\", \"171/50\"], [\"deny\", \"3357/1000\"]], [2, 3, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"1817/1000\"], [\"allow\", \"1193/500\"], [\"allow\", \"807/250\"], [\"allow\", \"1499/500\"], [\"allow\", \"3767/1000\"], [\"deny\", \"149/40\"], [\"deny\", \"3473/1000\"], [\"deny\", \"3347/1000\"], [\"deny\", \"83/25\"], [\"deny\", \"3047/1000\"], [\"allow\", \"939/250\"], [\"deny\", \"171/50\"], [\"deny\", \"3357/1000\"]], [2, 3, 3]], \"passed\": true}, {\"check\": \"single window\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"deny\", \"2\"]], [0, 0, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"deny\", \"2\"]], [0, 0, 2]], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.239,"exit_code":0,"observations":[{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","999/250"],["allow","4"],["allow","4"],["deny","19/5"]],[1,4,3]],"check":"previous window weighting","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","999/250"],["allow","4"],["allow","4"],["deny","19/5"]],[1,4,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","1"],["allow","2"],["allow","3"],["deny","3"]],[2,0,3]],"check":"gap clears history","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","1"],["allow","2"],["allow","3"],["deny","3"]],[2,0,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","14/5"],["deny","13/5"],["allow","1"],["allow","2"],["allow","3"]],[3,0,3]],"check":"stale previous after gap","expected":[[["allow","1"],["allow","2"],["allow","14/5"],["deny","13/5"],["allow","1"],["allow","2"],["allow","3"]],[3,0,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","5/2"],["deny","2197/1000"],["allow","29/10"]],[1,3,2]],"check":"fractional estimate boundary","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","5/2"],["deny","2197/1000"],["allow","29/10"]],[1,3,2]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","5"],["deny","399/80"],["deny","39/8"],["deny","19/4"],["allow","1"],["allow","2"]],[2,0,2]],"check":"early in window","expected":[[["allow","1"],["allow","2"],["allow","3"],["allow","4"],["allow","5"],["deny","399/80"],["deny","39/8"],["deny","19/4"],["allow","1"],["allow","2"]],[2,0,2]],"passed":true},{"actual":[[["allow","1"],["allow","1817/1000"],["allow","1193/500"],["allow","807/250"],["allow","1499/500"],["allow","3767/1000"],["deny","149/40"],["deny","3473/1000"],["deny","3347/1000"],["deny","83/25"],["deny","3047/1000"],["allow","939/250"],["deny","171/50"],["deny","3357/1000"]],[2,3,3]],"check":"random traffic","expected":[[["allow","1"],["allow","1817/1000"],["allow","1193/500"],["allow","807/250"],["allow","1499/500"],["allow","3767/1000"],["deny","149/40"],["deny","3473/1000"],["deny","3347/1000"],["deny","83/25"],["deny","3047/1000"],["allow","939/250"],["deny","171/50"],["deny","3357/1000"]],[2,3,3]],"passed":true},{"actual":[[["allow","1"],["allow","2"],["deny","2"]],[0,0,2]],"check":"single window","expected":[[["allow","1"],["allow","2"],["deny","2"]],[0,0,2]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"previous window weighting\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"999/250\"], [\"allow\", \"4\"], [\"allow\", \"4\"], [\"deny\", \"19/5\"]], [1, 4, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"999/250\"], [\"allow\", \"4\"], [\"allow\", \"4\"], [\"deny\", \"19/5\"]], [1, 4, 3]], \"passed\": true}, {\"check\": \"gap clears history\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"deny\", \"3\"]], [2, 0, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"deny\", \"3\"]], [2, 0, 3]], \"passed\": true}, {\"check\": \"stale previous after gap\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"]], [3, 0, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"14/5\"], [\"deny\", \"13/5\"], [\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"]], [3, 0, 3]], \"passed\": true}, {\"check\": \"fractional estimate boundary\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"5/2\"], [\"deny\", \"2197/1000\"], [\"allow\", \"29/10\"]], [1, 3, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"5/2\"], [\"deny\", \"2197/1000\"], [\"allow\", \"29/10\"]], [1, 3, 2]], \"passed\": true}, {\"check\": \"early in window\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"5\"], [\"deny\", \"399/80\"], [\"deny\", \"39/8\"], [\"deny\", \"19/4\"], [\"allow\", \"1\"], [\"allow\", \"2\"]], [2, 0, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"allow\", \"3\"], [\"allow\", \"4\"], [\"allow\", \"5\"], [\"deny\", \"399/80\"], [\"deny\", \"39/8\"], [\"deny\", \"19/4\"], [\"allow\", \"1\"], [\"allow\", \"2\"]], [2, 0, 2]], \"passed\": true}, {\"check\": \"random traffic\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"1817/1000\"], [\"allow\", \"1193/500\"], [\"allow\", \"807/250\"], [\"allow\", \"1499/500\"], [\"allow\", \"3767/1000\"], [\"deny\", \"149/40\"], [\"deny\", \"3473/1000\"], [\"deny\", \"3347/1000\"], [\"deny\", \"83/25\"], [\"deny\", \"3047/1000\"], [\"allow\", \"939/250\"], [\"deny\", \"171/50\"], [\"deny\", \"3357/1000\"]], [2, 3, 3]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"1817/1000\"], [\"allow\", \"1193/500\"], [\"allow\", \"807/250\"], [\"allow\", \"1499/500\"], [\"allow\", \"3767/1000\"], [\"deny\", \"149/40\"], [\"deny\", \"3473/1000\"], [\"deny\", \"3347/1000\"], [\"deny\", \"83/25\"], [\"deny\", \"3047/1000\"], [\"allow\", \"939/250\"], [\"deny\", \"171/50\"], [\"deny\", \"3357/1000\"]], [2, 3, 3]], \"passed\": true}, {\"check\": \"single window\", \"actual\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"deny\", \"2\"]], [0, 0, 2]], \"expected\": [[[\"allow\", \"1\"], [\"allow\", \"2\"], [\"deny\", \"2\"]], [0, 0, 2]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}