{"abstract":"The event trace violates the edge only rule and produces incorrect keyboard state or command output.","category":"Keyboard interactions","checks":8,"contract":"Case [threshold,scans]. Each scan is [time,sorted_pressed_keys] and times increase. A raw transition starts a candidate timer; a candidate becomes stable after continuously present for threshold time including exact boundary. Each scan considers every known or raw key. Emit [key,down_or_up,time] on stable transitions; return emissions plus stable pressed keys. Missing keys are raw up. Inputs are finite ordered event traces; return the stated deterministic state. Batch entries are independent. N varies the number of independent input transactions.","evaluation_group":"s3-keyboard-key-debounce","failed_approach":"The partial repair changes this transition to stable.get(key,False)==value, which still violates the model contract on the explicit regression traces.","family":"s3-keyboard-interactions-key-debounce-edge-only","id":"FA-31671","implementations":{"attempt":{"sha256":"234a54036bcd2c6541b780f003218cbfb0e22f4da52b9ce7f93f314bdabc3856","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(cases):\n    def run(c):\n        threshold,scans=c\n        stable={}; candidate={}; since={}; output=[]\n        for now,pressed in scans:\n            raw=set(pressed)\n            keys=sorted(set(stable)|set(candidate)|raw)\n            for key in keys:\n                value=key in raw\n                if key not in candidate or candidate[key]!=value:\n                    candidate[key]=value\n                    since[key]=now\n                if now-since[key]>=threshold and stable.get(key,False)==value:\n                    stable[key]=value\n                    output.append([key,'down' if value else 'up',now])\n        return [output,sorted(k for k,v in stable.items() if v)]\n    return [run(c) for c in cases]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('key-debounce scenario 0', solve([[3, []]] * N), [[[], []]] * N)\ncheck('key-debounce scenario 1', solve([[3, [[10, ['A']], [12, ['A']], [13, ['A']], [14, ['A']]]]] * N), [[[['A', 'down', 13]], ['A']]] * N)\ncheck('key-debounce scenario 2', solve([[3, [[10, ['A']], [13, ['A']], [14, []], [17, []]]]] * N), [[[['A', 'down', 13], ['A', 'up', 17]], []]] * N)\ncheck('key-debounce scenario 3', solve([[3, [[10, ['A']], [11, []], [12, ['A']], [14, ['A']], [15, ['A']]]]] * N), [[[['A', 'down', 15]], ['A']]] * N)\ncheck('key-debounce scenario 4', solve([[3, [[10, ['A']], [13, ['A']], [14, ['B']], [17, ['B']]]]] * N), [[[['A', 'down', 13], ['A', 'up', 17], ['B', 'down', 17]], ['B']]] * N)\ncheck('key-debounce scenario 5', solve([[3, [[10, ['A']], [11, []], [14, []]]]] * N), [[[], []]] * N)\ncheck('key-debounce scenario 6', solve([[3, [[10, []], [20, ['A', 'B']], [23, ['A', 'B']], [24, ['B']], [27, ['B']]]]] * N), [[[['A', 'down', 23], ['B', 'down', 23], ['A', 'up', 27]], ['B']]] * N)\ncheck('key-debounce scenario 7', solve([[3, [[10, ['A']], [13, ['A']], [14, []], [15, ['A']], [18, ['A']]]]] * N), [[[['A', 'down', 13]], ['A']]] * N)\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":"f090656370bf506af6e19e6b9b670dd47430ad146acaa4b6e249ce0b68888995","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(cases):\n    def run(c):\n        threshold,scans=c\n        stable={}; candidate={}; since={}; output=[]\n        for now,pressed in scans:\n            raw=set(pressed)\n            keys=sorted(set(stable)|set(candidate)|raw)\n            for key in keys:\n                value=key in raw\n                if key not in candidate or candidate[key]!=value:\n                    candidate[key]=value\n                    since[key]=now\n                if now-since[key]>=threshold and True:\n                    stable[key]=value\n                    output.append([key,'down' if value else 'up',now])\n        return [output,sorted(k for k,v in stable.items() if v)]\n    return [run(c) for c in cases]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('key-debounce scenario 0', solve([[3, []]] * N), [[[], []]] * N)\ncheck('key-debounce scenario 1', solve([[3, [[10, ['A']], [12, ['A']], [13, ['A']], [14, ['A']]]]] * N), [[[['A', 'down', 13]], ['A']]] * N)\ncheck('key-debounce scenario 2', solve([[3, [[10, ['A']], [13, ['A']], [14, []], [17, []]]]] * N), [[[['A', 'down', 13], ['A', 'up', 17]], []]] * N)\ncheck('key-debounce scenario 3', solve([[3, [[10, ['A']], [11, []], [12, ['A']], [14, ['A']], [15, ['A']]]]] * N), [[[['A', 'down', 15]], ['A']]] * N)\ncheck('key-debounce scenario 4', solve([[3, [[10, ['A']], [13, ['A']], [14, ['B']], [17, ['B']]]]] * N), [[[['A', 'down', 13], ['A', 'up', 17], ['B', 'down', 17]], ['B']]] * N)\ncheck('key-debounce scenario 5', solve([[3, [[10, ['A']], [11, []], [14, []]]]] * N), [[[], []]] * N)\ncheck('key-debounce scenario 6', solve([[3, [[10, []], [20, ['A', 'B']], [23, ['A', 'B']], [24, ['B']], [27, ['B']]]]] * N), [[[['A', 'down', 23], ['B', 'down', 23], ['A', 'up', 27]], ['B']]] * N)\ncheck('key-debounce scenario 7', solve([[3, [[10, ['A']], [13, ['A']], [14, []], [15, ['A']], [18, ['A']]]]] * N), [[[['A', 'down', 13]], ['A']]] * N)\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":"a41cbbca932b1c6a67b6188ff4125f0e29dd181b7435e69222accfa8a0f3f434","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(cases):\n    def run(c):\n        threshold,scans=c\n        stable={}; candidate={}; since={}; output=[]\n        for now,pressed in scans:\n            raw=set(pressed)\n            keys=sorted(set(stable)|set(candidate)|raw)\n            for key in keys:\n                value=key in raw\n                if key not in candidate or candidate[key]!=value:\n                    candidate[key]=value\n                    since[key]=now\n                if now-since[key]>=threshold and stable.get(key,False)!=value:\n                    stable[key]=value\n                    output.append([key,'down' if value else 'up',now])\n        return [output,sorted(k for k,v in stable.items() if v)]\n    return [run(c) for c in cases]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('key-debounce scenario 0', solve([[3, []]] * N), [[[], []]] * N)\ncheck('key-debounce scenario 1', solve([[3, [[10, ['A']], [12, ['A']], [13, ['A']], [14, ['A']]]]] * N), [[[['A', 'down', 13]], ['A']]] * N)\ncheck('key-debounce scenario 2', solve([[3, [[10, ['A']], [13, ['A']], [14, []], [17, []]]]] * N), [[[['A', 'down', 13], ['A', 'up', 17]], []]] * N)\ncheck('key-debounce scenario 3', solve([[3, [[10, ['A']], [11, []], [12, ['A']], [14, ['A']], [15, ['A']]]]] * N), [[[['A', 'down', 15]], ['A']]] * N)\ncheck('key-debounce scenario 4', solve([[3, [[10, ['A']], [13, ['A']], [14, ['B']], [17, ['B']]]]] * N), [[[['A', 'down', 13], ['A', 'up', 17], ['B', 'down', 17]], ['B']]] * N)\ncheck('key-debounce scenario 5', solve([[3, [[10, ['A']], [11, []], [14, []]]]] * N), [[[], []]] * N)\ncheck('key-debounce scenario 6', solve([[3, [[10, []], [20, ['A', 'B']], [23, ['A', 'B']], [24, ['B']], [27, ['B']]]]] * N), [[[['A', 'down', 23], ['B', 'down', 23], ['A', 'up', 27]], ['B']]] * N)\ncheck('key-debounce scenario 7', solve([[3, [[10, ['A']], [13, ['A']], [14, []], [15, ['A']], [18, ['A']]]]] * N), [[[['A', 'down', 13]], ['A']]] * N)\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":"Offline stipulated event model, not a browser implementation or web standard conformance claim. 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":"s3-keyboard-interactions-key-debounce-edge-only","generated_at":"2026-09-29T14:42:04.388781+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Controlled keyboard event processing model for debugging application event logic.","repair":"Use the contract transition `stable.get(key,False)!=value` at the edge only fault site; preserve the other state transitions.","root_cause":"Debounced notifications fire for unchanged level samples instead of stable edges.","sha256":"e9ddaa1929e5c62cf1ef2db6a305334bdbc73d8c23302484a3734ed56cb37d25","title":"Per-switch keyboard scan debounce: Debounced notifications fire for unchanged level samples instead of stable edges · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.999,"exit_code":1,"observations":[{"actual":[[[],[]]],"check":"key-debounce scenario 0","expected":[[[],[]]],"passed":true},{"actual":[[[],[]]],"check":"key-debounce scenario 1","expected":[[[["A","down",13]],["A"]]],"passed":false},{"actual":[[[["A","up",17]],[]]],"check":"key-debounce scenario 2","expected":[[[["A","down",13],["A","up",17]],[]]],"passed":false},{"actual":[[[],[]]],"check":"key-debounce scenario 3","expected":[[[["A","down",15]],["A"]]],"passed":false},{"actual":[[[["A","up",17]],[]]],"check":"key-debounce scenario 4","expected":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"passed":false},{"actual":[[[["A","up",14]],[]]],"check":"key-debounce scenario 5","expected":[[[],[]]],"passed":false},{"actual":[[[["A","up",27]],[]]],"check":"key-debounce scenario 6","expected":[[[["A","down",23],["B","down",23],["A","up",27]],["B"]]],"passed":false},{"actual":[[[],[]]],"check":"key-debounce scenario 7","expected":[[[["A","down",13]],["A"]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"key-debounce scenario 0\", \"actual\": [[[], []]], \"expected\": [[[], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 1\", \"actual\": [[[], []]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 2\", \"actual\": [[[[\"A\", \"up\", 17]], []]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"passed\": false}, {\"check\": \"key-debounce scenario 3\", \"actual\": [[[], []]], \"expected\": [[[[\"A\", \"down\", 15]], [\"A\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 4\", \"actual\": [[[[\"A\", \"up\", 17]], []]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 5\", \"actual\": [[[[\"A\", \"up\", 14]], []]], \"expected\": [[[], []]], \"passed\": false}, {\"check\": \"key-debounce scenario 6\", \"actual\": [[[[\"A\", \"up\", 27]], []]], \"expected\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"A\", \"up\", 27]], [\"B\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 7\", \"actual\": [[[], []]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":53.419,"exit_code":1,"observations":[{"actual":[[[],[]]],"check":"key-debounce scenario 0","expected":[[[],[]]],"passed":true},{"actual":[[[["A","down",13],["A","down",14]],["A"]]],"check":"key-debounce scenario 1","expected":[[[["A","down",13]],["A"]]],"passed":false},{"actual":[[[["A","down",13],["A","up",17]],[]]],"check":"key-debounce scenario 2","expected":[[[["A","down",13],["A","up",17]],[]]],"passed":true},{"actual":[[[["A","down",15]],["A"]]],"check":"key-debounce scenario 3","expected":[[[["A","down",15]],["A"]]],"passed":true},{"actual":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"check":"key-debounce scenario 4","expected":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"passed":true},{"actual":[[[["A","up",14]],[]]],"check":"key-debounce scenario 5","expected":[[[],[]]],"passed":false},{"actual":[[[["A","down",23],["B","down",23],["B","down",24],["A","up",27],["B","down",27]],["B"]]],"check":"key-debounce scenario 6","expected":[[[["A","down",23],["B","down",23],["A","up",27]],["B"]]],"passed":false},{"actual":[[[["A","down",13],["A","down",18]],["A"]]],"check":"key-debounce scenario 7","expected":[[[["A","down",13]],["A"]]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"key-debounce scenario 0\", \"actual\": [[[], []]], \"expected\": [[[], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 1\", \"actual\": [[[[\"A\", \"down\", 13], [\"A\", \"down\", 14]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 2\", \"actual\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 3\", \"actual\": [[[[\"A\", \"down\", 15]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 15]], [\"A\"]]], \"passed\": true}, {\"check\": \"key-debounce scenario 4\", \"actual\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"passed\": true}, {\"check\": \"key-debounce scenario 5\", \"actual\": [[[[\"A\", \"up\", 14]], []]], \"expected\": [[[], []]], \"passed\": false}, {\"check\": \"key-debounce scenario 6\", \"actual\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"B\", \"down\", 24], [\"A\", \"up\", 27], [\"B\", \"down\", 27]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"A\", \"up\", 27]], [\"B\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 7\", \"actual\": [[[[\"A\", \"down\", 13], [\"A\", \"down\", 18]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.308,"exit_code":0,"observations":[{"actual":[[[],[]]],"check":"key-debounce scenario 0","expected":[[[],[]]],"passed":true},{"actual":[[[["A","down",13]],["A"]]],"check":"key-debounce scenario 1","expected":[[[["A","down",13]],["A"]]],"passed":true},{"actual":[[[["A","down",13],["A","up",17]],[]]],"check":"key-debounce scenario 2","expected":[[[["A","down",13],["A","up",17]],[]]],"passed":true},{"actual":[[[["A","down",15]],["A"]]],"check":"key-debounce scenario 3","expected":[[[["A","down",15]],["A"]]],"passed":true},{"actual":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"check":"key-debounce scenario 4","expected":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"passed":true},{"actual":[[[],[]]],"check":"key-debounce scenario 5","expected":[[[],[]]],"passed":true},{"actual":[[[["A","down",23],["B","down",23],["A","up",27]],["B"]]],"check":"key-debounce scenario 6","expected":[[[["A","down",23],["B","down",23],["A","up",27]],["B"]]],"passed":true},{"actual":[[[["A","down",13]],["A"]]],"check":"key-debounce scenario 7","expected":[[[["A","down",13]],["A"]]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"key-debounce scenario 0\", \"actual\": [[[], []]], \"expected\": [[[], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 1\", \"actual\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": true}, {\"check\": \"key-debounce scenario 2\", \"actual\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 3\", \"actual\": [[[[\"A\", \"down\", 15]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 15]], [\"A\"]]], \"passed\": true}, {\"check\": \"key-debounce scenario 4\", \"actual\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"passed\": true}, {\"check\": \"key-debounce scenario 5\", \"actual\": [[[], []]], \"expected\": [[[], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 6\", \"actual\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"A\", \"up\", 27]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"A\", \"up\", 27]], [\"B\"]]], \"passed\": true}, {\"check\": \"key-debounce scenario 7\", \"actual\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}