{"abstract":"The event trace violates the edge name 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 'down', which still violates the model contract on the explicit regression traces.","family":"s3-keyboard-interactions-key-debounce-edge-name","id":"FA-31681","implementations":{"attempt":{"sha256":"0cd1f973e1153725b8200c4d5bf76129590a2e64d96b0bf17f10621895e88177","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',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":"cc1403422d0dbf724b7de36f1f1bc619b327b1e8fe090f42148fbb5628d7d709","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,'up' if value else 'down',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-name","generated_at":"2026-09-29T14:42:04.481236+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 `'down' if value else 'up'` at the edge name fault site; preserve the other state transitions.","root_cause":"Debounced release is published as a press.","sha256":"47627a67b8ab4340325675ac5be04ab358b0733660dae605fafee1c251b1924c","title":"Per-switch keyboard scan debounce: Debounced release is published as a press · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.191,"exit_code":1,"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","down",17]],[]]],"check":"key-debounce scenario 2","expected":[[[["A","down",13],["A","up",17]],[]]],"passed":false},{"actual":[[[["A","down",15]],["A"]]],"check":"key-debounce scenario 3","expected":[[[["A","down",15]],["A"]]],"passed":true},{"actual":[[[["A","down",13],["A","down",17],["B","down",17]],["B"]]],"check":"key-debounce scenario 4","expected":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"passed":false},{"actual":[[[],[]]],"check":"key-debounce scenario 5","expected":[[[],[]]],"passed":true},{"actual":[[[["A","down",23],["B","down",23],["A","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"]]],"check":"key-debounce scenario 7","expected":[[[["A","down",13]],["A"]]],"passed":true}],"passed":false,"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\", \"down\", 17]], []]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"passed\": false}, {\"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\", \"down\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 5\", \"actual\": [[[], []]], \"expected\": [[[], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 6\", \"actual\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"A\", \"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\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.912,"exit_code":1,"observations":[{"actual":[[[],[]]],"check":"key-debounce scenario 0","expected":[[[],[]]],"passed":true},{"actual":[[[["A","up",13]],["A"]]],"check":"key-debounce scenario 1","expected":[[[["A","down",13]],["A"]]],"passed":false},{"actual":[[[["A","up",13],["A","down",17]],[]]],"check":"key-debounce scenario 2","expected":[[[["A","down",13],["A","up",17]],[]]],"passed":false},{"actual":[[[["A","up",15]],["A"]]],"check":"key-debounce scenario 3","expected":[[[["A","down",15]],["A"]]],"passed":false},{"actual":[[[["A","up",13],["A","down",17],["B","up",17]],["B"]]],"check":"key-debounce scenario 4","expected":[[[["A","down",13],["A","up",17],["B","down",17]],["B"]]],"passed":false},{"actual":[[[],[]]],"check":"key-debounce scenario 5","expected":[[[],[]]],"passed":true},{"actual":[[[["A","up",23],["B","up",23],["A","down",27]],["B"]]],"check":"key-debounce scenario 6","expected":[[[["A","down",23],["B","down",23],["A","up",27]],["B"]]],"passed":false},{"actual":[[[["A","up",13]],["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\", \"up\", 13]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 2\", \"actual\": [[[[\"A\", \"up\", 13], [\"A\", \"down\", 17]], []]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17]], []]], \"passed\": false}, {\"check\": \"key-debounce scenario 3\", \"actual\": [[[[\"A\", \"up\", 15]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 15]], [\"A\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 4\", \"actual\": [[[[\"A\", \"up\", 13], [\"A\", \"down\", 17], [\"B\", \"up\", 17]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 13], [\"A\", \"up\", 17], [\"B\", \"down\", 17]], [\"B\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 5\", \"actual\": [[[], []]], \"expected\": [[[], []]], \"passed\": true}, {\"check\": \"key-debounce scenario 6\", \"actual\": [[[[\"A\", \"up\", 23], [\"B\", \"up\", 23], [\"A\", \"down\", 27]], [\"B\"]]], \"expected\": [[[[\"A\", \"down\", 23], [\"B\", \"down\", 23], [\"A\", \"up\", 27]], [\"B\"]]], \"passed\": false}, {\"check\": \"key-debounce scenario 7\", \"actual\": [[[[\"A\", \"up\", 13]], [\"A\"]]], \"expected\": [[[[\"A\", \"down\", 13]], [\"A\"]]], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.875,"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"}