FA-11881 / Search retrieval semantics / Open access
Active facet selection hides alternative facet counts · case 01
Active facet selection hides alternative facet counts.
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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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 fixture | Actual | Expected | Outcome |
|---|---|---|---|
| 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