FA-8711 / Notification interfaces / Open access
Toast queue lifecycle: Capacity eviction removes the newest notifications · case 01
Capacity eviction removes the newest notifications.
ROOT CAUSE
The capacity operation uses `items[:limit] if limit else []` where the contract requires `items[-limit:] if limit else []`.
VERIFIED REPAIR
Implement the capacity operation as `items[-limit:] if limit else []`.
Unsuccessful approach: Zero capacity must not use the full-list negative-zero slice.
Case contract
Toast IDs deduplicate additions; equal content may belong to distinct IDs; keep newest within capacity; update/dismiss target one ID; clear removes all.
Why this case matters
A deterministic model of toast queue lifecycle; this isolates one interface invariant without requiring a browser.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, event, ident, message, limit):
items = [dict(x) for x in items]
if event == 'add':
if any(x['id'] == ident for x in items): return items
items.append({'id': ident, 'message': message})
return items[:limit] if limit else []
if event == 'update':
for x in items:
if x['id'] == ident: x['message'] = message
if event == 'dismiss': items = [x for x in items if x['id'] != ident]
if event == 'clear': items = []
return items
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('distinct messages equal', solve([dict(id='a',message='same')], 'add', 'b', 'same', 3), [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}])
check('retry identity', solve([dict(id='a',message='first')], 'add', 'a', 'new', 3), [{'id': 'a', 'message': 'first'}])
check('capacity', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'add', 'c', 'c', 2), [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}])
check('zero', solve([], 'add', 'a', 'a', 0), [])
check('update', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'update', 'a', 'new', 3), [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}])
check('dismiss', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'dismiss', 'a', None, 3), [{'id': 'b', 'message': 'b'}])
check('clear', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'clear', None, None, 3), [])
check('parameterized toast identity', solve([], 'add', str(N), 'message'+str(N), 2), [dict(id=str(N),message='message'+str(N))])
for repetition in range(N):
check('repeat clear', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'clear', None, None, 3), [])
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 |
|---|---|---|---|
| distinct messages equal | [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}] | [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}] | Passed |
| retry identity | [{'id': 'a', 'message': 'first'}] | [{'id': 'a', 'message': 'first'}] | Passed |
| capacity | [{'id': 'a', 'message': 'a'}, {'id': 'b', 'message': 'b'}] | [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}] | Failed |
| zero | [] | [] | Passed |
| update | [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}] | [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}] | Passed |
| dismiss | [{'id': 'b', 'message': 'b'}] | [{'id': 'b', 'message': 'b'}] | Passed |
| clear | [] | [] | Passed |
| parameterized toast identity | [{'id': '1', 'message': 'message1'}] | [{'id': '1', 'message': 'message1'}] | Passed |
| repeat clear | [] | [] | Passed |
SHA-256 / 219ab2af8c05afba6453224c76425c178ecbd7cb003752095350d788abfc1ab4
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, event, ident, message, limit):
items = [dict(x) for x in items]
if event == 'add':
if any(x['id'] == ident for x in items): return items
items.append({'id': ident, 'message': message})
return items[-limit:]
if event == 'update':
for x in items:
if x['id'] == ident: x['message'] = message
if event == 'dismiss': items = [x for x in items if x['id'] != ident]
if event == 'clear': items = []
return items
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('distinct messages equal', solve([dict(id='a',message='same')], 'add', 'b', 'same', 3), [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}])
check('retry identity', solve([dict(id='a',message='first')], 'add', 'a', 'new', 3), [{'id': 'a', 'message': 'first'}])
check('capacity', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'add', 'c', 'c', 2), [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}])
check('zero', solve([], 'add', 'a', 'a', 0), [])
check('update', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'update', 'a', 'new', 3), [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}])
check('dismiss', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'dismiss', 'a', None, 3), [{'id': 'b', 'message': 'b'}])
check('clear', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'clear', None, None, 3), [])
check('parameterized toast identity', solve([], 'add', str(N), 'message'+str(N), 2), [dict(id=str(N),message='message'+str(N))])
for repetition in range(N):
check('repeat clear', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'clear', None, None, 3), [])
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 |
|---|---|---|---|
| distinct messages equal | [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}] | [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}] | Passed |
| retry identity | [{'id': 'a', 'message': 'first'}] | [{'id': 'a', 'message': 'first'}] | Passed |
| capacity | [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}] | [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}] | Passed |
| zero | [{'id': 'a', 'message': 'a'}] | [] | Failed |
| update | [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}] | [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}] | Passed |
| dismiss | [{'id': 'b', 'message': 'b'}] | [{'id': 'b', 'message': 'b'}] | Passed |
| clear | [] | [] | Passed |
| parameterized toast identity | [{'id': '1', 'message': 'message1'}] | [{'id': '1', 'message': 'message1'}] | Passed |
| repeat clear | [] | [] | Passed |
SHA-256 / dc65e706a66b86e16be6f9f3c92d18efb36b3da897e8cb66033f21e8ce0dd856
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, event, ident, message, limit):
items = [dict(x) for x in items]
if event == 'add':
if any(x['id'] == ident for x in items): return items
items.append({'id': ident, 'message': message})
return items[-limit:] if limit else []
if event == 'update':
for x in items:
if x['id'] == ident: x['message'] = message
if event == 'dismiss': items = [x for x in items if x['id'] != ident]
if event == 'clear': items = []
return items
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('distinct messages equal', solve([dict(id='a',message='same')], 'add', 'b', 'same', 3), [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}])
check('retry identity', solve([dict(id='a',message='first')], 'add', 'a', 'new', 3), [{'id': 'a', 'message': 'first'}])
check('capacity', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'add', 'c', 'c', 2), [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}])
check('zero', solve([], 'add', 'a', 'a', 0), [])
check('update', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'update', 'a', 'new', 3), [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}])
check('dismiss', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'dismiss', 'a', None, 3), [{'id': 'b', 'message': 'b'}])
check('clear', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'clear', None, None, 3), [])
check('parameterized toast identity', solve([], 'add', str(N), 'message'+str(N), 2), [dict(id=str(N),message='message'+str(N))])
for repetition in range(N):
check('repeat clear', solve([dict(id='a',message='a'),dict(id='b',message='b')], 'clear', None, None, 3), [])
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 |
|---|---|---|---|
| distinct messages equal | [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}] | [{'id': 'a', 'message': 'same'}, {'id': 'b', 'message': 'same'}] | Passed |
| retry identity | [{'id': 'a', 'message': 'first'}] | [{'id': 'a', 'message': 'first'}] | Passed |
| capacity | [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}] | [{'id': 'b', 'message': 'b'}, {'id': 'c', 'message': 'c'}] | Passed |
| zero | [] | [] | Passed |
| update | [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}] | [{'id': 'a', 'message': 'new'}, {'id': 'b', 'message': 'b'}] | Passed |
| dismiss | [{'id': 'b', 'message': 'b'}] | [{'id': 'b', 'message': 'b'}] | Passed |
| clear | [] | [] | Passed |
| parameterized toast identity | [{'id': '1', 'message': 'message1'}] | [{'id': '1', 'message': 'message1'}] | Passed |
| repeat clear | [] | [] | Passed |
SHA-256 / 264ec16a1f876512909a8d200575a53132141ed7db2a5e403fcc7d6edd0f0a15
Verification & scope
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:23.791775+00:00.
Case digest / 092877b79861de4d3c71780fd20c0c5b6fe591948326a88a710cf3060b9e6d18