FAILURE MAP
← Case archive

FA-11881 / Search retrieval semantics / Open access

Active facet selection hides alternative facet counts · case 01

Active facet selection hides alternative facet counts.

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

ROOT CAUSE

Facet counts use the fully filtered result set including their own dimension.

VERIFIED REPAIR

Apply all selected dimensions except the facet being counted.

Unsuccessful approach: Dropping every filter restores alternatives but counts documents excluded by other dimensions.

Case contract

Documents map single-valued dimensions to strings. Selection maps dimensions to allowed values; empty selections impose no constraint. Count requested facet values after all other selected dimensions. Return sorted [value,count] pairs.

Why this case matters

An offline deterministic retrieval model isolates this search contract from tokenization, storage, and network behavior.

1 / The failure

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

N = 1
observations = []
def solve(docs, selection, facet):
    counts={}
    for d in docs:
        if all(not vals or d.get(key) in vals for key,vals in selection.items()) and facet in d: counts[d[facet]]=counts.get(d[facet],0)+1
    return sorted([v,c] for v,c in counts.items())
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
docs=[{'color':'red','size':'s'}]*N+[{'color':'blue','size':'s'},{'color':'green','size':'l'}]
check('keep other filters', solve(docs,{'color':['red'],'size':['s']},'color'),[['blue',1],['red',N]])
check('no filters', solve(docs,{},'color'),[['blue',1],['green',1],['red',N]])
check('self filter only', solve(docs,{'color':['red']},'color'),[['blue',1],['green',1],['red',N]])
check('no matching other field', solve(docs,{'size':['xx']},'color'),[])
check('missing facet ignored', solve([{'size':'s'}],{},'color'),[])
check('empty docs', solve([],{},'color'),[])
check('empty selection unrestricted', solve(docs,{'size':[]},'color'),[['blue',1],['green',1],['red',N]])
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
keep other filters[['red', 1]][['blue', 1], ['red', 1]]Failed
no filters[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed
self filter only[['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Failed
no matching other field[][]Passed
missing facet ignored[][]Passed
empty docs[][]Passed
empty selection unrestricted[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed

SHA-256 / 1bc79c3d07e5a4d48b38a029708668e6030f3b0fc8ccef065c5d5a63770bdec3

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(docs, selection, facet):
    counts={}
    for d in docs:
        if facet in d: counts[d[facet]]=counts.get(d[facet],0)+1
    return sorted([v,c] for v,c in counts.items())
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
docs=[{'color':'red','size':'s'}]*N+[{'color':'blue','size':'s'},{'color':'green','size':'l'}]
check('keep other filters', solve(docs,{'color':['red'],'size':['s']},'color'),[['blue',1],['red',N]])
check('no filters', solve(docs,{},'color'),[['blue',1],['green',1],['red',N]])
check('self filter only', solve(docs,{'color':['red']},'color'),[['blue',1],['green',1],['red',N]])
check('no matching other field', solve(docs,{'size':['xx']},'color'),[])
check('missing facet ignored', solve([{'size':'s'}],{},'color'),[])
check('empty docs', solve([],{},'color'),[])
check('empty selection unrestricted', solve(docs,{'size':[]},'color'),[['blue',1],['green',1],['red',N]])
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
keep other filters[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['red', 1]]Failed
no filters[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed
self filter only[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed
no matching other field[['blue', 1], ['green', 1], ['red', 1]][]Failed
missing facet ignored[][]Passed
empty docs[][]Passed
empty selection unrestricted[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed

SHA-256 / eafc99edad24019daf1b10e7515bae5f8a6ff735a9f81741d4c9df67b23e56c1

3 / The verified repair

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

N = 1
observations = []
def solve(docs, selection, facet):
    counts={}
    for d in docs:
        if all(key==facet or not vals or d.get(key) in vals for key,vals in selection.items()) and facet in d: counts[d[facet]]=counts.get(d[facet],0)+1
    return sorted([v,c] for v,c in counts.items())
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
docs=[{'color':'red','size':'s'}]*N+[{'color':'blue','size':'s'},{'color':'green','size':'l'}]
check('keep other filters', solve(docs,{'color':['red'],'size':['s']},'color'),[['blue',1],['red',N]])
check('no filters', solve(docs,{},'color'),[['blue',1],['green',1],['red',N]])
check('self filter only', solve(docs,{'color':['red']},'color'),[['blue',1],['green',1],['red',N]])
check('no matching other field', solve(docs,{'size':['xx']},'color'),[])
check('missing facet ignored', solve([{'size':'s'}],{},'color'),[])
check('empty docs', solve([],{},'color'),[])
check('empty selection unrestricted', solve(docs,{'size':[]},'color'),[['blue',1],['green',1],['red',N]])
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
keep other filters[['blue', 1], ['red', 1]][['blue', 1], ['red', 1]]Passed
no filters[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed
self filter only[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed
no matching other field[][]Passed
missing facet ignored[][]Passed
empty docs[][]Passed
empty selection unrestricted[['blue', 1], ['green', 1], ['red', 1]][['blue', 1], ['green', 1], ['red', 1]]Passed

SHA-256 / 1823c0845f6369142c2e8dd4c5b5a34070afb0ee748b39a7f81a98fa58e42c57

Verification & scope

Inputs are already tokenized or scored; this model makes no claim about production engine performance or linguistic analysis. 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:51.763978+00:00.

Case digest / 45922c5c6a325352af026a09874fb5d4bd3b404419eee620fb98bfb58efdcd39