{"abstract":"The estimate barely reacts to new arrivals and throttling kicks in minutes late.","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":"A linear approximation of the decay is inaccurate for intervals comparable to tau.","family":"w2-rate_limiter_algorithms-ewma-rate-throttle-decay-units","id":"FA-73761","implementations":{"attempt":{"sha256":"703c6f65bbcec60ba760b444e87c3f10c58cc1a0639c0ade83d3fd89c8b51400","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 = max(0.0, 1 - 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"},"broken":{"sha256":"90f3880bfbd2d7d7ecf1699405101b6e87d45842c5407a404f2f167fad993228","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 * 1000))\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-decay-units","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 time constant in milliseconds is scaled by 1000 again.","sha256":"0703bc04311683ca8b58323207dbd4a89ecf51d41725b74bea798e154c66c528","title":"EWMA arrival-rate throttle: decay constant treated as seconds · 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":40.732,"exit_code":1,"observations":[{"actual":[["allow",0.0],["allow",1.0],["allow",1.9],["allow",2.71],["allow",3.439],["allow",4.095],["allow",4.686],["allow",5.217],["allow",5.695],["allow",6.126]],"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",2.0],["allow",3.96],["allow",5.881],["allow",7.763],["allow",9.592],["allow",1.054]],"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.25],["allow",1.25],["allow",1.25],["allow",2.186],["allow",2.186]],"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.0],["allow",1.0],["allow",1.8],["allow",2.44]],"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.429],["allow",2.457],["allow",3.64],["allow",4.933],["deny",6.221],["deny",6.574],["deny",6.228],["allow",1.856],["allow",2.009],["allow",3.398],["allow",2.637]],"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.333],["allow",0.333],["allow",0.75]],"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\", 1.0], [\"allow\", 1.9], [\"allow\", 2.71], [\"allow\", 3.439], [\"allow\", 4.095], [\"allow\", 4.686], [\"allow\", 5.217], [\"allow\", 5.695], [\"allow\", 6.126]], \"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\", 2.0], [\"allow\", 3.96], [\"allow\", 5.881], [\"allow\", 7.763], [\"allow\", 9.592], [\"allow\", 1.054]], \"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.25], [\"allow\", 1.25], [\"allow\", 1.25], [\"allow\", 2.186], [\"allow\", 2.186]], \"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.0], [\"allow\", 1.0], [\"allow\", 1.8], [\"allow\", 2.44]], \"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.429], [\"allow\", 2.457], [\"allow\", 3.64], [\"allow\", 4.933], [\"deny\", 6.221], [\"deny\", 6.574], [\"deny\", 6.228], [\"allow\", 1.856], [\"allow\", 2.009], [\"allow\", 3.398], [\"allow\", 2.637]], \"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.333], [\"allow\", 0.333], [\"allow\", 0.75]], \"expected\": [[\"allow\", 0.0], [\"allow\", 0.259], [\"allow\", 0.317], [\"allow\", 0.689]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.472,"exit_code":1,"observations":[{"actual":[["allow",0.0],["allow",0.001],["allow",0.002],["allow",0.003],["allow",0.004],["allow",0.005],["allow",0.006],["allow",0.007],["allow",0.008],["allow",0.009]],"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.01],["allow",0.012]],"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.003]],"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.003],["allow",0.004],["allow",0.006],["allow",0.007],["allow",0.009],["allow",0.01],["allow",0.011],["allow",0.013],["allow",0.014],["allow",0.016]],"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.001],["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.004], [\"allow\", 0.005], [\"allow\", 0.006], [\"allow\", 0.007], [\"allow\", 0.008], [\"allow\", 0.009]], \"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.01], [\"allow\", 0.012]], \"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.003]], \"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.003], [\"allow\", 0.004], [\"allow\", 0.006], [\"allow\", 0.007], [\"allow\", 0.009], [\"allow\", 0.01], [\"allow\", 0.011], [\"allow\", 0.013], [\"allow\", 0.014], [\"allow\", 0.016]], \"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.001], [\"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."}}