FA-31541 / Keyboard interactions / Open access
Keyboard macro recording timebase: A new macro retains old events or accumulated paused duration · case 01
The event trace violates the start reset rule and produces incorrect keyboard state or command output.
ROOT CAUSE
A new macro retains old events or accumulated paused duration.
VERIFIED REPAIR
Use the contract transition `recording=True; origin=now; paused=None; excluded=0; records=[]` at the start reset fault site; preserve the other state transitions.
Unsuccessful approach: The partial repair changes this transition to recording=True; origin=now; paused=None; records=[], which still violates the model contract on the explicit regression traces.
Case contract
Events [kind,key,time,injected]. Start resets capture and origin; physical down/up record relative active time; injected events are ignored. Pause freezes recording and resume excludes paused duration. Stop ends recording; clear erases recording. Return [kind,key,offset] records, recording flag, paused flag and excluded time. Ordered times and paired pause/resume. Inputs are finite ordered event traces; return the stated deterministic state. Batch entries are independent. N varies the number of independent input transactions.
Why this case matters
Controlled keyboard event processing model for debugging application event logic.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cases):
def run(c):
recording=False; origin=0; paused=None; excluded=0; records=[]
for kind,key,now,injected in c:
if kind=='start':
recording=True; origin=now; paused=None; excluded=0
elif kind=='pause' and recording and paused is None:
paused=now
elif kind=='resume' and recording and paused is not None:
excluded+=now-paused
paused=None
elif kind=='stop': recording=False; paused=None
elif kind=='clear': records=[]
elif kind in ('down','up') and recording and paused is None and not injected:
records.append([kind,key,now-origin-excluded])
return [records,recording,paused is not None,excluded]
return [run(c) for c in cases]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('macro-record scenario 0', solve([[]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 1', solve([[['start', '', 10, False], ['down', 'A', 12, False], ['up', 'A', 13, False], ['text', 'A', 14, False]]] * N), [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] * N)
check('macro-record scenario 2', solve([[['start', '', 10, False], ['down', 'A', 12, True], ['up', 'A', 13, True]]] * N), [[[], True, False, 0]] * N)
check('macro-record scenario 3', solve([[['start', '', 10, False], ['pause', '', 12, False], ['pause', '', 13, False], ['resume', '', 15, False], ['down', 'A', 16, False]]] * N), [[[['down', 'A', 3]], True, False, 3]] * N)
check('macro-record scenario 4', solve([[['start', '', 10, False], ['pause', '', 12, False], ['resume', '', 15, False], ['pause', '', 17, False], ['resume', '', 20, False], ['down', 'A', 21, False]]] * N), [[[['down', 'A', 5]], True, False, 6]] * N)
check('macro-record scenario 5', solve([[['start', '', 10, False], ['down', 'A', 11, False], ['start', '', 20, False]]] * N), [[[], True, False, 0]] * N)
check('macro-record scenario 6', solve([[['start', '', 10, False], ['pause', '', 12, False], ['resume', '', 15, False], ['start', '', 20, False], ['down', 'A', 21, False]]] * N), [[[['down', 'A', 1]], True, False, 0]] * N)
check('macro-record scenario 7', solve([[['start', '', 10, False], ['pause', '', 12, False], ['stop', '', 15, False], ['down', 'A', 16, False]]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 8', solve([[['pause', '', 10, False]]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 9', solve([[['start', '', 10, False], ['down', 'A', 11, False], ['up', 'A', 12, False], ['clear', '', 13, False]]] * N), [[[], True, False, 0]] * N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| macro-record scenario 0 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 1 | [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] | [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] | Passed |
| macro-record scenario 2 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
| macro-record scenario 3 | [[[['down', 'A', 3]], True, False, 3]] | [[[['down', 'A', 3]], True, False, 3]] | Passed |
| macro-record scenario 4 | [[[['down', 'A', 5]], True, False, 6]] | [[[['down', 'A', 5]], True, False, 6]] | Passed |
| macro-record scenario 5 | [[[['down', 'A', 1]], True, False, 0]] | [[[], True, False, 0]] | Failed |
| macro-record scenario 6 | [[[['down', 'A', 1]], True, False, 0]] | [[[['down', 'A', 1]], True, False, 0]] | Passed |
| macro-record scenario 7 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 8 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 9 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
SHA-256 / 979793337b2a9ac35279ee6c8e6727de11917c3456d749ebd3c3aad4b172a6d5
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cases):
def run(c):
recording=False; origin=0; paused=None; excluded=0; records=[]
for kind,key,now,injected in c:
if kind=='start':
recording=True; origin=now; paused=None; records=[]
elif kind=='pause' and recording and paused is None:
paused=now
elif kind=='resume' and recording and paused is not None:
excluded+=now-paused
paused=None
elif kind=='stop': recording=False; paused=None
elif kind=='clear': records=[]
elif kind in ('down','up') and recording and paused is None and not injected:
records.append([kind,key,now-origin-excluded])
return [records,recording,paused is not None,excluded]
return [run(c) for c in cases]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('macro-record scenario 0', solve([[]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 1', solve([[['start', '', 10, False], ['down', 'A', 12, False], ['up', 'A', 13, False], ['text', 'A', 14, False]]] * N), [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] * N)
check('macro-record scenario 2', solve([[['start', '', 10, False], ['down', 'A', 12, True], ['up', 'A', 13, True]]] * N), [[[], True, False, 0]] * N)
check('macro-record scenario 3', solve([[['start', '', 10, False], ['pause', '', 12, False], ['pause', '', 13, False], ['resume', '', 15, False], ['down', 'A', 16, False]]] * N), [[[['down', 'A', 3]], True, False, 3]] * N)
check('macro-record scenario 4', solve([[['start', '', 10, False], ['pause', '', 12, False], ['resume', '', 15, False], ['pause', '', 17, False], ['resume', '', 20, False], ['down', 'A', 21, False]]] * N), [[[['down', 'A', 5]], True, False, 6]] * N)
check('macro-record scenario 5', solve([[['start', '', 10, False], ['down', 'A', 11, False], ['start', '', 20, False]]] * N), [[[], True, False, 0]] * N)
check('macro-record scenario 6', solve([[['start', '', 10, False], ['pause', '', 12, False], ['resume', '', 15, False], ['start', '', 20, False], ['down', 'A', 21, False]]] * N), [[[['down', 'A', 1]], True, False, 0]] * N)
check('macro-record scenario 7', solve([[['start', '', 10, False], ['pause', '', 12, False], ['stop', '', 15, False], ['down', 'A', 16, False]]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 8', solve([[['pause', '', 10, False]]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 9', solve([[['start', '', 10, False], ['down', 'A', 11, False], ['up', 'A', 12, False], ['clear', '', 13, False]]] * N), [[[], True, False, 0]] * N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| macro-record scenario 0 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 1 | [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] | [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] | Passed |
| macro-record scenario 2 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
| macro-record scenario 3 | [[[['down', 'A', 3]], True, False, 3]] | [[[['down', 'A', 3]], True, False, 3]] | Passed |
| macro-record scenario 4 | [[[['down', 'A', 5]], True, False, 6]] | [[[['down', 'A', 5]], True, False, 6]] | Passed |
| macro-record scenario 5 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
| macro-record scenario 6 | [[[['down', 'A', -2]], True, False, 3]] | [[[['down', 'A', 1]], True, False, 0]] | Failed |
| macro-record scenario 7 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 8 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 9 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
SHA-256 / 6355cf77cabbdbfcf95c81952efe45232541941b3b8b0f152ba6811caa812018
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(cases):
def run(c):
recording=False; origin=0; paused=None; excluded=0; records=[]
for kind,key,now,injected in c:
if kind=='start':
recording=True; origin=now; paused=None; excluded=0; records=[]
elif kind=='pause' and recording and paused is None:
paused=now
elif kind=='resume' and recording and paused is not None:
excluded+=now-paused
paused=None
elif kind=='stop': recording=False; paused=None
elif kind=='clear': records=[]
elif kind in ('down','up') and recording and paused is None and not injected:
records.append([kind,key,now-origin-excluded])
return [records,recording,paused is not None,excluded]
return [run(c) for c in cases]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('macro-record scenario 0', solve([[]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 1', solve([[['start', '', 10, False], ['down', 'A', 12, False], ['up', 'A', 13, False], ['text', 'A', 14, False]]] * N), [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] * N)
check('macro-record scenario 2', solve([[['start', '', 10, False], ['down', 'A', 12, True], ['up', 'A', 13, True]]] * N), [[[], True, False, 0]] * N)
check('macro-record scenario 3', solve([[['start', '', 10, False], ['pause', '', 12, False], ['pause', '', 13, False], ['resume', '', 15, False], ['down', 'A', 16, False]]] * N), [[[['down', 'A', 3]], True, False, 3]] * N)
check('macro-record scenario 4', solve([[['start', '', 10, False], ['pause', '', 12, False], ['resume', '', 15, False], ['pause', '', 17, False], ['resume', '', 20, False], ['down', 'A', 21, False]]] * N), [[[['down', 'A', 5]], True, False, 6]] * N)
check('macro-record scenario 5', solve([[['start', '', 10, False], ['down', 'A', 11, False], ['start', '', 20, False]]] * N), [[[], True, False, 0]] * N)
check('macro-record scenario 6', solve([[['start', '', 10, False], ['pause', '', 12, False], ['resume', '', 15, False], ['start', '', 20, False], ['down', 'A', 21, False]]] * N), [[[['down', 'A', 1]], True, False, 0]] * N)
check('macro-record scenario 7', solve([[['start', '', 10, False], ['pause', '', 12, False], ['stop', '', 15, False], ['down', 'A', 16, False]]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 8', solve([[['pause', '', 10, False]]] * N), [[[], False, False, 0]] * N)
check('macro-record scenario 9', solve([[['start', '', 10, False], ['down', 'A', 11, False], ['up', 'A', 12, False], ['clear', '', 13, False]]] * N), [[[], True, False, 0]] * N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| macro-record scenario 0 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 1 | [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] | [[[['down', 'A', 2], ['up', 'A', 3]], True, False, 0]] | Passed |
| macro-record scenario 2 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
| macro-record scenario 3 | [[[['down', 'A', 3]], True, False, 3]] | [[[['down', 'A', 3]], True, False, 3]] | Passed |
| macro-record scenario 4 | [[[['down', 'A', 5]], True, False, 6]] | [[[['down', 'A', 5]], True, False, 6]] | Passed |
| macro-record scenario 5 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
| macro-record scenario 6 | [[[['down', 'A', 1]], True, False, 0]] | [[[['down', 'A', 1]], True, False, 0]] | Passed |
| macro-record scenario 7 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 8 | [[[], False, False, 0]] | [[[], False, False, 0]] | Passed |
| macro-record scenario 9 | [[[], True, False, 0]] | [[[], True, False, 0]] | Passed |
SHA-256 / 918e29b69f359d8b3a103ff0686e718411cb605180b75135e0f6fbf0085c74ec
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:42:03.061839+00:00.
Case digest / e2ce6a214268da6946006670fe2aca5b29210a436297272a393470a5b6e4c40c