FAILURE MAP
← Case archive

FA-23101 / Autocomplete interactions / Open access

Autocomplete query activation policy: empty-query browse incorrectly requests typed-query results · case 01

The recent completion transition produces an incorrect observable state.

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

ROOT CAUSE

At activation-policy/recent, the implementation evaluates `d['rows']` instead of preserving the specified completion transition.

VERIFIED REPAIR

Implement the recent contract using `d['recent'] if not d['draft'] else []`.

Unsuccessful approach: The attempted repair uses `d['recent']`, which still violates a normal or boundary completion fixture.

Case contract

This stipulated picker searches only after minimum draft length unless explicit browse is requested. Empty-query browse uses recent suggestions, composition blocks query emission, and disabled/read-only interaction suppresses new requests. Draft erasure cancels pending search and clears query-bound results.

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 == 'threshold': return len(d['draft'])>=d['minimum']
    if event == 'browse': return d['browse']
    if event == 'recent': return d['rows']
    if event == 'deferred-browse': return {'defer_browse':d['browse'] and d['composing'],'query':None if d['composing'] else d['draft']}
    if event == 'disabled': return not d['disabled']
    if event == 'readonly': return not d['readonly']
    if event == 'erase-pending': return None
    if event == 'erase-results': return []
    if event == 'empty-query-mode': return 'recent' if not d['draft'] and d['browse'] else 'type-more' if len(d['draft'])<d['minimum'] else 'results'
    if event == 'browse-descriptor': return {'mode':'browse' if d['browse'] else 'query','text':d['draft']}
    return {'unchanged': True}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'draft':'p','minimum':2,'browse':False,'recent':['a'],'composing':True,'disabled':True,'readonly':True,'pending':'pe','rows':['p1'],'epoch':N}
boundary = {'draft':'','minimum':0,'browse':True,'recent':[],'composing':False,'disabled':False,'readonly':False,'pending':None,'rows':[],'epoch':N}
check('normal threshold', solve('threshold', normal), False)
check('boundary threshold', solve('threshold', boundary), True)
check('normal browse', solve('browse', normal), False)
check('boundary browse', solve('browse', boundary), True)
check('normal recent', solve('recent', normal), [])
check('boundary recent', solve('recent', boundary), [])
check('normal deferred-browse', solve('deferred-browse', normal), {'defer_browse':False,'query':None})
check('boundary deferred-browse', solve('deferred-browse', boundary), {'defer_browse':False,'query':''})
check('normal disabled', solve('disabled', normal), False)
check('boundary disabled', solve('disabled', boundary), True)
check('normal readonly', solve('readonly', normal), False)
check('boundary readonly', solve('readonly', boundary), True)
check('normal erase-pending', solve('erase-pending', normal), None)
check('boundary erase-pending', solve('erase-pending', boundary), None)
check('normal erase-results', solve('erase-results', normal), [])
check('boundary erase-results', solve('erase-results', boundary), [])
check('normal empty-query-mode', solve('empty-query-mode', normal), 'type-more')
check('boundary empty-query-mode', solve('empty-query-mode', boundary), 'recent')
check('normal browse-descriptor', solve('browse-descriptor', normal), {'mode':'query','text':'p'})
check('boundary browse-descriptor', solve('browse-descriptor', boundary), {'mode':'browse','text':''})
variant = dict(normal, **{'draft':'x'*N,'minimum':N})
check('variant query or selection payload', solve('threshold', variant), True)
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 fixtureActualExpectedOutcome
normal thresholdFalseFalsePassed
boundary thresholdTrueTruePassed
normal browseFalseFalsePassed
boundary browseTrueTruePassed
normal recent['p1'][]Failed
boundary recent[][]Passed
normal deferred-browse{'defer_browse': False, 'query': None}{'defer_browse': False, 'query': None}Passed
boundary deferred-browse{'defer_browse': False, 'query': ''}{'defer_browse': False, 'query': ''}Passed
normal disabledFalseFalsePassed
boundary disabledTrueTruePassed
normal readonlyFalseFalsePassed
boundary readonlyTrueTruePassed
normal erase-pendingNoneNonePassed
boundary erase-pendingNoneNonePassed
normal erase-results[][]Passed
boundary erase-results[][]Passed
normal empty-query-modetype-moretype-morePassed
boundary empty-query-moderecentrecentPassed
normal browse-descriptor{'mode': 'query', 'text': 'p'}{'mode': 'query', 'text': 'p'}Passed
boundary browse-descriptor{'mode': 'browse', 'text': ''}{'mode': 'browse', 'text': ''}Passed
variant query or selection payloadTrueTruePassed
unknown completion event{'unchanged': True}{'unchanged': True}Passed

