FA-22711 / Autocomplete interactions / Open access
Controlled autocomplete synchronization: external value replacement retains the previous ghost completion · case 01
The external-preview completion transition produces an incorrect observable state.
ROOT CAUSE
At controlled-picker/external-preview, the implementation evaluates `d['preview']` instead of preserving the specified completion transition.
VERIFIED REPAIR
Implement the external-preview contract using `''`.
Unsuccessful approach: The attempted repair uses `d['label']`, which still violates a normal or boundary completion fixture.
Case contract
Parent-provided value updates are distinguished from unacknowledged draft edits. An acknowledged commit may reset the draft to its label; unrelated rerenders preserve dirty draft. External value replacement clears preview and invalidates result epoch. Object identity is irrelevant; stable option identifiers determine equality.
Why this case matters
Autocomplete couples draft text, suggestion identity and asynchronous presentation; this bounded lifecycle model isolates one observable interaction defect.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(event, d):
if event == 'same-id': return d['old_object']['id']==d['new_object']['id']
if event == 'rerender': return d['draft'] if d['dirty'] and not d['ack'] else d['label']
if event == 'external-value': return d['incoming']
if event == 'external-draft': return d['label']
if event == 'external-preview': return d['preview']
if event == 'parent-echo': return [] if d['ack'] else [d['incoming']]
if event == 'ack-dirty': return False if d['ack'] else d['dirty']
if event == 'stale-parent': return d['incoming_epoch']==d['epoch']
if event == 'label-refresh': return {'id':d['old_object']['id'],'label':d['new_object']['label']}
if event == 'change-detection': return d['incoming']!=d['value']
return {'unchanged': True}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'value':'a','incoming':'b','label':'Bee','draft':'bea','dirty':True,'ack':False,'preview':'beam','epoch':N,'incoming_epoch':N-1,'old_object':{'id':'a','label':'A'},'new_object':{'id':'a','label':'A2'}}
boundary = {'value':None,'incoming':None,'label':'','draft':'','dirty':False,'ack':True,'preview':'','epoch':N,'incoming_epoch':N,'old_object':{'id':'','label':''},'new_object':{'id':'','label':''}}
check('normal same-id', solve('same-id', normal), True)
check('boundary same-id', solve('same-id', boundary), True)
check('normal rerender', solve('rerender', normal), 'bea')
check('boundary rerender', solve('rerender', boundary), '')
check('normal external-value', solve('external-value', normal), 'b')
check('boundary external-value', solve('external-value', boundary), None)
check('normal external-draft', solve('external-draft', normal), 'Bee')
check('boundary external-draft', solve('external-draft', boundary), '')
check('normal external-preview', solve('external-preview', normal), '')
check('boundary external-preview', solve('external-preview', boundary), '')
check('normal parent-echo', solve('parent-echo', normal), ['b'])
check('boundary parent-echo', solve('parent-echo', boundary), [])
check('normal ack-dirty', solve('ack-dirty', normal), True)
check('boundary ack-dirty', solve('ack-dirty', boundary), False)
check('normal stale-parent', solve('stale-parent', normal), False)
check('boundary stale-parent', solve('stale-parent', boundary), True)
check('normal label-refresh', solve('label-refresh', normal), {'id':'a','label':'A2'})
check('boundary label-refresh', solve('label-refresh', boundary), {'id':'','label':''})
check('normal change-detection', solve('change-detection', normal), True)
check('boundary change-detection', solve('change-detection', boundary), False)
variant = dict(normal, **{'incoming':'id'+str(N)})
check('variant query or selection payload', solve('external-value', variant), 'id'+str(N))
check('unknown completion event', solve('unrecognized', normal), {'unchanged': True})
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 |
|---|---|---|---|
| normal same-id | True | True | Passed |
| boundary same-id | True | True | Passed |
| normal rerender | bea | bea | Passed |
| boundary rerender | | | Passed |
| normal external-value | b | b | Passed |
| boundary external-value | None | None | Passed |
| normal external-draft | Bee | Bee | Passed |
| boundary external-draft | | | Passed |
| normal external-preview | beam | | Failed |
| boundary external-preview | | | Passed |
| normal parent-echo | ['b'] | ['b'] | Passed |
| boundary parent-echo | [] | [] | Passed |
| normal ack-dirty | True | True | Passed |
| boundary ack-dirty | False | False | Passed |
| normal stale-parent | False | False | Passed |
| boundary stale-parent | True | True | Passed |
| normal label-refresh | {'id': 'a', 'label': 'A2'} | {'id': 'a', 'label': 'A2'} | Passed |
| boundary label-refresh | {'id': '', 'label': ''} | {'id': '', 'label': ''} | Passed |
| normal change-detection | True | True | Passed |
| boundary change-detection | False | False | Passed |
| variant query or selection payload | id1 | id1 | Passed |
| unknown completion event | {'unchanged': True} | {'unchanged': True} | Passed |
SHA-256 / 173e3b0bbfc181b192711f7243f5440ede8c9b6b1786cc4f099621949e717ae8
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(event, d):
if event == 'same-id': return d['old_object']['id']==d['new_object']['id']
if event == 'rerender': return d['draft'] if d['dirty'] and not d['ack'] else d['label']
if event == 'external-value': return d['incoming']
if event == 'external-draft': return d['label']
if event == 'external-preview': return d['label']
if event == 'parent-echo': return [] if d['ack'] else [d['incoming']]
if event == 'ack-dirty': return False if d['ack'] else d['dirty']
if event == 'stale-parent': return d['incoming_epoch']==d['epoch']
if event == 'label-refresh': return {'id':d['old_object']['id'],'label':d['new_object']['label']}
if event == 'change-detection': return d['incoming']!=d['value']
return {'unchanged': True}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'value':'a','incoming':'b','label':'Bee','draft':'bea','dirty':True,'ack':False,'preview':'beam','epoch':N,'incoming_epoch':N-1,'old_object':{'id':'a','label':'A'},'new_object':{'id':'a','label':'A2'}}
boundary = {'value':None,'incoming':None,'label':'','draft':'','dirty':False,'ack':True,'preview':'','epoch':N,'incoming_epoch':N,'old_object':{'id':'','label':''},'new_object':{'id':'','label':''}}
check('normal same-id', solve('same-id', normal), True)
check('boundary same-id', solve('same-id', boundary), True)
check('normal rerender', solve('rerender', normal), 'bea')
check('boundary rerender', solve('rerender', boundary), '')
check('normal external-value', solve('external-value', normal), 'b')
check('boundary external-value', solve('external-value', boundary), None)
check('normal external-draft', solve('external-draft', normal), 'Bee')
check('boundary external-draft', solve('external-draft', boundary), '')
check('normal external-preview', solve('external-preview', normal), '')
check('boundary external-preview', solve('external-preview', boundary), '')
check('normal parent-echo', solve('parent-echo', normal), ['b'])
check('boundary parent-echo', solve('parent-echo', boundary), [])
check('normal ack-dirty', solve('ack-dirty', normal), True)
check('boundary ack-dirty', solve('ack-dirty', boundary), False)
check('normal stale-parent', solve('stale-parent', normal), False)
check('boundary stale-parent', solve('stale-parent', boundary), True)
check('normal label-refresh', solve('label-refresh', normal), {'id':'a','label':'A2'})
check('boundary label-refresh', solve('label-refresh', boundary), {'id':'','label':''})
check('normal change-detection', solve('change-detection', normal), True)
check('boundary change-detection', solve('change-detection', boundary), False)
variant = dict(normal, **{'incoming':'id'+str(N)})
check('variant query or selection payload', solve('external-value', variant), 'id'+str(N))
check('unknown completion event', solve('unrecognized', normal), {'unchanged': True})
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 |
|---|---|---|---|
| normal same-id | True | True | Passed |
| boundary same-id | True | True | Passed |
| normal rerender | bea | bea | Passed |
| boundary rerender | | | Passed |
| normal external-value | b | b | Passed |
| boundary external-value | None | None | Passed |
| normal external-draft | Bee | Bee | Passed |
| boundary external-draft | | | Passed |
| normal external-preview | Bee | | Failed |
| boundary external-preview | | | Passed |
| normal parent-echo | ['b'] | ['b'] | Passed |
| boundary parent-echo | [] | [] | Passed |
| normal ack-dirty | True | True | Passed |
| boundary ack-dirty | False | False | Passed |
| normal stale-parent | False | False | Passed |
| boundary stale-parent | True | True | Passed |
| normal label-refresh | {'id': 'a', 'label': 'A2'} | {'id': 'a', 'label': 'A2'} | Passed |
| boundary label-refresh | {'id': '', 'label': ''} | {'id': '', 'label': ''} | Passed |
| normal change-detection | True | True | Passed |
| boundary change-detection | False | False | Passed |
| variant query or selection payload | id1 | id1 | Passed |
| unknown completion event | {'unchanged': True} | {'unchanged': True} | Passed |
SHA-256 / 27c2d5f0fd6371be8454daf45c5b660368e18ee2dbfed5e6b6885add4bc6d158
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(event, d):
if event == 'same-id': return d['old_object']['id']==d['new_object']['id']
if event == 'rerender': return d['draft'] if d['dirty'] and not d['ack'] else d['label']
if event == 'external-value': return d['incoming']
if event == 'external-draft': return d['label']
if event == 'external-preview': return ''
if event == 'parent-echo': return [] if d['ack'] else [d['incoming']]
if event == 'ack-dirty': return False if d['ack'] else d['dirty']
if event == 'stale-parent': return d['incoming_epoch']==d['epoch']
if event == 'label-refresh': return {'id':d['old_object']['id'],'label':d['new_object']['label']}
if event == 'change-detection': return d['incoming']!=d['value']
return {'unchanged': True}
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'value':'a','incoming':'b','label':'Bee','draft':'bea','dirty':True,'ack':False,'preview':'beam','epoch':N,'incoming_epoch':N-1,'old_object':{'id':'a','label':'A'},'new_object':{'id':'a','label':'A2'}}
boundary = {'value':None,'incoming':None,'label':'','draft':'','dirty':False,'ack':True,'preview':'','epoch':N,'incoming_epoch':N,'old_object':{'id':'','label':''},'new_object':{'id':'','label':''}}
check('normal same-id', solve('same-id', normal), True)
check('boundary same-id', solve('same-id', boundary), True)
check('normal rerender', solve('rerender', normal), 'bea')
check('boundary rerender', solve('rerender', boundary), '')
check('normal external-value', solve('external-value', normal), 'b')
check('boundary external-value', solve('external-value', boundary), None)
check('normal external-draft', solve('external-draft', normal), 'Bee')
check('boundary external-draft', solve('external-draft', boundary), '')
check('normal external-preview', solve('external-preview', normal), '')
check('boundary external-preview', solve('external-preview', boundary), '')
check('normal parent-echo', solve('parent-echo', normal), ['b'])
check('boundary parent-echo', solve('parent-echo', boundary), [])
check('normal ack-dirty', solve('ack-dirty', normal), True)
check('boundary ack-dirty', solve('ack-dirty', boundary), False)
check('normal stale-parent', solve('stale-parent', normal), False)
check('boundary stale-parent', solve('stale-parent', boundary), True)
check('normal label-refresh', solve('label-refresh', normal), {'id':'a','label':'A2'})
check('boundary label-refresh', solve('label-refresh', boundary), {'id':'','label':''})
check('normal change-detection', solve('change-detection', normal), True)
check('boundary change-detection', solve('change-detection', boundary), False)
variant = dict(normal, **{'incoming':'id'+str(N)})
check('variant query or selection payload', solve('external-value', variant), 'id'+str(N))
check('unknown completion event', solve('unrecognized', normal), {'unchanged': True})
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 |
|---|---|---|---|
| normal same-id | True | True | Passed |
| boundary same-id | True | True | Passed |
| normal rerender | bea | bea | Passed |
| boundary rerender | | | Passed |
| normal external-value | b | b | Passed |
| boundary external-value | None | None | Passed |
| normal external-draft | Bee | Bee | Passed |
| boundary external-draft | | | Passed |
| normal external-preview | | | Passed |
| boundary external-preview | | | Passed |
| normal parent-echo | ['b'] | ['b'] | Passed |
| boundary parent-echo | [] | [] | Passed |
| normal ack-dirty | True | True | Passed |
| boundary ack-dirty | False | False | Passed |
| normal stale-parent | False | False | Passed |
| boundary stale-parent | True | True | Passed |
| normal label-refresh | {'id': 'a', 'label': 'A2'} | {'id': 'a', 'label': 'A2'} | Passed |
| boundary label-refresh | {'id': '', 'label': ''} | {'id': '', 'label': ''} | Passed |
| normal change-detection | True | True | Passed |
| boundary change-detection | False | False | Passed |
| variant query or selection payload | id1 | id1 | Passed |
| unknown completion event | {'unchanged': True} | {'unchanged': True} | Passed |
SHA-256 / 5cf9aa1e84cdf8353d8b5a1af8ceb569beb4fe6289e7afe1fb5cc5eda59ad5a8
Verification & scope
Stipulated deterministic widget transition model; inputs are validated snapshots. It does not model browser event dispatch, network transport, or linguistic standards. 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:40:40.948105+00:00.
Case digest / 073636da5bf23326f730014289148a97303f49364b3cbe5d3536a5a3fc7a7c24