{"abstract":"Estimates are a thousand times too small and nothing is ever throttled.","category":"Rate limiter algorithms","checks":6,"contract":"Input {tau_ms, limit_rps, requests [t_ms]}. The rate estimate r starts at 0. For each arrival strictly after the latest seen time, dt = t - last, a = exp(-dt/tau) and r = a*r + (1-a)*(1000/dt) requests per second. Simultaneous or late arrivals leave r unchanged and never move the clock backwards. Every arrival reports deny if r > limit else allow, with r rounded to 3 decimals.","contract_signature":"x","evaluation_group":"w2-rate_limiter_algorithms-ewma-rate-throttle","failed_approach":"Adding one millisecond to every interval under-estimates short intervals.","family":"w2-rate_limiter_algorithms-ewma-rate-throttle-instant-rate","id":"FA-73766","implementations":{"attempt":{"sha256":"8b56e7a04a89f44bb7b740d543c9f4ea8b63645f4cbdfa83a7714f71df61befa","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    tau = x['tau_ms']\n    lim = x['limit_rps']\n    r = 0.0\n    last = None\n    out = []\n    for t in x['requests']:\n        if last is not None and t > last:\n            dt = t - last\n            a = math.exp(-dt / tau)\n            r = a * r + (1 - a) * (1000.0 / (dt + 1))\n        last = t if last is None else max(last, t)\n        out.append(['deny' if r > lim else 'allow', round(r, 3)])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[['steady ten per second',\n   {'limit_rps': 12, 'requests': [1, 101, 201, 301, 401, 501, 601, 701, 801, 901], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 51, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.499],\n    ['allow', 2.319]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 401, 401], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.966],\n    ['allow', 1.966]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 301, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [714, 757, 953, 1023, 1049, 1069, 1190, 1379, 2031, 2512, 2526, 2977],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.386],\n    ['allow', 2.293],\n    ['allow', 3.434],\n    ['allow', 4.712],\n    ['allow', 5.987],\n    ['deny', 6.349],\n    ['deny', 6.098],\n    ['allow', 3.332],\n    ['allow', 2.709],\n    ['allow', 4.07],\n    ['allow', 3.19]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6001, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.317], ['allow', 0.689]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [2, 102, 202, 302, 402, 502, 602, 702, 802, 902], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 52, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.482],\n    ['allow', 2.32]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 402, 402], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.964],\n    ['allow', 1.964]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 302, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [216, 250, 522, 784, 966, 1254, 1553, 2058, 2080, 2239, 2561, 2685],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.394],\n    ['allow', 2.129],\n    ['allow', 2.656],\n    ['allow', 3.306],\n    ['allow', 3.362],\n    ['allow', 3.356],\n    ['allow', 2.649],\n    ['allow', 3.973],\n    ['allow', 4.444],\n    ['allow', 3.95],\n    ['allow', 4.618]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6002, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.317], ['allow', 0.689]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [3, 103, 203, 303, 403, 503, 603, 703, 803, 903], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 53, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.465],\n    ['allow', 2.321]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 403, 403], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.962],\n    ['allow', 1.962]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 303, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [86, 138, 254, 788, 1018, 1187, 1336, 1765, 2119, 2249, 2554, 2910],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.377],\n    ['allow', 2.483],\n    ['allow', 2.157],\n    ['allow', 2.771],\n    ['allow', 3.446],\n    ['allow', 4.072],\n    ['allow', 3.274],\n    ['allow', 3.096],\n    ['allow', 3.875],\n    ['allow', 3.664],\n    ['allow', 3.323]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6003, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.317], ['allow', 0.69]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [4, 104, 204, 304, 404, 504, 604, 704, 804, 904], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 54, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.448],\n    ['allow', 2.322]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 404, 404], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.96],\n    ['allow', 1.96]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 304, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [385, 507, 716, 724, 1100, 1757, 1778, 1945, 2017, 2160, 2509, 2770],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.311],\n    ['allow', 2.208],\n    ['allow', 3.603],\n    ['allow', 3.211],\n    ['allow', 2.183],\n    ['allow', 3.526],\n    ['allow', 4.048],\n    ['allow', 5.01],\n    ['allow', 5.376],\n    ['allow', 4.391],\n    ['allow', 4.217]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6004, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.316], ['allow', 0.69]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [5, 105, 205, 305, 405, 505, 605, 705, 805, 905], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 55, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.431],\n    ['allow', 2.323]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 405, 405], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.959],\n    ['allow', 1.959]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 305, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [165, 419, 489, 1134, 1196, 1250, 1558, 1747, 2333, 2495, 2720, 2742],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.198],\n    ['allow', 2.444],\n    ['allow', 1.906],\n    ['allow', 3.111],\n    ['allow', 4.255],\n    ['allow', 3.896],\n    ['allow', 4.226],\n    ['allow', 2.797],\n    ['allow', 3.495],\n    ['allow', 3.756],\n    ['allow', 5.046]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6005, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.316], ['allow', 0.69]]]]]\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":"778c92dd433f93ba91f3f00d3c7e502a40e4c245dc08f439c304ca1ca97722f7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    tau = x['tau_ms']\n    lim = x['limit_rps']\n    r = 0.0\n    last = None\n    out = []\n    for t in x['requests']:\n        if last is not None and t > last:\n            dt = t - last\n            a = math.exp(-dt / tau)\n            r = a * r + (1 - a) * (1.0 / dt)\n        last = t if last is None else max(last, t)\n        out.append(['deny' if r > lim else 'allow', round(r, 3)])\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[['steady ten per second',\n   {'limit_rps': 12, 'requests': [1, 101, 201, 301, 401, 501, 601, 701, 801, 901], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 51, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.499],\n    ['allow', 2.319]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 401, 401], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.966],\n    ['allow', 1.966]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 301, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [714, 757, 953, 1023, 1049, 1069, 1190, 1379, 2031, 2512, 2526, 2977],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.386],\n    ['allow', 2.293],\n    ['allow', 3.434],\n    ['allow', 4.712],\n    ['allow', 5.987],\n    ['deny', 6.349],\n    ['deny', 6.098],\n    ['allow', 3.332],\n    ['allow', 2.709],\n    ['allow', 4.07],\n    ['allow', 3.19]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6001, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.317], ['allow', 0.689]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [2, 102, 202, 302, 402, 502, 602, 702, 802, 902], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 52, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.482],\n    ['allow', 2.32]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 402, 402], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.964],\n    ['allow', 1.964]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 302, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [216, 250, 522, 784, 966, 1254, 1553, 2058, 2080, 2239, 2561, 2685],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.394],\n    ['allow', 2.129],\n    ['allow', 2.656],\n    ['allow', 3.306],\n    ['allow', 3.362],\n    ['allow', 3.356],\n    ['allow', 2.649],\n    ['allow', 3.973],\n    ['allow', 4.444],\n    ['allow', 3.95],\n    ['allow', 4.618]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6002, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.317], ['allow', 0.689]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [3, 103, 203, 303, 403, 503, 603, 703, 803, 903], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 53, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.465],\n    ['allow', 2.321]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 403, 403], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.962],\n    ['allow', 1.962]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 303, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [86, 138, 254, 788, 1018, 1187, 1336, 1765, 2119, 2249, 2554, 2910],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.377],\n    ['allow', 2.483],\n    ['allow', 2.157],\n    ['allow', 2.771],\n    ['allow', 3.446],\n    ['allow', 4.072],\n    ['allow', 3.274],\n    ['allow', 3.096],\n    ['allow', 3.875],\n    ['allow', 3.664],\n    ['allow', 3.323]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6003, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.317], ['allow', 0.69]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [4, 104, 204, 304, 404, 504, 604, 704, 804, 904], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 54, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.448],\n    ['allow', 2.322]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 404, 404], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.96],\n    ['allow', 1.96]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 304, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [385, 507, 716, 724, 1100, 1757, 1778, 1945, 2017, 2160, 2509, 2770],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.311],\n    ['allow', 2.208],\n    ['allow', 3.603],\n    ['allow', 3.211],\n    ['allow', 2.183],\n    ['allow', 3.526],\n    ['allow', 4.048],\n    ['allow', 5.01],\n    ['allow', 5.376],\n    ['allow', 4.391],\n    ['allow', 4.217]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6004, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.316], ['allow', 0.69]]]],\n [['steady ten per second',\n   {'limit_rps': 12, 'requests': [5, 105, 205, 305, 405, 505, 605, 705, 805, 905], 'tau_ms': 1000},\n   [['allow', 0.0],\n    ['allow', 0.952],\n    ['allow', 1.813],\n    ['allow', 2.592],\n    ['allow', 3.297],\n    ['allow', 3.935],\n    ['allow', 4.512],\n    ['allow', 5.034],\n    ['allow', 5.507],\n    ['allow', 5.934]]],\n  ['burst crosses limit',\n   {'limit_rps': 20, 'requests': [0, 10, 20, 30, 40, 55, 1000], 'tau_ms': 500},\n   [['allow', 0.0],\n    ['allow', 1.98],\n    ['allow', 3.921],\n    ['allow', 5.824],\n    ['allow', 7.688],\n    ['allow', 9.431],\n    ['allow', 2.323]]],\n  ['simultaneous arrivals',\n   {'limit_rps': 5, 'requests': [0, 200, 200, 200, 405, 405], 'tau_ms': 800},\n   [['allow', 0.0],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.106],\n    ['allow', 1.959],\n    ['allow', 1.959]]],\n  ['late arrival ignored for clock',\n   {'limit_rps': 8, 'requests': [0, 500, 305, 700, 900], 'tau_ms': 1000},\n   [['allow', 0.0], ['allow', 0.787], ['allow', 0.787], ['allow', 1.551], ['allow', 2.176]]],\n  ['random arrivals',\n   {'limit_rps': 6,\n    'requests': [165, 419, 489, 1134, 1196, 1250, 1558, 1747, 2333, 2495, 2720, 2742],\n    'tau_ms': 700},\n   [['allow', 0.0],\n    ['allow', 1.198],\n    ['allow', 2.444],\n    ['allow', 1.906],\n    ['allow', 3.111],\n    ['allow', 4.255],\n    ['allow', 3.896],\n    ['allow', 4.226],\n    ['allow', 2.797],\n    ['allow', 3.495],\n    ['allow', 3.756],\n    ['allow', 5.046]]],\n  ['slow client',\n   {'limit_rps': 1, 'requests': [0, 3000, 6005, 6500], 'tau_ms': 2000},\n   [['allow', 0.0], ['allow', 0.259], ['allow', 0.316], ['allow', 0.69]]]]]\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-ewma-rate-throttle-instant-rate","generated_at":"2026-09-29T14:48:50.709146+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Irregular-interval EWMA estimators throttle clients by smoothed request rate; time-unit and duplicate-timestamp handling decide whether bursts are detected.","root_cause":"The instantaneous rate is 1/dt per millisecond instead of 1000/dt per second.","sha256":"0b8d0e11cfe284ce7598c7a5720c87b1fa3460de1ba0545576b6c3deb323747d","title":"EWMA arrival-rate throttle: instantaneous rate per millisecond · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":38.765,"exit_code":1,"observations":[{"actual":[["allow",0.0],["allow",0.942],["allow",1.795],["allow",2.566],["allow",3.264],["allow",3.896],["allow",4.467],["allow",4.984],["allow",5.452],["allow",5.876]],"check":"steady ten per second","expected":[["allow",0.0],["allow",0.952],["allow",1.813],["allow",2.592],["allow",3.297],["allow",3.935],["allow",4.512],["allow",5.034],["allow",5.507],["allow",5.934]],"passed":false},{"actual":[["allow",0.0],["allow",1.8],["allow",3.565],["allow",5.294],["allow",6.989],["allow",8.651],["allow",2.191]],"check":"burst crosses limit","expected":[["allow",0.0],["allow",1.98],["allow",3.921],["allow",5.824],["allow",7.688],["allow",9.499],["allow",2.319]],"passed":false},{"actual":[["allow",0.0],["allow",1.1],["allow",1.1],["allow",1.1],["allow",1.956],["allow",1.956]],"check":"simultaneous arrivals","expected":[["allow",0.0],["allow",1.106],["allow",1.106],["allow",1.106],["allow",1.966],["allow",1.966]],"passed":false},{"actual":[["allow",0.0],["allow",0.785],["allow",0.785],["allow",1.545],["allow",2.167]],"check":"late arrival ignored for clock","expected":[["allow",0.0],["allow",0.787],["allow",0.787],["allow",1.551],["allow",2.176]],"passed":false},{"actual":[["allow",0.0],["allow",1.354],["allow",2.263],["allow",3.388],["allow",4.615],["allow",5.826],["deny",6.203],["allow",5.98],["allow",3.284],["allow",2.683],["allow",3.95],["allow",3.125]],"check":"random arrivals","expected":[["allow",0.0],["allow",1.386],["allow",2.293],["allow",3.434],["allow",4.712],["allow",5.987],["deny",6.349],["deny",6.098],["allow",3.332],["allow",2.709],["allow",4.07],["allow",3.19]],"passed":false},{"actual":[["allow",0.0],["allow",0.259],["allow",0.317],["allow",0.688]],"check":"slow client","expected":[["allow",0.0],["allow",0.259],["allow",0.317],["allow",0.689]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"steady ten per second\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.942], [\"allow\", 1.795], [\"allow\", 2.566], [\"allow\", 3.264], [\"allow\", 3.896], [\"allow\", 4.467], [\"allow\", 4.984], [\"allow\", 5.452], [\"allow\", 5.876]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.952], [\"allow\", 1.813], [\"allow\", 2.592], [\"allow\", 3.297], [\"allow\", 3.935], [\"allow\", 4.512], [\"allow\", 5.034], [\"allow\", 5.507], [\"allow\", 5.934]], \"passed\": false}, {\"check\": \"burst crosses limit\", \"actual\": [[\"allow\", 0.0], [\"allow\", 1.8], [\"allow\", 3.565], [\"allow\", 5.294], [\"allow\", 6.989], [\"allow\", 8.651], [\"allow\", 2.191]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.98], [\"allow\", 3.921], [\"allow\", 5.824], [\"allow\", 7.688], [\"allow\", 9.499], [\"allow\", 2.319]], \"passed\": false}, {\"check\": \"simultaneous arrivals\", \"actual\": [[\"allow\", 0.0], [\"allow\", 1.1], [\"allow\", 1.1], [\"allow\", 1.1], [\"allow\", 1.956], [\"allow\", 1.956]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.966], [\"allow\", 1.966]], \"passed\": false}, {\"check\": \"late arrival ignored for clock\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.785], [\"allow\", 0.785], [\"allow\", 1.545], [\"allow\", 2.167]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.787], [\"allow\", 0.787], [\"allow\", 1.551], [\"allow\", 2.176]], \"passed\": false}, {\"check\": \"random arrivals\", \"actual\": [[\"allow\", 0.0], [\"allow\", 1.354], [\"allow\", 2.263], [\"allow\", 3.388], [\"allow\", 4.615], [\"allow\", 5.826], [\"deny\", 6.203], [\"allow\", 5.98], [\"allow\", 3.284], [\"allow\", 2.683], [\"allow\", 3.95], [\"allow\", 3.125]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.386], [\"allow\", 2.293], [\"allow\", 3.434], [\"allow\", 4.712], [\"allow\", 5.987], [\"deny\", 6.349], [\"deny\", 6.098], [\"allow\", 3.332], [\"allow\", 2.709], [\"allow\", 4.07], [\"allow\", 3.19]], \"passed\": false}, {\"check\": \"slow client\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.688]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.52,"exit_code":1,"observations":[{"actual":[["allow",0.0],["allow",0.001],["allow",0.002],["allow",0.003],["allow",0.003],["allow",0.004],["allow",0.005],["allow",0.005],["allow",0.006],["allow",0.006]],"check":"steady ten per second","expected":[["allow",0.0],["allow",0.952],["allow",1.813],["allow",2.592],["allow",3.297],["allow",3.935],["allow",4.512],["allow",5.034],["allow",5.507],["allow",5.934]],"passed":false},{"actual":[["allow",0.0],["allow",0.002],["allow",0.004],["allow",0.006],["allow",0.008],["allow",0.009],["allow",0.002]],"check":"burst crosses limit","expected":[["allow",0.0],["allow",1.98],["allow",3.921],["allow",5.824],["allow",7.688],["allow",9.499],["allow",2.319]],"passed":false},{"actual":[["allow",0.0],["allow",0.001],["allow",0.001],["allow",0.001],["allow",0.002],["allow",0.002]],"check":"simultaneous arrivals","expected":[["allow",0.0],["allow",1.106],["allow",1.106],["allow",1.106],["allow",1.966],["allow",1.966]],"passed":false},{"actual":[["allow",0.0],["allow",0.001],["allow",0.001],["allow",0.002],["allow",0.002]],"check":"late arrival ignored for clock","expected":[["allow",0.0],["allow",0.787],["allow",0.787],["allow",1.551],["allow",2.176]],"passed":false},{"actual":[["allow",0.0],["allow",0.001],["allow",0.002],["allow",0.003],["allow",0.005],["allow",0.006],["allow",0.006],["allow",0.006],["allow",0.003],["allow",0.003],["allow",0.004],["allow",0.003]],"check":"random arrivals","expected":[["allow",0.0],["allow",1.386],["allow",2.293],["allow",3.434],["allow",4.712],["allow",5.987],["deny",6.349],["deny",6.098],["allow",3.332],["allow",2.709],["allow",4.07],["allow",3.19]],"passed":false},{"actual":[["allow",0.0],["allow",0.0],["allow",0.0],["allow",0.001]],"check":"slow client","expected":[["allow",0.0],["allow",0.259],["allow",0.317],["allow",0.689]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"steady ten per second\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.001], [\"allow\", 0.002], [\"allow\", 0.003], [\"allow\", 0.003], [\"allow\", 0.004], [\"allow\", 0.005], [\"allow\", 0.005], [\"allow\", 0.006], [\"allow\", 0.006]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.952], [\"allow\", 1.813], [\"allow\", 2.592], [\"allow\", 3.297], [\"allow\", 3.935], [\"allow\", 4.512], [\"allow\", 5.034], [\"allow\", 5.507], [\"allow\", 5.934]], \"passed\": false}, {\"check\": \"burst crosses limit\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.002], [\"allow\", 0.004], [\"allow\", 0.006], [\"allow\", 0.008], [\"allow\", 0.009], [\"allow\", 0.002]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.98], [\"allow\", 3.921], [\"allow\", 5.824], [\"allow\", 7.688], [\"allow\", 9.499], [\"allow\", 2.319]], \"passed\": false}, {\"check\": \"simultaneous arrivals\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.001], [\"allow\", 0.001], [\"allow\", 0.001], [\"allow\", 0.002], [\"allow\", 0.002]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.966], [\"allow\", 1.966]], \"passed\": false}, {\"check\": \"late arrival ignored for clock\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.001], [\"allow\", 0.001], [\"allow\", 0.002], [\"allow\", 0.002]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.787], [\"allow\", 0.787], [\"allow\", 1.551], [\"allow\", 2.176]], \"passed\": false}, {\"check\": \"random arrivals\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.001], [\"allow\", 0.002], [\"allow\", 0.003], [\"allow\", 0.005], [\"allow\", 0.006], [\"allow\", 0.006], [\"allow\", 0.006], [\"allow\", 0.003], [\"allow\", 0.003], [\"allow\", 0.004], [\"allow\", 0.003]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.386], [\"allow\", 2.293], [\"allow\", 3.434], [\"allow\", 4.712], [\"allow\", 5.987], [\"deny\", 6.349], [\"deny\", 6.098], [\"allow\", 3.332], [\"allow\", 2.709], [\"allow\", 4.07], [\"allow\", 3.19]], \"passed\": false}, {\"check\": \"slow client\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.0], [\"allow\", 0.0], [\"allow\", 0.001]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"passed\": false}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}