SHA-256 / 58d7db48747803e4b6fd5b1b2e03abea538bac80025a04f9fdfe15a52c7abe12

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 == 'threshold': return len(d['draft'])>=d['minimum']
    if event == 'browse': return d['browse']
    if event == 'recent': return d['recent']
    if event == 'deferred-browse': return {'defer_browse':d['browse'] and d['composing'],'query':None if d['composing'] else d['draft']}
    if event == 'disabled': return not d['disabled']
    if event == 'readonly': return not d['readonly']
    if event == 'erase-pending': return None
    if event == 'erase-results': return []
    if event == 'empty-query-mode': return 'recent' if not d['draft'] and d['browse'] else 'type-more' if len(d['draft'])<d['minimum'] else 'results'
    if event == 'browse-descriptor': return {'mode':'browse' if d['browse'] else 'query','text':d['draft']}
    return {'unchanged': True}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'draft':'p','minimum':2,'browse':False,'recent':['a'],'composing':True,'disabled':True,'readonly':True,'pending':'pe','rows':['p1'],'epoch':N}
boundary = {'draft':'','minimum':0,'browse':True,'recent':[],'composing':False,'disabled':False,'readonly':False,'pending':None,'rows':[],'epoch':N}
check('normal threshold', solve('threshold', normal), False)
check('boundary threshold', solve('threshold', boundary), True)
check('normal browse', solve('browse', normal), False)
check('boundary browse', solve('browse', boundary), True)
check('normal recent', solve('recent', normal), [])
check('boundary recent', solve('recent', boundary), [])
check('normal deferred-browse', solve('deferred-browse', normal), {'defer_browse':False,'query':None})
check('boundary deferred-browse', solve('deferred-browse', boundary), {'defer_browse':False,'query':''})
check('normal disabled', solve('disabled', normal), False)
check('boundary disabled', solve('disabled', boundary), True)
check('normal readonly', solve('readonly', normal), False)
check('boundary readonly', solve('readonly', boundary), True)
check('normal erase-pending', solve('erase-pending', normal), None)
check('boundary erase-pending', solve('erase-pending', boundary), None)
check('normal erase-results', solve('erase-results', normal), [])
check('boundary erase-results', solve('erase-results', boundary), [])
check('normal empty-query-mode', solve('empty-query-mode', normal), 'type-more')
check('boundary empty-query-mode', solve('empty-query-mode', boundary), 'recent')
check('normal browse-descriptor', solve('browse-descriptor', normal), {'mode':'query','text':'p'})
check('boundary browse-descriptor', solve('browse-descriptor', boundary), {'mode':'browse','text':''})
variant = dict(normal, **{'draft':'x'*N,'minimum':N})
check('variant query or selection payload', solve('threshold', variant), True)
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 fixtureActualExpectedOutcome
normal thresholdFalseFalsePassed
boundary thresholdTrueTruePassed
normal browseFalseFalsePassed
boundary browseTrueTruePassed
normal recent['a'][]Failed
boundary recent[][]Passed
normal deferred-browse{'defer_browse': False, 'query': None}{'defer_browse': False, 'query': None}Passed
boundary deferred-browse{'defer_browse': False, 'query': ''}{'defer_browse': False, 'query': ''}Passed
normal disabledFalseFalsePassed
boundary disabledTrueTruePassed
normal readonlyFalseFalsePassed
boundary readonlyTrueTruePassed
normal erase-pendingNoneNonePassed
boundary erase-pendingNoneNonePassed
normal erase-results[][]Passed
boundary erase-results[][]Passed
normal empty-query-modetype-moretype-morePassed
boundary empty-query-moderecentrecentPassed
normal browse-descriptor{'mode': 'query', 'text': 'p'}{'mode': 'query', 'text': 'p'}Passed
boundary browse-descriptor{'mode': 'browse', 'text': ''}{'mode': 'browse', 'text': ''}Passed
variant query or selection payloadTrueTruePassed
unknown completion event{'unchanged': True}{'unchanged': True}Passed

