FAILURE MAP
← Case archive

FA-36141 / Tab interfaces / Open access

Drag auto scroll: speed ramp · case 01

The tab workspace reports an incorrect speed ramp.

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

ROOT CAUSE

The speed ramp decision uses x['speed'] instead of x['speed']*max(0,min(x['zone'],x['pointer']-(x['end']-x['zone'])))//x['zone'].

VERIFIED REPAIR

Use the stipulated workspace rule: x['speed']*max(0,min(x['zone'],x['pointer']-(x['end']-x['zone'])))//x['zone'].

Unsuccessful approach: The partial repair max(0,x['pointer']-(x['end']-x['zone'])) still violates a workspace boundary or normal case.

Case contract

While dragging a tab, the strip scrolls within edge zones proportional to penetration, stops outside strip and clamps movement to available scroll range.

Why this case matters

Offline tab/panel workspace behavior; no browser or desktop framework is emulated.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = x['start']<=x['pointer']<x['start']+x['zone']
    r1 = x['end']-x['zone']<x['pointer']<x['end']
    r2 = x['dragging']
    r3 = max(0,min(x['zone'],x['pointer']-(x['end']-x['zone'])))
    r4 = x['speed']
    r5 = min(x['max_scroll'],x['scroll']+x['speed'])
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, True, True, 15, 9, 62]), ({'pointer': 5, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [True, False, True, 0, 0, 62]), ({'pointer': 100, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 0, 0, 62]), ({'pointer': 220, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 20, 12, 62]), ({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 298, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, True, True, 15, 9, 300]), ({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': False}, [False, True, False, 15, 9, 62]), ({'pointer': -1, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 0, 0, 62])], 2: [({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, True, True, 30, 18, 124]), ({'pointer': 10, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [True, False, True, 0, 0, 124]), ({'pointer': 200, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 0, 0, 124]), ({'pointer': 440, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 40, 24, 124]), ({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 596, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, True, True, 30, 18, 600]), ({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': False}, [False, True, False, 30, 18, 124]), ({'pointer': -2, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 0, 0, 124])], 3: [({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, True, True, 45, 27, 186]), ({'pointer': 15, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [True, False, True, 0, 0, 186]), ({'pointer': 300, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 0, 0, 186]), ({'pointer': 660, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 60, 36, 186]), ({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 894, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, True, True, 45, 27, 900]), ({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': False}, [False, True, False, 45, 27, 186]), ({'pointer': -3, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 0, 0, 186])], 4: [({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, True, True, 60, 36, 248]), ({'pointer': 20, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [True, False, True, 0, 0, 248]), ({'pointer': 400, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 0, 0, 248]), ({'pointer': 880, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 80, 48, 248]), ({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 1192, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, True, True, 60, 36, 1200]), ({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': False}, [False, True, False, 60, 36, 248]), ({'pointer': -4, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 0, 0, 248])], 5: [({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, True, True, 75, 45, 310]), ({'pointer': 25, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [True, False, True, 0, 0, 310]), ({'pointer': 500, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 0, 0, 310]), ({'pointer': 1100, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 100, 60, 310]), ({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 1490, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, True, True, 75, 45, 1500]), ({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': False}, [False, True, False, 75, 45, 310]), ({'pointer': -5, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 0, 0, 310])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
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
workspace regression 0[False, True, True, 15, 12, 62][False, True, True, 15, 9, 62]Failed
workspace regression 1[True, False, True, 0, 12, 62][True, False, True, 0, 0, 62]Failed
workspace regression 2[False, False, True, 0, 12, 62][False, False, True, 0, 0, 62]Failed
workspace regression 3[False, False, True, 20, 12, 62][False, False, True, 20, 12, 62]Passed
workspace regression 4[False, True, True, 15, 12, 300][False, True, True, 15, 9, 300]Failed
workspace regression 5[False, True, False, 15, 12, 62][False, True, False, 15, 9, 62]Failed
workspace regression 6[False, False, True, 0, 12, 62][False, False, True, 0, 0, 62]Failed

SHA-256 / 0999d7a990e59c34e3d2b4d91465eccac1f694faac5d85cc9db4f67c0350a221

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = x['start']<=x['pointer']<x['start']+x['zone']
    r1 = x['end']-x['zone']<x['pointer']<x['end']
    r2 = x['dragging']
    r3 = max(0,min(x['zone'],x['pointer']-(x['end']-x['zone'])))
    r4 = max(0,x['pointer']-(x['end']-x['zone']))
    r5 = min(x['max_scroll'],x['scroll']+x['speed'])
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, True, True, 15, 9, 62]), ({'pointer': 5, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [True, False, True, 0, 0, 62]), ({'pointer': 100, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 0, 0, 62]), ({'pointer': 220, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 20, 12, 62]), ({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 298, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, True, True, 15, 9, 300]), ({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': False}, [False, True, False, 15, 9, 62]), ({'pointer': -1, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 0, 0, 62])], 2: [({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, True, True, 30, 18, 124]), ({'pointer': 10, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [True, False, True, 0, 0, 124]), ({'pointer': 200, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 0, 0, 124]), ({'pointer': 440, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 40, 24, 124]), ({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 596, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, True, True, 30, 18, 600]), ({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': False}, [False, True, False, 30, 18, 124]), ({'pointer': -2, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 0, 0, 124])], 3: [({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, True, True, 45, 27, 186]), ({'pointer': 15, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [True, False, True, 0, 0, 186]), ({'pointer': 300, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 0, 0, 186]), ({'pointer': 660, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 60, 36, 186]), ({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 894, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, True, True, 45, 27, 900]), ({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': False}, [False, True, False, 45, 27, 186]), ({'pointer': -3, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 0, 0, 186])], 4: [({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, True, True, 60, 36, 248]), ({'pointer': 20, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [True, False, True, 0, 0, 248]), ({'pointer': 400, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 0, 0, 248]), ({'pointer': 880, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 80, 48, 248]), ({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 1192, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, True, True, 60, 36, 1200]), ({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': False}, [False, True, False, 60, 36, 248]), ({'pointer': -4, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 0, 0, 248])], 5: [({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, True, True, 75, 45, 310]), ({'pointer': 25, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [True, False, True, 0, 0, 310]), ({'pointer': 500, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 0, 0, 310]), ({'pointer': 1100, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 100, 60, 310]), ({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 1490, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, True, True, 75, 45, 1500]), ({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': False}, [False, True, False, 75, 45, 310]), ({'pointer': -5, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 0, 0, 310])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
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
workspace regression 0[False, True, True, 15, 15, 62][False, True, True, 15, 9, 62]Failed
workspace regression 1[True, False, True, 0, 0, 62][True, False, True, 0, 0, 62]Passed
workspace regression 2[False, False, True, 0, 0, 62][False, False, True, 0, 0, 62]Passed
workspace regression 3[False, False, True, 20, 40, 62][False, False, True, 20, 12, 62]Failed
workspace regression 4[False, True, True, 15, 15, 300][False, True, True, 15, 9, 300]Failed
workspace regression 5[False, True, False, 15, 15, 62][False, True, False, 15, 9, 62]Failed
workspace regression 6[False, False, True, 0, 0, 62][False, False, True, 0, 0, 62]Passed

SHA-256 / 249eca9b1d789bfe42fc3969f3865f4b936f7847d391a324b8ce8621672db89f

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = x['start']<=x['pointer']<x['start']+x['zone']
    r1 = x['end']-x['zone']<x['pointer']<x['end']
    r2 = x['dragging']
    r3 = max(0,min(x['zone'],x['pointer']-(x['end']-x['zone'])))
    r4 = x['speed']*max(0,min(x['zone'],x['pointer']-(x['end']-x['zone'])))//x['zone']
    r5 = min(x['max_scroll'],x['scroll']+x['speed'])
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, True, True, 15, 9, 62]), ({'pointer': 5, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [True, False, True, 0, 0, 62]), ({'pointer': 100, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 0, 0, 62]), ({'pointer': 220, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 20, 12, 62]), ({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 298, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, True, True, 15, 9, 300]), ({'pointer': 195, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': False}, [False, True, False, 15, 9, 62]), ({'pointer': -1, 'start': 0, 'end': 200, 'zone': 20, 'scroll': 50, 'max_scroll': 300, 'speed': 12, 'dragging': True}, [False, False, True, 0, 0, 62])], 2: [({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, True, True, 30, 18, 124]), ({'pointer': 10, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [True, False, True, 0, 0, 124]), ({'pointer': 200, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 0, 0, 124]), ({'pointer': 440, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 40, 24, 124]), ({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 596, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, True, True, 30, 18, 600]), ({'pointer': 390, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': False}, [False, True, False, 30, 18, 124]), ({'pointer': -2, 'start': 0, 'end': 400, 'zone': 40, 'scroll': 100, 'max_scroll': 600, 'speed': 24, 'dragging': True}, [False, False, True, 0, 0, 124])], 3: [({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, True, True, 45, 27, 186]), ({'pointer': 15, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [True, False, True, 0, 0, 186]), ({'pointer': 300, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 0, 0, 186]), ({'pointer': 660, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 60, 36, 186]), ({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 894, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, True, True, 45, 27, 900]), ({'pointer': 585, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': False}, [False, True, False, 45, 27, 186]), ({'pointer': -3, 'start': 0, 'end': 600, 'zone': 60, 'scroll': 150, 'max_scroll': 900, 'speed': 36, 'dragging': True}, [False, False, True, 0, 0, 186])], 4: [({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, True, True, 60, 36, 248]), ({'pointer': 20, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [True, False, True, 0, 0, 248]), ({'pointer': 400, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 0, 0, 248]), ({'pointer': 880, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 80, 48, 248]), ({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 1192, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, True, True, 60, 36, 1200]), ({'pointer': 780, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': False}, [False, True, False, 60, 36, 248]), ({'pointer': -4, 'start': 0, 'end': 800, 'zone': 80, 'scroll': 200, 'max_scroll': 1200, 'speed': 48, 'dragging': True}, [False, False, True, 0, 0, 248])], 5: [({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, True, True, 75, 45, 310]), ({'pointer': 25, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [True, False, True, 0, 0, 310]), ({'pointer': 500, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 0, 0, 310]), ({'pointer': 1100, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 100, 60, 310]), ({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 1490, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, True, True, 75, 45, 1500]), ({'pointer': 975, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': False}, [False, True, False, 75, 45, 310]), ({'pointer': -5, 'start': 0, 'end': 1000, 'zone': 100, 'scroll': 250, 'max_scroll': 1500, 'speed': 60, 'dragging': True}, [False, False, True, 0, 0, 310])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
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
workspace regression 0[False, True, True, 15, 9, 62][False, True, True, 15, 9, 62]Passed
workspace regression 1[True, False, True, 0, 0, 62][True, False, True, 0, 0, 62]Passed
workspace regression 2[False, False, True, 0, 0, 62][False, False, True, 0, 0, 62]Passed
workspace regression 3[False, False, True, 20, 12, 62][False, False, True, 20, 12, 62]Passed
workspace regression 4[False, True, True, 15, 9, 300][False, True, True, 15, 9, 300]Passed
workspace regression 5[False, True, False, 15, 9, 62][False, True, False, 15, 9, 62]Passed
workspace regression 6[False, False, True, 0, 0, 62][False, False, True, 0, 0, 62]Passed

SHA-256 / a2f3eae07d08294dcd86d4d55303713d46d73b643200a9eb8e975bc94284c46f

Verification & scope

Finite stipulated workspace snapshots only. Independent result fields describe observable obligations, not a full UI runtime. 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:48.301433+00:00.

Case digest / cdd4d7c4d9ed50d0d1ad9ffa5e6f2075b875379db0589919dce7953ed6b873e7