FA-31601 / Keyboard interactions / Open access
Keyboard macro deterministic playback scheduler: Cycle scheduling omits the inter-cycle gap or recorded duration · case 01
The event trace violates the cycle origin rule and produces incorrect keyboard state or command output.
ROOT CAUSE
Cycle scheduling omits the inter-cycle gap or recorded duration.
VERIFIED REPAIR
Use the contract transition `base=start+cycle*(duration+gap)` at the cycle origin fault site; preserve the other state transitions.
Unsuccessful approach: The partial repair changes this transition to base=start+cycle*gap, which still violates the model contract on the explicit regression traces.
Case contract
Case [records,start,rate_num,rate_den,loops,gap]. Records [kind,key,offset] have ordered nonnegative integer offsets. Positive rational playback speed scales deadlines by floor(offset*den/num). Repeat cycles start after scaled final offset plus gap. End of each cycle synthesizes releases for remaining held keys in sorted order. Return emitted [kind,key,deadline] records. Loops nonnegative; gap positive. 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):
records,start,num,den,loops,gap=c
out=[]
duration=(records[-1][2]*den//num) if records else 0
for cycle in range(loops):
base=start+cycle*duration
held=set()
for kind,key,offset in records:
due=base+offset*den//num
if kind=='down': held.add(key)
elif kind=='up': held.discard(key)
out.append([kind,key,due])
for key in sorted(held):
out.append(['up',key,base+duration])
return out
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-play scenario 0', solve([[[], 10, 1, 1, 0, 2]] * N), [[]] * N)
check('macro-play scenario 1', solve([[[], 10, 1, 1, 2, 2]] * N), [[]] * N)
check('macro-play scenario 2', solve([[[['down', 'A', 0], ['up', 'A', 3]], 10, 2, 1, 2, 4]] * N), [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] * N)
check('macro-play scenario 3', solve([[[['up', 'A', 0]], 10, 1, 1, 1, 2]] * N), [[['up', 'A', 10]]] * N)
check('macro-play scenario 4', solve([[[['down', 'A', 0], ['down', 'B', 1]], 10, 1, 1, 2, 2]] * N), [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] * N)
check('macro-play scenario 5', solve([[[['down', 'A', 0], ['down', 'A', 1]], 10, 1, 1, 1, 2]] * N), [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] * N)
check('macro-play scenario 6', solve([[[['down', 'A', 0], ['down', 'B', 1], ['up', 'A', 2]], 10, 1, 1, 1, 2]] * N), [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] * N)
check('macro-play scenario 7', solve([[[['down', 'A', 1], ['up', 'A', 5]], 10, 3, 2, 2, 2]] * N), [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] * N)
check('macro-play scenario 8', solve([[[['down', 'A', 0], ['up', 'A', 2]], 10, 1, 1, 0, 2]] * N), [[]] * 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-play scenario 0 | [[]] | [[]] | Passed |
| macro-play scenario 1 | [[]] | [[]] | Passed |
| macro-play scenario 2 | [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 11], ['up', 'A', 12]]] | [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] | Failed |
| macro-play scenario 3 | [[['up', 'A', 10]]] | [[['up', 'A', 10]]] | Passed |
| macro-play scenario 4 | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 11], ['down', 'B', 12], ['up', 'A', 12], ['up', 'B', 12]]] | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] | Failed |
| macro-play scenario 5 | [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] | [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] | Passed |
| macro-play scenario 6 | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] | Passed |
| macro-play scenario 7 | [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 13], ['up', 'A', 16]]] | [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] | Failed |
| macro-play scenario 8 | [[]] | [[]] | Passed |
SHA-256 / 57c1806c82edb85cc7592cb21969a69db95472fd4860fc706eb802937daf14e6
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):
records,start,num,den,loops,gap=c
out=[]
duration=(records[-1][2]*den//num) if records else 0
for cycle in range(loops):
base=start+cycle*gap
held=set()
for kind,key,offset in records:
due=base+offset*den//num
if kind=='down': held.add(key)
elif kind=='up': held.discard(key)
out.append([kind,key,due])
for key in sorted(held):
out.append(['up',key,base+duration])
return out
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-play scenario 0', solve([[[], 10, 1, 1, 0, 2]] * N), [[]] * N)
check('macro-play scenario 1', solve([[[], 10, 1, 1, 2, 2]] * N), [[]] * N)
check('macro-play scenario 2', solve([[[['down', 'A', 0], ['up', 'A', 3]], 10, 2, 1, 2, 4]] * N), [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] * N)
check('macro-play scenario 3', solve([[[['up', 'A', 0]], 10, 1, 1, 1, 2]] * N), [[['up', 'A', 10]]] * N)
check('macro-play scenario 4', solve([[[['down', 'A', 0], ['down', 'B', 1]], 10, 1, 1, 2, 2]] * N), [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] * N)
check('macro-play scenario 5', solve([[[['down', 'A', 0], ['down', 'A', 1]], 10, 1, 1, 1, 2]] * N), [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] * N)
check('macro-play scenario 6', solve([[[['down', 'A', 0], ['down', 'B', 1], ['up', 'A', 2]], 10, 1, 1, 1, 2]] * N), [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] * N)
check('macro-play scenario 7', solve([[[['down', 'A', 1], ['up', 'A', 5]], 10, 3, 2, 2, 2]] * N), [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] * N)
check('macro-play scenario 8', solve([[[['down', 'A', 0], ['up', 'A', 2]], 10, 1, 1, 0, 2]] * N), [[]] * 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-play scenario 0 | [[]] | [[]] | Passed |
| macro-play scenario 1 | [[]] | [[]] | Passed |
| macro-play scenario 2 | [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 14], ['up', 'A', 15]]] | [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] | Failed |
| macro-play scenario 3 | [[['up', 'A', 10]]] | [[['up', 'A', 10]]] | Passed |
| macro-play scenario 4 | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 12], ['down', 'B', 13], ['up', 'A', 13], ['up', 'B', 13]]] | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] | Failed |
| macro-play scenario 5 | [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] | [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] | Passed |
| macro-play scenario 6 | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] | Passed |
| macro-play scenario 7 | [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 12], ['up', 'A', 15]]] | [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] | Failed |
| macro-play scenario 8 | [[]] | [[]] | Passed |
SHA-256 / 968c014a8619bec8ac1b9d0877ee7efe4d7e99d05ecd98ec402c91883233347f
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):
records,start,num,den,loops,gap=c
out=[]
duration=(records[-1][2]*den//num) if records else 0
for cycle in range(loops):
base=start+cycle*(duration+gap)
held=set()
for kind,key,offset in records:
due=base+offset*den//num
if kind=='down': held.add(key)
elif kind=='up': held.discard(key)
out.append([kind,key,due])
for key in sorted(held):
out.append(['up',key,base+duration])
return out
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-play scenario 0', solve([[[], 10, 1, 1, 0, 2]] * N), [[]] * N)
check('macro-play scenario 1', solve([[[], 10, 1, 1, 2, 2]] * N), [[]] * N)
check('macro-play scenario 2', solve([[[['down', 'A', 0], ['up', 'A', 3]], 10, 2, 1, 2, 4]] * N), [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] * N)
check('macro-play scenario 3', solve([[[['up', 'A', 0]], 10, 1, 1, 1, 2]] * N), [[['up', 'A', 10]]] * N)
check('macro-play scenario 4', solve([[[['down', 'A', 0], ['down', 'B', 1]], 10, 1, 1, 2, 2]] * N), [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] * N)
check('macro-play scenario 5', solve([[[['down', 'A', 0], ['down', 'A', 1]], 10, 1, 1, 1, 2]] * N), [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] * N)
check('macro-play scenario 6', solve([[[['down', 'A', 0], ['down', 'B', 1], ['up', 'A', 2]], 10, 1, 1, 1, 2]] * N), [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] * N)
check('macro-play scenario 7', solve([[[['down', 'A', 1], ['up', 'A', 5]], 10, 3, 2, 2, 2]] * N), [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] * N)
check('macro-play scenario 8', solve([[[['down', 'A', 0], ['up', 'A', 2]], 10, 1, 1, 0, 2]] * N), [[]] * 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-play scenario 0 | [[]] | [[]] | Passed |
| macro-play scenario 1 | [[]] | [[]] | Passed |
| macro-play scenario 2 | [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] | [[['down', 'A', 10], ['up', 'A', 11], ['down', 'A', 15], ['up', 'A', 16]]] | Passed |
| macro-play scenario 3 | [[['up', 'A', 10]]] | [[['up', 'A', 10]]] | Passed |
| macro-play scenario 4 | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 11], ['up', 'B', 11], ['down', 'A', 13], ['down', 'B', 14], ['up', 'A', 14], ['up', 'B', 14]]] | Passed |
| macro-play scenario 5 | [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] | [[['down', 'A', 10], ['down', 'A', 11], ['up', 'A', 11]]] | Passed |
| macro-play scenario 6 | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] | [[['down', 'A', 10], ['down', 'B', 11], ['up', 'A', 12], ['up', 'B', 12]]] | Passed |
| macro-play scenario 7 | [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] | [[['down', 'A', 10], ['up', 'A', 13], ['down', 'A', 15], ['up', 'A', 18]]] | Passed |
| macro-play scenario 8 | [[]] | [[]] | Passed |
SHA-256 / e98c652512720bf6ad76c0d28a67659954e8bf958fa9ff26aa3ec79247e9df5c
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.697276+00:00.
Case digest / f1515dfab049ddc0b55b774249b56a3cabaf616424c408d43adef37b97fa2da4