SHA-256 / 149fd765f79adc007a7c1c1de6a8171be688a05d4c68d0af6fcf001f51274e5d

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 == 'threshold': return len(d['draft'])>=d['minimum']
    if event == 'browse': return d['browse']
    if event == 'recent': return d['recent'] if not d['draft'] else []
    if event == 'deferred-browse': return {'defer_browse':d['browse'] and d['composing'],'query':None if d['composing'] else d['draft']}
    if event == 'disabled': return not d['disabled']
    if event == 'readonly': return not d['readonly']
    if event == 'erase-pending': return None
    if event == 'erase-results': return []
    if event == 'empty-query-mode': return 'recent' if not d['draft'] and d['browse'] else 'type-more' if len(d['draft'])<d['minimum'] else 'results'
    if event == 'browse-descriptor': return {'mode':'browse' if d['browse'] else 'query','text':d['draft']}
    return {'unchanged': True}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'draft':'p','minimum':2,'browse':False,'recent':['a'],'composing':True,'disabled':True,'readonly':True,'pending':'pe','rows':['p1'],'epoch':N}
boundary = {'draft':'','minimum':0,'browse':True,'recent':[],'composing':False,'disabled':False,'readonly':False,'pending':None,'rows':[],'epoch':N}
check('normal threshold', solve('threshold', normal), False)
check('boundary threshold', solve('threshold', boundary), True)
check('normal browse', solve('browse', normal), False)
check('boundary browse', solve('browse', boundary), True)
check('normal recent', solve('recent', normal), [])
check('boundary recent', solve('recent', boundary), [])
check('normal deferred-browse', solve('deferred-browse', normal), {'defer_browse':False,'query':None})
check('boundary deferred-browse', solve('deferred-browse', boundary), {'defer_browse':False,'query':''})
check('normal disabled', solve('disabled', normal), False)
check('boundary disabled', solve('disabled', boundary), True)
check('normal readonly', solve('readonly', normal), False)
check('boundary readonly', solve('readonly', boundary), True)
check('normal erase-pending', solve('erase-pending', normal), None)
check('boundary erase-pending', solve('erase-pending', boundary), None)
check('normal erase-results', solve('erase-results', normal), [])
check('boundary erase-results', solve('erase-results', boundary), [])
check('normal empty-query-mode', solve('empty-query-mode', normal), 'type-more')
check('boundary empty-query-mode', solve('empty-query-mode', boundary), 'recent')
check('normal browse-descriptor', solve('browse-descriptor', normal), {'mode':'query','text':'p'})
check('boundary browse-descriptor', solve('browse-descriptor', boundary), {'mode':'browse','text':''})
variant = dict(normal, **{'draft':'x'*N,'minimum':N})
check('variant query or selection payload', solve('threshold', variant), True)
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 fixtureActualExpectedOutcome
normal thresholdFalseFalsePassed
boundary thresholdTrueTruePassed
normal browseFalseFalsePassed
boundary browseTrueTruePassed
normal recent[][]Passed
boundary recent[][]Passed
normal deferred-browse{'defer_browse': False, 'query': None}{'defer_browse': False, 'query': None}Passed
boundary deferred-browse{'defer_browse': False, 'query': ''}{'defer_browse': False, 'query': ''}Passed
normal disabledFalseFalsePassed
boundary disabledTrueTruePassed
normal readonlyFalseFalsePassed
boundary readonlyTrueTruePassed
normal erase-pendingNoneNonePassed
boundary erase-pendingNoneNonePassed
normal erase-results[][]Passed
boundary erase-results[][]Passed
normal empty-query-modetype-moretype-morePassed
boundary empty-query-moderecentrecentPassed
normal browse-descriptor{'mode': 'query', 'text': 'p'}{'mode': 'query', 'text': 'p'}Passed
boundary browse-descriptor{'mode': 'browse', 'text': ''}{'mode': 'browse', 'text': ''}Passed
variant query or selection payloadTrueTruePassed
unknown completion event{'unchanged': True}{'unchanged': True}Passed

SHA-256 / 75b09fb0bba0850df55fe097809c062d4ba1606ac138c248e3865c13cb6dc32e

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

Case digest / 9b783768de0b0425b83960bdd8c5dea665848dc7ad0b124d860dd92cdba3cb33