FAILURE MAP
← Case archive

FA-23021 / Autocomplete interactions / Open access

Hierarchical path autocomplete: child suggestions arrive under a different parent path · case 01

The response-parent completion transition produces an incorrect observable state.

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

ROOT CAUSE

At path-completion/response-parent, the implementation evaluates `d['parent'].startswith(d['response_parent'])` instead of preserving the specified completion transition.

VERIFIED REPAIR

Implement the response-parent contract using `d['response_parent']==d['parent']`.

Unsuccessful approach: The attempted repair uses `True`, which still violates a normal or boundary completion fixture.

Case contract

Path autocomplete treats the prefix before the last slash as lookup scope and replaces only the final segment. Directory acceptance appends a slash and keeps completion active; leaf acceptance commits. Empty final segments request children, and responses bind to the exact parent path.

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 == 'lookup-parent': return d['parent']
    if event == 'lookup-query': return d['segment']
    if event == 'replace': return d['parent']+d['name']
    if event == 'directory-suffix': return d['name']+('/' if d['directory'] else '')
    if event == 'commit': return None if d['directory'] else d['parent']+d['name']
    if event == 'continue': return d['directory']
    if event == 'response-parent': return d['parent'].startswith(d['response_parent'])
    if event == 'empty-segment': return d['parent'] if not d['segment'] else None
    if event == 'next-scope': return d['parent']+d['name']+'/' if d['directory'] else None
    if event == 'leaf-continuation': return {'leaf':not d['directory'],'continue_at':d['parent']+d['name']+'/' if d['directory'] else None}
    return {'unchanged': True}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'path':'docs/api/rea','parent':'docs/api/','segment':'rea','name':'readme','directory':False,'response_parent':'docs/','epoch':N,'selected':'old','separator':'/'}
boundary = {'path':'docs/','parent':'docs/','segment':'','name':'guide','directory':True,'response_parent':'docs/','epoch':N,'selected':None,'separator':'/'}
check('normal lookup-parent', solve('lookup-parent', normal), 'docs/api/')
check('boundary lookup-parent', solve('lookup-parent', boundary), 'docs/')
check('normal lookup-query', solve('lookup-query', normal), 'rea')
check('boundary lookup-query', solve('lookup-query', boundary), '')
check('normal replace', solve('replace', normal), 'docs/api/readme')
check('boundary replace', solve('replace', boundary), 'docs/guide')
check('normal directory-suffix', solve('directory-suffix', normal), 'readme')
check('boundary directory-suffix', solve('directory-suffix', boundary), 'guide/')
check('normal commit', solve('commit', normal), 'docs/api/readme')
check('boundary commit', solve('commit', boundary), None)
check('normal continue', solve('continue', normal), False)
check('boundary continue', solve('continue', boundary), True)
check('normal response-parent', solve('response-parent', normal), False)
check('boundary response-parent', solve('response-parent', boundary), True)
check('normal empty-segment', solve('empty-segment', normal), None)
check('boundary empty-segment', solve('empty-segment', boundary), 'docs/')
check('normal next-scope', solve('next-scope', normal), None)
check('boundary next-scope', solve('next-scope', boundary), 'docs/guide/')
check('normal leaf-continuation', solve('leaf-continuation', normal), {'leaf':True,'continue_at':None})
check('boundary leaf-continuation', solve('leaf-continuation', boundary), {'leaf':False,'continue_at':'docs/guide/'})
variant = dict(normal, **{'segment':'r'*N})
check('variant query or selection payload', solve('lookup-query', variant), 'r'*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 fixtureActualExpectedOutcome
normal lookup-parentdocs/api/docs/api/Passed
boundary lookup-parentdocs/docs/Passed
normal lookup-queryreareaPassed
boundary lookup-queryPassed
normal replacedocs/api/readmedocs/api/readmePassed
boundary replacedocs/guidedocs/guidePassed
normal directory-suffixreadmereadmePassed
boundary directory-suffixguide/guide/Passed
normal commitdocs/api/readmedocs/api/readmePassed
boundary commitNoneNonePassed
normal continueFalseFalsePassed
boundary continueTrueTruePassed
normal response-parentTrueFalseFailed
boundary response-parentTrueTruePassed
normal empty-segmentNoneNonePassed
boundary empty-segmentdocs/docs/Passed
normal next-scopeNoneNonePassed
boundary next-scopedocs/guide/docs/guide/Passed
normal leaf-continuation{'continue_at': None, 'leaf': True}{'continue_at': None, 'leaf': True}Passed
boundary leaf-continuation{'continue_at': 'docs/guide/', 'leaf': False}{'continue_at': 'docs/guide/', 'leaf': False}Passed
variant query or selection payloadrrPassed
unknown completion event{'unchanged': True}{'unchanged': True}Passed

SHA-256 / 48e08473e80d446082b8bcff6617f4b2604c46bb80b36604b91175bb5bd14798

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 == 'lookup-parent': return d['parent']
    if event == 'lookup-query': return d['segment']
    if event == 'replace': return d['parent']+d['name']
    if event == 'directory-suffix': return d['name']+('/' if d['directory'] else '')
    if event == 'commit': return None if d['directory'] else d['parent']+d['name']
    if event == 'continue': return d['directory']
    if event == 'response-parent': return True
    if event == 'empty-segment': return d['parent'] if not d['segment'] else None
    if event == 'next-scope': return d['parent']+d['name']+'/' if d['directory'] else None
    if event == 'leaf-continuation': return {'leaf':not d['directory'],'continue_at':d['parent']+d['name']+'/' if d['directory'] else None}
    return {'unchanged': True}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'path':'docs/api/rea','parent':'docs/api/','segment':'rea','name':'readme','directory':False,'response_parent':'docs/','epoch':N,'selected':'old','separator':'/'}
