{"abstract":"Long gaps keep the old rate while short gaps discard it, inverting the smoothing.","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.","evaluation_group":"w2-rate_limiter_algorithms-ewma-rate-throttle","failed_approach":"Never decaying the previous estimate makes the rate grow without bound.","family":"w2-rate_limiter_algorithms-ewma-rate-throttle-blend-weights","id":"FA-73776","implementations":{"attempt":{"sha256":"eb452aebaabef80ff6ae28255783cd81dd9dadfb6ed1f7e6c05499bf0069f28a","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 = r + (1 - a) * (1000.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"},"broken":{"sha256":"082d3f854f14b654eccd94a421c89f5af12822269e21a9a247076858e315d377","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 = (1 - a) * r + a * (1000.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"},"fixed":{"sha256":"ae9e342895343a060b50275053ac8ec827ac062821b494aaada7838947fc65eb","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)\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-blend-weights","generated_at":"2026-09-29T14:48:50.708081+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.","repair":"Weight the previous estimate by a and the new sample by 1 - a.","root_cause":"The decay factor weights the new sample instead of the previous estimate.","sha256":"b57a1974a13d405e5ce123030c57be6af07cac8cf97b778d2936d7fa79be7207","title":"EWMA arrival-rate throttle: blend weights swapped · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.887,"exit_code":1,"observations":[{"actual":[["allow",0.0],["allow",0.952],["allow",1.903],["allow",2.855],["allow",3.807],["allow",4.758],["allow",5.71],["allow",6.661],["allow",7.613],["allow",8.565]],"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.98],["allow",3.96],["allow",5.94],["allow",7.921],["allow",9.899],["allow",10.795]],"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.106],["allow",1.106],["allow",1.106],["allow",2.211],["allow",2.211]],"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.787],["allow",0.787],["allow",1.693],["allow",2.6]],"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.386],["allow",2.632],["allow",3.991],["allow",5.393],["deny",6.802],["deny",8.114],["deny",9.366],["deny",10.295],["deny",11.328],["deny",12.743],["deny",13.796]],"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.518],["allow",0.96]],"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.952], [\"allow\", 1.903], [\"allow\", 2.855], [\"allow\", 3.807], [\"allow\", 4.758], [\"allow\", 5.71], [\"allow\", 6.661], [\"allow\", 7.613], [\"allow\", 8.565]], \"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.98], [\"allow\", 3.96], [\"allow\", 5.94], [\"allow\", 7.921], [\"allow\", 9.899], [\"allow\", 10.795]], \"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.106], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 2.211], [\"allow\", 2.211]], \"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.787], [\"allow\", 0.787], [\"allow\", 1.693], [\"allow\", 2.6]], \"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.386], [\"allow\", 2.632], [\"allow\", 3.991], [\"allow\", 5.393], [\"deny\", 6.802], [\"deny\", 8.114], [\"deny\", 9.366], [\"deny\", 10.295], [\"deny\", 11.328], [\"deny\", 12.743], [\"deny\", 13.796]], \"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.518], [\"allow\", 0.96]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":37.116,"exit_code":1,"observations":[{"actual":[["allow",0.0],["allow",9.048],["allow",9.909],["allow",9.991],["allow",9.999],["allow",10.0],["allow",10.0],["allow",10.0],["allow",10.0],["allow",10.0]],"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],["deny",98.02],["deny",99.961],["deny",99.999],["deny",100.0],["deny",91.107],["deny",77.611]],"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",3.894],["allow",3.894],["allow",3.894],["allow",4.735],["allow",4.735]],"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",1.213],["allow",1.213],["allow",4.314],["allow",4.876]],"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],["deny",21.87],["deny",9.197],["deny",13.801],["deny",37.562],["deny",49.65],["deny",14.834],["deny",7.549],["allow",5.179],["allow",3.62],["deny",70.086],["deny",34.452]],"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.074],["allow",0.132],["deny",1.591]],"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\", 9.048], [\"allow\", 9.909], [\"allow\", 9.991], [\"allow\", 9.999], [\"allow\", 10.0], [\"allow\", 10.0], [\"allow\", 10.0], [\"allow\", 10.0], [\"allow\", 10.0]], \"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], [\"deny\", 98.02], [\"deny\", 99.961], [\"deny\", 99.999], [\"deny\", 100.0], [\"deny\", 91.107], [\"deny\", 77.611]], \"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\", 3.894], [\"allow\", 3.894], [\"allow\", 3.894], [\"allow\", 4.735], [\"allow\", 4.735]], \"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\", 1.213], [\"allow\", 1.213], [\"allow\", 4.314], [\"allow\", 4.876]], \"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], [\"deny\", 21.87], [\"deny\", 9.197], [\"deny\", 13.801], [\"deny\", 37.562], [\"deny\", 49.65], [\"deny\", 14.834], [\"deny\", 7.549], [\"allow\", 5.179], [\"allow\", 3.62], [\"deny\", 70.086], [\"deny\", 34.452]], \"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.074], [\"allow\", 0.132], [\"deny\", 1.591]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.897,"exit_code":0,"observations":[{"actual":[["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]],"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":true},{"actual":[["allow",0.0],["allow",1.98],["allow",3.921],["allow",5.824],["allow",7.688],["allow",9.499],["allow",2.319]],"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":true},{"actual":[["allow",0.0],["allow",1.106],["allow",1.106],["allow",1.106],["allow",1.966],["allow",1.966]],"check":"simultaneous arrivals","expected":[["allow",0.0],["allow",1.106],["allow",1.106],["allow",1.106],["allow",1.966],["allow",1.966]],"passed":true},{"actual":[["allow",0.0],["allow",0.787],["allow",0.787],["allow",1.551],["allow",2.176]],"check":"late arrival ignored for clock","expected":[["allow",0.0],["allow",0.787],["allow",0.787],["allow",1.551],["allow",2.176]],"passed":true},{"actual":[["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]],"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":true},{"actual":[["allow",0.0],["allow",0.259],["allow",0.317],["allow",0.689]],"check":"slow client","expected":[["allow",0.0],["allow",0.259],["allow",0.317],["allow",0.689]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"steady ten per second\", \"actual\": [[\"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]], \"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\": true}, {\"check\": \"burst crosses limit\", \"actual\": [[\"allow\", 0.0], [\"allow\", 1.98], [\"allow\", 3.921], [\"allow\", 5.824], [\"allow\", 7.688], [\"allow\", 9.499], [\"allow\", 2.319]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.98], [\"allow\", 3.921], [\"allow\", 5.824], [\"allow\", 7.688], [\"allow\", 9.499], [\"allow\", 2.319]], \"passed\": true}, {\"check\": \"simultaneous arrivals\", \"actual\": [[\"allow\", 0.0], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.966], [\"allow\", 1.966]], \"expected\": [[\"allow\", 0.0], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.106], [\"allow\", 1.966], [\"allow\", 1.966]], \"passed\": true}, {\"check\": \"late arrival ignored for clock\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.787], [\"allow\", 0.787], [\"allow\", 1.551], [\"allow\", 2.176]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.787], [\"allow\", 0.787], [\"allow\", 1.551], [\"allow\", 2.176]], \"passed\": true}, {\"check\": \"random arrivals\", \"actual\": [[\"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]], \"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\": true}, {\"check\": \"slow client\", \"actual\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}