FAILURE MAP
← Case archive

FA-8926 / Selection controls / Open access

Rating preview and committed value: Activation retains an obsolete hover preview · case 01

Activation retains an obsolete hover preview.

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

ROOT CAUSE

The commit preview operation uses ` preview = preview elif event == 'escape'` where the contract requires ` preview = None elif event == 'escape'`.

VERIFIED REPAIR

Implement the commit preview operation as ` preview = None elif event == 'escape'`.

Unsuccessful approach: Replacing it with committed still leaves provisional state active.

Case contract

Hover changes preview only; leaving or Escape discards preview; activation commits and clears preview; repeated activation clears only when allowed; readonly ignores interaction and has no preview.

Why this case matters

A deterministic model of rating preview and committed value; 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(committed, preview, event, value, readonly, allow_clear):
    if readonly: return (committed, None)
    if event == 'hover': preview = value
    elif event == 'leave': preview = None
    elif event == 'activate':
        committed = None if allow_clear and value == committed else value
        preview = preview
    elif event == 'escape': preview = None
    return (committed, preview)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('readonly', solve(2, 4, 'activate', 5, True, True), (2, None))
check('hover', solve(2, None, 'hover', 4, False, True), (2, 4))
check('leave', solve(2, 4, 'leave', None, False, True), (2, None))
check('locked clear', solve(2, 4, 'activate', 2, False, False), (2, None))
check('change', solve(2, 4, 'activate', 5, False, True), (5, None))
check('clear', solve(2, 4, 'activate', 2, False, True), (None, None))
check('escape', solve(2, 4, 'escape', None, False, True), (2, None))
check('parameterized rating preview', solve(0,None,'hover',N,False,False), (0,N))
for repetition in range(N):
    check('repeat escape', solve(2, 4, 'escape', None, False, True), (2, None))
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
readonly[2, None][2, None]Passed
hover[2, 4][2, 4]Passed
leave[2, None][2, None]Passed
locked clear[2, 4][2, None]Failed
change[5, 4][5, None]Failed
clear[None, 4][None, None]Failed
escape[2, None][2, None]Passed
parameterized rating preview[0, 1][0, 1]Passed
repeat escape[2, None][2, None]Passed

SHA-256 / 1a0e188caaed8f84121c6c6d5d265fee8f504f58ee22bb29c92b527b31bce129

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(committed, preview, event, value, readonly, allow_clear):
    if readonly: return (committed, None)
    if event == 'hover': preview = value
    elif event == 'leave': preview = None
    elif event == 'activate':
        committed = None if allow_clear and value == committed else value
        preview = committed
    elif event == 'escape': preview = None
    return (committed, preview)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('readonly', solve(2, 4, 'activate', 5, True, True), (2, None))
check('hover', solve(2, None, 'hover', 4, False, True), (2, 4))
check('leave', solve(2, 4, 'leave', None, False, True), (2, None))
check('locked clear', solve(2, 4, 'activate', 2, False, False), (2, None))
check('change', solve(2, 4, 'activate', 5, False, True), (5, None))
check('clear', solve(2, 4, 'activate', 2, False, True), (None, None))
check('escape', solve(2, 4, 'escape', None, False, True), (2, None))
check('parameterized rating preview', solve(0,None,'hover',N,False,False), (0,N))
for repetition in range(N):
    check('repeat escape', solve(2, 4, 'escape', None, False, True), (2, None))
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
readonly[2, None][2, None]Passed
hover[2, 4][2, 4]Passed
leave[2, None][2, None]Passed
locked clear[2, 2][2, None]Failed
change[5, 5][5, None]Failed
clear[None, None][None, None]Passed
escape[2, None][2, None]Passed
parameterized rating preview[0, 1][0, 1]Passed
repeat escape[2, None][2, None]Passed

SHA-256 / 0b2696f33bf47918676e9e119dda7fa662833c82e75d4f4fce31013ce0d9f5e3

3 / The verified repair

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

N = 1
observations = []
def solve(committed, preview, event, value, readonly, allow_clear):
    if readonly: return (committed, None)
    if event == 'hover': preview = value
    elif event == 'leave': preview = None
    elif event == 'activate':
        committed = None if allow_clear and value == committed else value
        preview = None
    elif event == 'escape': preview = None
    return (committed, preview)
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('readonly', solve(2, 4, 'activate', 5, True, True), (2, None))
check('hover', solve(2, None, 'hover', 4, False, True), (2, 4))
check('leave', solve(2, 4, 'leave', None, False, True), (2, None))
check('locked clear', solve(2, 4, 'activate', 2, False, False), (2, None))
check('change', solve(2, 4, 'activate', 5, False, True), (5, None))
check('clear', solve(2, 4, 'activate', 2, False, True), (None, None))
check('escape', solve(2, 4, 'escape', None, False, True), (2, None))
check('parameterized rating preview', solve(0,None,'hover',N,False,False), (0,N))
for repetition in range(N):
    check('repeat escape', solve(2, 4, 'escape', None, False, True), (2, None))
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
readonly[2, None][2, None]Passed
hover[2, 4][2, 4]Passed
leave[2, None][2, None]Passed
locked clear[2, None][2, None]Passed
change[5, None][5, None]Passed
clear[None, None][None, None]Passed
escape[2, None][2, None]Passed
parameterized rating preview[0, 1][0, 1]Passed
repeat escape[2, None][2, None]Passed

SHA-256 / 9f20e0513182a40341ff5a62f79fe9d3059692f49d84ac783ee44ceec4099d15

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:25.621633+00:00.

Case digest / c5237e7f5941de2cdd60e8cb90638bf813b61d57972af65e4b6ed9c936a1a91e