FA-8756 / Direct manipulation / Open access
Resizable panel constraint handling: Disabled resizing unexpectedly collapses the panel · case 01
Disabled resizing unexpectedly collapses the panel.
ROOT CAUSE
The disabled operation uses `if disabled: return minimum` where the contract requires `if disabled: return size`.
VERIFIED REPAIR
Implement the disabled operation as `if disabled: return size`.
Unsuccessful approach: Ignoring disabled state still applies drag movements.
Case contract
Disabled handles preserve size; trailing-axis handles reverse delta; add deltas to current size and clamp to min/max.
Why this case matters
A deterministic model of resizable panel constraint handling; this isolates one interface invariant without requiring a browser.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(size, delta, minimum, maximum, reversed_axis, disabled):
if disabled: return minimum
change = -delta if reversed_axis else delta
wanted = size + change
return max(minimum, min(maximum, wanted))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('disabled', solve(50, 10, 20, 100, False, True), 50)
check('forward', solve(50, 10, 20, 100, False, False), 60)
check('reversed', solve(50, 10, 20, 100, True, False), 40)
check('min', solve(30, -50, 20, 100, False, False), 20)
check('max', solve(80, 50, 20, 100, False, False), 100)
check('zero', solve(50, 0, 20, 100, False, False), 50)
check('parameterized resize distance', solve(10*N,N,0,100*N,False,False),11*N)
for repetition in range(N):
check('repeat zero', solve(50, 0, 20, 100, False, False), 50)
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 |
|---|---|---|---|
| disabled | 20 | 50 | Failed |
| forward | 60 | 60 | Passed |
| reversed | 40 | 40 | Passed |
| min | 20 | 20 | Passed |
| max | 100 | 100 | Passed |
| zero | 50 | 50 | Passed |
| parameterized resize distance | 11 | 11 | Passed |
| repeat zero | 50 | 50 | Passed |
SHA-256 / e56193075c517cc5b52af423c3eeb7f32e18fe8f2d2229011b4ccd00d17aa4a2
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(size, delta, minimum, maximum, reversed_axis, disabled):
if False: return size
change = -delta if reversed_axis else delta
wanted = size + change
return max(minimum, min(maximum, wanted))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('disabled', solve(50, 10, 20, 100, False, True), 50)
check('forward', solve(50, 10, 20, 100, False, False), 60)
check('reversed', solve(50, 10, 20, 100, True, False), 40)
check('min', solve(30, -50, 20, 100, False, False), 20)
check('max', solve(80, 50, 20, 100, False, False), 100)
check('zero', solve(50, 0, 20, 100, False, False), 50)
check('parameterized resize distance', solve(10*N,N,0,100*N,False,False),11*N)
for repetition in range(N):
check('repeat zero', solve(50, 0, 20, 100, False, False), 50)
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 |
|---|---|---|---|
| disabled | 60 | 50 | Failed |
| forward | 60 | 60 | Passed |
| reversed | 40 | 40 | Passed |
| min | 20 | 20 | Passed |
| max | 100 | 100 | Passed |
| zero | 50 | 50 | Passed |
| parameterized resize distance | 11 | 11 | Passed |
| repeat zero | 50 | 50 | Passed |
SHA-256 / 4ac23586aba0388703bb3a91f1584808593fc00ef5e9f80efefc396e24ac8ff4
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(size, delta, minimum, maximum, reversed_axis, disabled):
if disabled: return size
change = -delta if reversed_axis else delta
wanted = size + change
return max(minimum, min(maximum, wanted))
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('disabled', solve(50, 10, 20, 100, False, True), 50)
check('forward', solve(50, 10, 20, 100, False, False), 60)
check('reversed', solve(50, 10, 20, 100, True, False), 40)
check('min', solve(30, -50, 20, 100, False, False), 20)
check('max', solve(80, 50, 20, 100, False, False), 100)
check('zero', solve(50, 0, 20, 100, False, False), 50)
check('parameterized resize distance', solve(10*N,N,0,100*N,False,False),11*N)
for repetition in range(N):
check('repeat zero', solve(50, 0, 20, 100, False, False), 50)
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 |
|---|---|---|---|
| disabled | 50 | 50 | Passed |
| forward | 60 | 60 | Passed |
| reversed | 40 | 40 | Passed |
| min | 20 | 20 | Passed |
| max | 100 | 100 | Passed |
| zero | 50 | 50 | Passed |
| parameterized resize distance | 11 | 11 | Passed |
| repeat zero | 50 | 50 | Passed |
SHA-256 / c9c3aef31922fe4ccbb39dbe52a30550f21c31cf7b5cf382a9dd2921ab3e4ac8
Verification & scope
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:38:24.176467+00:00.
Case digest / 8c5afa29e31d52a2276412ec0650a8f5b73c86da060a9131d4cfb71d95177387