FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 9 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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 fixtureActualExpectedOutcome
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