FAILURE MAP
← Case archive

FA-45706 / Data systems / Open access

Top-k suppresses retractions for score changes of surviving IDs · case 01

Top-k suppresses retractions for score changes of surviving IDs.

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

ROOT CAUSE

incremental-topk-membership: Top-k suppresses retractions for score changes of surviving IDs.

VERIFIED REPAIR

Preserve the stated physical representation and operation order: Maintain unique-ID scored rows with upsert/delete operations, then report changes to a top-k materialized view. Scores order descending with ascending ID ties. Retractions carry old scores; insertions carry new scores. Score updates within the top-k emit both. Return retractions sorted by ID, then insertions sorted by ID.

Unsuccessful approach: Conjunction still ignores changed scores when identity survives.

Case contract

Maintain unique-ID scored rows with upsert/delete operations, then report changes to a top-k materialized view. Scores order descending with ascending ID ties. Retractions carry old scores; insertions carry new scores. Score updates within the top-k emit both. Return retractions sorted by ID, then insertions sorted by ID.

Why this case matters

A bounded deterministic data engine model makes representation and changelog faults reproducible.

1 / The failure

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

N = 1
observations = []
def solve(d):
    try:
        initial,changes,k=d
        before=dict(initial); after=dict(initial)
        for op,ident,score in changes:
            if op=='delete': after.pop(ident,None)
            else: after[ident]=score
        old=dict(sorted(before.items(),key=lambda p:(-p[1],p[0]))[:k])
        new=dict(sorted(after.items(),key=lambda p:(-p[1],p[0]))[:k])
        removed=[[i,s,-1] for i,s in sorted(old.items()) if i not in new]
        added=[[i,s,1] for i,s in sorted(new.items()) if i not in old or old[i]!=s]
        return removed+added
    except (IndexError, KeyError, ValueError, StopIteration) as exc:
        return {"representation_error": type(exc).__name__}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('delete leader', solve([[[1, 4], [2, 3], [3, 2]], [['delete', 1, None]], 1]), [[1, 4, -1], [2, 3, 1]])
    check('delete two leaders', solve([[[1, 4], [2, 3], [3, 2]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 4, -1], [3, 2, 1]])
    check('score changes in view', solve([[[1, 4], [2, 1]], [['upsert', 1, 5]], 1]), [[1, 4, -1], [1, 5, 1]])
    check('promote outsider', solve([[[1, 3], [2, 1]], [['upsert', 2, 4]], 1]), [[1, 3, -1], [2, 4, 1]])
    check('insert tie lower id', solve([[[2, 1]], [['upsert', 1, 1]], 1]), [[2, 1, -1], [1, 1, 1]])
    check('no changes', solve([[[1, 1]], [], 1]), [])
    check('zero view', solve([[[1, 1]], [['upsert', 2, 2]], 0]), [])
elif N == 2:
    check('delete leader', solve([[[1, 5], [2, 4], [3, 3]], [['delete', 1, None]], 1]), [[1, 5, -1], [2, 4, 1]])
    check('delete two leaders', solve([[[1, 5], [2, 4], [3, 3]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 5, -1], [3, 3, 1]])
    check('score changes in view', solve([[[1, 5], [2, 2]], [['upsert', 1, 6]], 1]), [[1, 5, -1], [1, 6, 1]])
    check('promote outsider', solve([[[1, 4], [2, 2]], [['upsert', 2, 5]], 1]), [[1, 4, -1], [2, 5, 1]])
    check('insert tie lower id', solve([[[2, 2]], [['upsert', 1, 2]], 1]), [[2, 2, -1], [1, 2, 1]])
    check('no changes', solve([[[1, 2]], [], 1]), [])
    check('zero view', solve([[[1, 2]], [['upsert', 2, 3]], 0]), [])
elif N == 3:
    check('delete leader', solve([[[1, 6], [2, 5], [3, 4]], [['delete', 1, None]], 1]), [[1, 6, -1], [2, 5, 1]])
    check('delete two leaders', solve([[[1, 6], [2, 5], [3, 4]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 6, -1], [3, 4, 1]])
    check('score changes in view', solve([[[1, 6], [2, 3]], [['upsert', 1, 7]], 1]), [[1, 6, -1], [1, 7, 1]])
    check('promote outsider', solve([[[1, 5], [2, 3]], [['upsert', 2, 6]], 1]), [[1, 5, -1], [2, 6, 1]])
    check('insert tie lower id', solve([[[2, 3]], [['upsert', 1, 3]], 1]), [[2, 3, -1], [1, 3, 1]])
    check('no changes', solve([[[1, 3]], [], 1]), [])
    check('zero view', solve([[[1, 3]], [['upsert', 2, 4]], 0]), [])
elif N == 4:
    check('delete leader', solve([[[1, 7], [2, 6], [3, 5]], [['delete', 1, None]], 1]), [[1, 7, -1], [2, 6, 1]])
    check('delete two leaders', solve([[[1, 7], [2, 6], [3, 5]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 7, -1], [3, 5, 1]])
    check('score changes in view', solve([[[1, 7], [2, 4]], [['upsert', 1, 8]], 1]), [[1, 7, -1], [1, 8, 1]])
    check('promote outsider', solve([[[1, 6], [2, 4]], [['upsert', 2, 7]], 1]), [[1, 6, -1], [2, 7, 1]])
    check('insert tie lower id', solve([[[2, 4]], [['upsert', 1, 4]], 1]), [[2, 4, -1], [1, 4, 1]])
    check('no changes', solve([[[1, 4]], [], 1]), [])
    check('zero view', solve([[[1, 4]], [['upsert', 2, 5]], 0]), [])
elif N == 5:
    check('delete leader', solve([[[1, 8], [2, 7], [3, 6]], [['delete', 1, None]], 1]), [[1, 8, -1], [2, 7, 1]])
    check('delete two leaders', solve([[[1, 8], [2, 7], [3, 6]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 8, -1], [3, 6, 1]])
    check('score changes in view', solve([[[1, 8], [2, 5]], [['upsert', 1, 9]], 1]), [[1, 8, -1], [1, 9, 1]])
    check('promote outsider', solve([[[1, 7], [2, 5]], [['upsert', 2, 8]], 1]), [[1, 7, -1], [2, 8, 1]])
    check('insert tie lower id', solve([[[2, 5]], [['upsert', 1, 5]], 1]), [[2, 5, -1], [1, 5, 1]])
    check('no changes', solve([[[1, 5]], [], 1]), [])
    check('zero view', solve([[[1, 5]], [['upsert', 2, 6]], 0]), [])
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
delete leader[[1, 4, -1], [2, 3, 1]][[1, 4, -1], [2, 3, 1]]Passed
delete two leaders[[1, 4, -1], [3, 2, 1]][[1, 4, -1], [3, 2, 1]]Passed
score changes in view[[1, 5, 1]][[1, 4, -1], [1, 5, 1]]Failed
promote outsider[[1, 3, -1], [2, 4, 1]][[1, 3, -1], [2, 4, 1]]Passed
insert tie lower id[[2, 1, -1], [1, 1, 1]][[2, 1, -1], [1, 1, 1]]Passed
no changes[][]Passed
zero view[][]Passed

SHA-256 / e5c7a4b29fe9a9c572411ced14780d4d9fb4bb779824a183a05c228b01d9d2de

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(d):
    try:
        initial,changes,k=d
        before=dict(initial); after=dict(initial)
        for op,ident,score in changes:
            if op=='delete': after.pop(ident,None)
            else: after[ident]=score
        old=dict(sorted(before.items(),key=lambda p:(-p[1],p[0]))[:k])
        new=dict(sorted(after.items(),key=lambda p:(-p[1],p[0]))[:k])
        removed=[[i,s,-1] for i,s in sorted(old.items()) if i not in new and new.get(i)!=s]
        added=[[i,s,1] for i,s in sorted(new.items()) if i not in old or old[i]!=s]
        return removed+added
    except (IndexError, KeyError, ValueError, StopIteration) as exc:
        return {"representation_error": type(exc).__name__}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('delete leader', solve([[[1, 4], [2, 3], [3, 2]], [['delete', 1, None]], 1]), [[1, 4, -1], [2, 3, 1]])
    check('delete two leaders', solve([[[1, 4], [2, 3], [3, 2]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 4, -1], [3, 2, 1]])
    check('score changes in view', solve([[[1, 4], [2, 1]], [['upsert', 1, 5]], 1]), [[1, 4, -1], [1, 5, 1]])
    check('promote outsider', solve([[[1, 3], [2, 1]], [['upsert', 2, 4]], 1]), [[1, 3, -1], [2, 4, 1]])
    check('insert tie lower id', solve([[[2, 1]], [['upsert', 1, 1]], 1]), [[2, 1, -1], [1, 1, 1]])
    check('no changes', solve([[[1, 1]], [], 1]), [])
    check('zero view', solve([[[1, 1]], [['upsert', 2, 2]], 0]), [])
elif N == 2:
    check('delete leader', solve([[[1, 5], [2, 4], [3, 3]], [['delete', 1, None]], 1]), [[1, 5, -1], [2, 4, 1]])
    check('delete two leaders', solve([[[1, 5], [2, 4], [3, 3]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 5, -1], [3, 3, 1]])
    check('score changes in view', solve([[[1, 5], [2, 2]], [['upsert', 1, 6]], 1]), [[1, 5, -1], [1, 6, 1]])
    check('promote outsider', solve([[[1, 4], [2, 2]], [['upsert', 2, 5]], 1]), [[1, 4, -1], [2, 5, 1]])
    check('insert tie lower id', solve([[[2, 2]], [['upsert', 1, 2]], 1]), [[2, 2, -1], [1, 2, 1]])
    check('no changes', solve([[[1, 2]], [], 1]), [])
    check('zero view', solve([[[1, 2]], [['upsert', 2, 3]], 0]), [])
elif N == 3:
    check('delete leader', solve([[[1, 6], [2, 5], [3, 4]], [['delete', 1, None]], 1]), [[1, 6, -1], [2, 5, 1]])
    check('delete two leaders', solve([[[1, 6], [2, 5], [3, 4]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 6, -1], [3, 4, 1]])
    check('score changes in view', solve([[[1, 6], [2, 3]], [['upsert', 1, 7]], 1]), [[1, 6, -1], [1, 7, 1]])
    check('promote outsider', solve([[[1, 5], [2, 3]], [['upsert', 2, 6]], 1]), [[1, 5, -1], [2, 6, 1]])
    check('insert tie lower id', solve([[[2, 3]], [['upsert', 1, 3]], 1]), [[2, 3, -1], [1, 3, 1]])
    check('no changes', solve([[[1, 3]], [], 1]), [])
    check('zero view', solve([[[1, 3]], [['upsert', 2, 4]], 0]), [])
elif N == 4:
    check('delete leader', solve([[[1, 7], [2, 6], [3, 5]], [['delete', 1, None]], 1]), [[1, 7, -1], [2, 6, 1]])
    check('delete two leaders', solve([[[1, 7], [2, 6], [3, 5]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 7, -1], [3, 5, 1]])
    check('score changes in view', solve([[[1, 7], [2, 4]], [['upsert', 1, 8]], 1]), [[1, 7, -1], [1, 8, 1]])
    check('promote outsider', solve([[[1, 6], [2, 4]], [['upsert', 2, 7]], 1]), [[1, 6, -1], [2, 7, 1]])
    check('insert tie lower id', solve([[[2, 4]], [['upsert', 1, 4]], 1]), [[2, 4, -1], [1, 4, 1]])
    check('no changes', solve([[[1, 4]], [], 1]), [])
    check('zero view', solve([[[1, 4]], [['upsert', 2, 5]], 0]), [])
elif N == 5:
    check('delete leader', solve([[[1, 8], [2, 7], [3, 6]], [['delete', 1, None]], 1]), [[1, 8, -1], [2, 7, 1]])
    check('delete two leaders', solve([[[1, 8], [2, 7], [3, 6]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 8, -1], [3, 6, 1]])
    check('score changes in view', solve([[[1, 8], [2, 5]], [['upsert', 1, 9]], 1]), [[1, 8, -1], [1, 9, 1]])
    check('promote outsider', solve([[[1, 7], [2, 5]], [['upsert', 2, 8]], 1]), [[1, 7, -1], [2, 8, 1]])
    check('insert tie lower id', solve([[[2, 5]], [['upsert', 1, 5]], 1]), [[2, 5, -1], [1, 5, 1]])
    check('no changes', solve([[[1, 5]], [], 1]), [])
    check('zero view', solve([[[1, 5]], [['upsert', 2, 6]], 0]), [])
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
delete leader[[1, 4, -1], [2, 3, 1]][[1, 4, -1], [2, 3, 1]]Passed
delete two leaders[[1, 4, -1], [3, 2, 1]][[1, 4, -1], [3, 2, 1]]Passed
score changes in view[[1, 5, 1]][[1, 4, -1], [1, 5, 1]]Failed
promote outsider[[1, 3, -1], [2, 4, 1]][[1, 3, -1], [2, 4, 1]]Passed
insert tie lower id[[2, 1, -1], [1, 1, 1]][[2, 1, -1], [1, 1, 1]]Passed
no changes[][]Passed
zero view[][]Passed

SHA-256 / 1ed360b8dc1e6e88ec178b6f30e27796400f012e38aa2e7a0868b3925210787d

3 / The verified repair

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

N = 1
observations = []
def solve(d):
    try:
        initial,changes,k=d
        before=dict(initial); after=dict(initial)
        for op,ident,score in changes:
            if op=='delete': after.pop(ident,None)
            else: after[ident]=score
        old=dict(sorted(before.items(),key=lambda p:(-p[1],p[0]))[:k])
        new=dict(sorted(after.items(),key=lambda p:(-p[1],p[0]))[:k])
        removed=[[i,s,-1] for i,s in sorted(old.items()) if i not in new or new[i]!=s]
        added=[[i,s,1] for i,s in sorted(new.items()) if i not in old or old[i]!=s]
        return removed+added
    except (IndexError, KeyError, ValueError, StopIteration) as exc:
        return {"representation_error": type(exc).__name__}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    check('delete leader', solve([[[1, 4], [2, 3], [3, 2]], [['delete', 1, None]], 1]), [[1, 4, -1], [2, 3, 1]])
    check('delete two leaders', solve([[[1, 4], [2, 3], [3, 2]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 4, -1], [3, 2, 1]])
    check('score changes in view', solve([[[1, 4], [2, 1]], [['upsert', 1, 5]], 1]), [[1, 4, -1], [1, 5, 1]])
    check('promote outsider', solve([[[1, 3], [2, 1]], [['upsert', 2, 4]], 1]), [[1, 3, -1], [2, 4, 1]])
    check('insert tie lower id', solve([[[2, 1]], [['upsert', 1, 1]], 1]), [[2, 1, -1], [1, 1, 1]])
    check('no changes', solve([[[1, 1]], [], 1]), [])
    check('zero view', solve([[[1, 1]], [['upsert', 2, 2]], 0]), [])
elif N == 2:
    check('delete leader', solve([[[1, 5], [2, 4], [3, 3]], [['delete', 1, None]], 1]), [[1, 5, -1], [2, 4, 1]])
    check('delete two leaders', solve([[[1, 5], [2, 4], [3, 3]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 5, -1], [3, 3, 1]])
    check('score changes in view', solve([[[1, 5], [2, 2]], [['upsert', 1, 6]], 1]), [[1, 5, -1], [1, 6, 1]])
    check('promote outsider', solve([[[1, 4], [2, 2]], [['upsert', 2, 5]], 1]), [[1, 4, -1], [2, 5, 1]])
    check('insert tie lower id', solve([[[2, 2]], [['upsert', 1, 2]], 1]), [[2, 2, -1], [1, 2, 1]])
    check('no changes', solve([[[1, 2]], [], 1]), [])
    check('zero view', solve([[[1, 2]], [['upsert', 2, 3]], 0]), [])
elif N == 3:
    check('delete leader', solve([[[1, 6], [2, 5], [3, 4]], [['delete', 1, None]], 1]), [[1, 6, -1], [2, 5, 1]])
    check('delete two leaders', solve([[[1, 6], [2, 5], [3, 4]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 6, -1], [3, 4, 1]])
    check('score changes in view', solve([[[1, 6], [2, 3]], [['upsert', 1, 7]], 1]), [[1, 6, -1], [1, 7, 1]])
    check('promote outsider', solve([[[1, 5], [2, 3]], [['upsert', 2, 6]], 1]), [[1, 5, -1], [2, 6, 1]])
    check('insert tie lower id', solve([[[2, 3]], [['upsert', 1, 3]], 1]), [[2, 3, -1], [1, 3, 1]])
    check('no changes', solve([[[1, 3]], [], 1]), [])
    check('zero view', solve([[[1, 3]], [['upsert', 2, 4]], 0]), [])
elif N == 4:
    check('delete leader', solve([[[1, 7], [2, 6], [3, 5]], [['delete', 1, None]], 1]), [[1, 7, -1], [2, 6, 1]])
    check('delete two leaders', solve([[[1, 7], [2, 6], [3, 5]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 7, -1], [3, 5, 1]])
    check('score changes in view', solve([[[1, 7], [2, 4]], [['upsert', 1, 8]], 1]), [[1, 7, -1], [1, 8, 1]])
    check('promote outsider', solve([[[1, 6], [2, 4]], [['upsert', 2, 7]], 1]), [[1, 6, -1], [2, 7, 1]])
    check('insert tie lower id', solve([[[2, 4]], [['upsert', 1, 4]], 1]), [[2, 4, -1], [1, 4, 1]])
    check('no changes', solve([[[1, 4]], [], 1]), [])
    check('zero view', solve([[[1, 4]], [['upsert', 2, 5]], 0]), [])
elif N == 5:
    check('delete leader', solve([[[1, 8], [2, 7], [3, 6]], [['delete', 1, None]], 1]), [[1, 8, -1], [2, 7, 1]])
    check('delete two leaders', solve([[[1, 8], [2, 7], [3, 6]], [['delete', 1, None], ['delete', 2, None]], 1]), [[1, 8, -1], [3, 6, 1]])
    check('score changes in view', solve([[[1, 8], [2, 5]], [['upsert', 1, 9]], 1]), [[1, 8, -1], [1, 9, 1]])
    check('promote outsider', solve([[[1, 7], [2, 5]], [['upsert', 2, 8]], 1]), [[1, 7, -1], [2, 8, 1]])
    check('insert tie lower id', solve([[[2, 5]], [['upsert', 1, 5]], 1]), [[2, 5, -1], [1, 5, 1]])
    check('no changes', solve([[[1, 5]], [], 1]), [])
    check('zero view', solve([[[1, 5]], [['upsert', 2, 6]], 0]), [])
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
delete leader[[1, 4, -1], [2, 3, 1]][[1, 4, -1], [2, 3, 1]]Passed
delete two leaders[[1, 4, -1], [3, 2, 1]][[1, 4, -1], [3, 2, 1]]Passed
score changes in view[[1, 4, -1], [1, 5, 1]][[1, 4, -1], [1, 5, 1]]Passed
promote outsider[[1, 3, -1], [2, 4, 1]][[1, 3, -1], [2, 4, 1]]Passed
insert tie lower id[[2, 1, -1], [1, 1, 1]][[2, 1, -1], [1, 1, 1]]Passed
no changes[][]Passed
zero view[][]Passed

SHA-256 / 66ea5871317edf44735cd954e4b5687d76c57ce30e8f624da960758974d84d65

Verification & scope

Offline stipulated semantics over valid small inputs; no performance, concurrency, or production-engine conformance claim. 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:44:24.983640+00:00.

Case digest / 1d41be63764b43f2a9528400c9cea16eeb9e6fd82ba9311977f8e18f061fdcc2