boundary = {'path':'docs/','parent':'docs/','segment':'','name':'guide','directory':True,'response_parent':'docs/','epoch':N,'selected':None,'separator':'/'}
check('normal lookup-parent', solve('lookup-parent', normal), 'docs/api/')
check('boundary lookup-parent', solve('lookup-parent', boundary), 'docs/')
check('normal lookup-query', solve('lookup-query', normal), 'rea')
check('boundary lookup-query', solve('lookup-query', boundary), '')
check('normal replace', solve('replace', normal), 'docs/api/readme')
check('boundary replace', solve('replace', boundary), 'docs/guide')
check('normal directory-suffix', solve('directory-suffix', normal), 'readme')
check('boundary directory-suffix', solve('directory-suffix', boundary), 'guide/')
check('normal commit', solve('commit', normal), 'docs/api/readme')
check('boundary commit', solve('commit', boundary), None)
check('normal continue', solve('continue', normal), False)
check('boundary continue', solve('continue', boundary), True)
check('normal response-parent', solve('response-parent', normal), False)
check('boundary response-parent', solve('response-parent', boundary), True)
check('normal empty-segment', solve('empty-segment', normal), None)
check('boundary empty-segment', solve('empty-segment', boundary), 'docs/')
check('normal next-scope', solve('next-scope', normal), None)
check('boundary next-scope', solve('next-scope', boundary), 'docs/guide/')
check('normal leaf-continuation', solve('leaf-continuation', normal), {'leaf':True,'continue_at':None})
check('boundary leaf-continuation', solve('leaf-continuation', boundary), {'leaf':False,'continue_at':'docs/guide/'})
variant = dict(normal, **{'segment':'r'*N})
check('variant query or selection payload', solve('lookup-query', variant), 'r'*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 fixtureActualExpectedOutcome
normal lookup-parentdocs/api/docs/api/Passed
boundary lookup-parentdocs/docs/Passed
normal lookup-queryreareaPassed
boundary lookup-queryPassed
normal replacedocs/api/readmedocs/api/readmePassed
boundary replacedocs/guidedocs/guidePassed
normal directory-suffixreadmereadmePassed
boundary directory-suffixguide/guide/Passed
normal commitdocs/api/readmedocs/api/readmePassed
boundary commitNoneNonePassed
normal continueFalseFalsePassed
boundary continueTrueTruePassed
normal response-parentTrueFalseFailed
boundary response-parentTrueTruePassed
normal empty-segmentNoneNonePassed
boundary empty-segmentdocs/docs/Passed
normal next-scopeNoneNonePassed
boundary next-scopedocs/guide/docs/guide/Passed
normal leaf-continuation{'continue_at': None, 'leaf': True}{'continue_at': None, 'leaf': True}Passed
boundary leaf-continuation{'continue_at': 'docs/guide/', 'leaf': False}{'continue_at': 'docs/guide/', 'leaf': False}Passed
variant query or selection payloadrrPassed
unknown completion event{'unchanged': True}{'unchanged': True}Passed

SHA-256 / 78159880e4c59efd84763378cb82ce8ac4b01cdfe7271093c7f6821fc688cae7

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 == 'lookup-parent': return d['parent']
    if event == 'lookup-query': return d['segment']
    if event == 'replace': return d['parent']+d['name']
    if event == 'directory-suffix': return d['name']+('/' if d['directory'] else '')
    if event == 'commit': return None if d['directory'] else d['parent']+d['name']
    if event == 'continue': return d['directory']
    if event == 'response-parent': return d['response_parent']==d['parent']
    if event == 'empty-segment': return d['parent'] if not d['segment'] else None
    if event == 'next-scope': return d['parent']+d['name']+'/' if d['directory'] else None
    if event == 'leaf-continuation': return {'leaf':not d['directory'],'continue_at':d['parent']+d['name']+'/' if d['directory'] else None}
    return {'unchanged': True}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
normal = {'path':'docs/api/rea','parent':'docs/api/','segment':'rea','name':'readme','directory':False,'response_parent':'docs/','epoch':N,'selected':'old','separator':'/'}
boundary = {'path':'docs/','parent':'docs/','segment':'','name':'guide','directory':True,'response_parent':'docs/','epoch':N,'selected':None,'separator':'/'}
check('normal lookup-parent', solve('lookup-parent', normal), 'docs/api/')
check('boundary lookup-parent', solve('lookup-parent', boundary), 'docs/')
check('normal lookup-query', solve('lookup-query', normal), 'rea')
check('boundary lookup-query', solve('lookup-query', boundary), '')
check('normal replace', solve('replace', normal), 'docs/api/readme')
check('boundary replace', solve('replace', boundary), 'docs/guide')
check('normal directory-suffix', solve('directory-suffix', normal), 'readme')
check('boundary directory-suffix', solve('directory-suffix', boundary), 'guide/')
check('normal commit', solve('commit', normal), 'docs/api/readme')
check('boundary commit', solve('commit', boundary), None)
check('normal continue', solve('continue', normal), False)
check('boundary continue', solve('continue', boundary), True)
check('normal response-parent', solve('response-parent', normal), False)
check('boundary response-parent', solve('response-parent', boundary), True)
check('normal empty-segment', solve('empty-segment', normal), None)
check('boundary empty-segment', solve('empty-segment', boundary), 'docs/')
check('normal next-scope', solve('next-scope', normal), None)
check('boundary next-scope', solve('next-scope', boundary), 'docs/guide/')
check('normal leaf-continuation', solve('leaf-continuation', normal), {'leaf':True,'continue_at':None})
check('boundary leaf-continuation', solve('leaf-continuation', boundary), {'leaf':False,'continue_at':'docs/guide/'})
variant = dict(normal, **{'segment':'r'*N})
check('variant query or selection payload', solve('lookup-query', variant), 'r'*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 fixtureActualExpectedOutcome
normal lookup-parentdocs/api/docs/api/Passed
boundary lookup-parentdocs/docs/Passed
normal lookup-queryreareaPassed
boundary lookup-queryPassed
normal replacedocs/api/readmedocs/api/readmePassed
boundary replacedocs/guidedocs/guidePassed
normal directory-suffixreadmereadmePassed
boundary directory-suffixguide/guide/Passed
normal commitdocs/api/readmedocs/api/readmePassed
boundary commitNoneNonePassed
normal continueFalseFalsePassed
boundary continueTrueTruePassed
normal response-parentFalseFalsePassed
boundary response-parentTrueTruePassed
normal empty-segmentNoneNonePassed
boundary empty-segmentdocs/docs/Passed
normal next-scopeNoneNonePassed
boundary next-scopedocs/guide/docs/guide/Passed
normal leaf-continuation{'continue_at': None, 'leaf': True}{'continue_at': None, 'leaf': True}Passed
boundary leaf-continuation{'continue_at': 'docs/guide/', 'leaf': False}{'continue_at': 'docs/guide/', 'leaf': False}Passed
variant query or selection payloadrrPassed
unknown completion event{'unchanged': True}{'unchanged': True}Passed

SHA-256 / a643b9eb888439b7f1f35913198db786bcee771d5f28e164ef93229db35d60fe

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

Case digest / 344b0d139f7851b7f588b386ccf8d3d89d3daaa49fef35f62ec82d1db7c1b2da