{"abstract":"Eviction state violates retry transition semantics","category":"HTTP retries","checks":7,"contract":"put(key,body,expires) creates a pending receipt if no live receipt exists at current logical time. Existing live matching key returns pending or cached; mismatched body returns conflict. commit succeeds only for a live pending receipt. at(time) moves monotonic time forward. Expiry at now is expired. lookup(key) reports missing/pending/cached. Return outcomes. Commit appends committed or ignored to expose whether a durable receipt write occurred.","evaluation_group":"s3-http_retries-idempotency-expiry","failed_approach":"The attempted repair changes the faulty site to records.pop(k); old=[None,now,False,None] but still violates a regression oracle.","family":"s3-http_retries-idempotency-expiry-eviction-state","id":"FA-30031","implementations":{"attempt":{"sha256":"5032d3f9c9ae82ea078d275e5378f855e645e52658f11598f6765be5fc86c89f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    now=0; records={}; out=[]\n    for e in events:\n        if e[0]=='at': now=max(now,e[1])\n        elif e[0]=='put':\n            k,body,expires=e[1:]\n            old=records.get(k)\n            if old is not None and old[1]<=now:\n                records.pop(k); old=[None,now,False,None]\n            if old is None:\n                if expires<=now: out.append('expired'); continue\n                records[k]=[body,expires,False,None]; out.append('new')\n            elif old[0]!=body: out.append('conflict')\n            elif old[2]: out.append(['cached',old[3]])\n            else: out.append('pending')\n        elif e[0]=='commit':\n            old=records.get(e[1])\n            if old is not None and old[1]>now and not old[2]:\n                old[2]=True; old[3]=e[2]; out.append('committed')\n            else: out.append('ignored')\n        elif e[0]=='lookup':\n            old=records.get(e[1])\n            if old is None or old[1]<=now: out.append('missing')\n            elif old[2]: out.append(['cached',old[3]])\n            else: out.append('pending')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([]), [])\ncheck('1', solve([('lookup','x'),('put','a',N,3),('put','a',N,3),('commit','a',N+9),('commit','a',999),('lookup','a'),('put','a',N,3),('put','a',N+1,3)]), ['missing','new','pending','committed','ignored',['cached',N+9],['cached',N+9],'conflict'])\ncheck('2', solve([('at',3),('put','a',N,3),('put','b',N,2)]), ['expired','expired'])\ncheck('3', solve([('put','a',N,3),('at',3),('commit','a',99),('lookup','a'),('put','a',N+1,5),('lookup','a')]), ['new','ignored','missing','new','pending'])\ncheck('4', solve([('at',4),('put','a',N,6),('at',6),('lookup','a')]), ['new','missing'])\ncheck('5', solve([('put','a',N,2),('at',3),('at',1),('lookup','a')]), ['new','missing'])\ncheck('6', solve([('commit','absent',N),('lookup','absent')]), ['ignored','missing'])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"09c25b5ef4037f9ad08c80dca784365510f922613d6f68da8bb88f5046a2bf1b","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    now=0; records={}; out=[]\n    for e in events:\n        if e[0]=='at': now=max(now,e[1])\n        elif e[0]=='put':\n            k,body,expires=e[1:]\n            old=records.get(k)\n            if old is not None and old[1]<=now:\n                records.pop(k); old=old\n            if old is None:\n                if expires<=now: out.append('expired'); continue\n                records[k]=[body,expires,False,None]; out.append('new')\n            elif old[0]!=body: out.append('conflict')\n            elif old[2]: out.append(['cached',old[3]])\n            else: out.append('pending')\n        elif e[0]=='commit':\n            old=records.get(e[1])\n            if old is not None and old[1]>now and not old[2]:\n                old[2]=True; old[3]=e[2]; out.append('committed')\n            else: out.append('ignored')\n        elif e[0]=='lookup':\n            old=records.get(e[1])\n            if old is None or old[1]<=now: out.append('missing')\n            elif old[2]: out.append(['cached',old[3]])\n            else: out.append('pending')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([]), [])\ncheck('1', solve([('lookup','x'),('put','a',N,3),('put','a',N,3),('commit','a',N+9),('commit','a',999),('lookup','a'),('put','a',N,3),('put','a',N+1,3)]), ['missing','new','pending','committed','ignored',['cached',N+9],['cached',N+9],'conflict'])\ncheck('2', solve([('at',3),('put','a',N,3),('put','b',N,2)]), ['expired','expired'])\ncheck('3', solve([('put','a',N,3),('at',3),('commit','a',99),('lookup','a'),('put','a',N+1,5),('lookup','a')]), ['new','ignored','missing','new','pending'])\ncheck('4', solve([('at',4),('put','a',N,6),('at',6),('lookup','a')]), ['new','missing'])\ncheck('5', solve([('put','a',N,2),('at',3),('at',1),('lookup','a')]), ['new','missing'])\ncheck('6', solve([('commit','absent',N),('lookup','absent')]), ['ignored','missing'])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"aba0cac156c38bf6144172a6872debb1334951fa4c0faca744649e01ee90e8bb","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    now=0; records={}; out=[]\n    for e in events:\n        if e[0]=='at': now=max(now,e[1])\n        elif e[0]=='put':\n            k,body,expires=e[1:]\n            old=records.get(k)\n            if old is not None and old[1]<=now:\n                records.pop(k); old=None\n            if old is None:\n                if expires<=now: out.append('expired'); continue\n                records[k]=[body,expires,False,None]; out.append('new')\n            elif old[0]!=body: out.append('conflict')\n            elif old[2]: out.append(['cached',old[3]])\n            else: out.append('pending')\n        elif e[0]=='commit':\n            old=records.get(e[1])\n            if old is not None and old[1]>now and not old[2]:\n                old[2]=True; old[3]=e[2]; out.append('committed')\n            else: out.append('ignored')\n        elif e[0]=='lookup':\n            old=records.get(e[1])\n            if old is None or old[1]<=now: out.append('missing')\n            elif old[2]: out.append(['cached',old[3]])\n            else: out.append('pending')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([]), [])\ncheck('1', solve([('lookup','x'),('put','a',N,3),('put','a',N,3),('commit','a',N+9),('commit','a',999),('lookup','a'),('put','a',N,3),('put','a',N+1,3)]), ['missing','new','pending','committed','ignored',['cached',N+9],['cached',N+9],'conflict'])\ncheck('2', solve([('at',3),('put','a',N,3),('put','b',N,2)]), ['expired','expired'])\ncheck('3', solve([('put','a',N,3),('at',3),('commit','a',99),('lookup','a'),('put','a',N+1,5),('lookup','a')]), ['new','ignored','missing','new','pending'])\ncheck('4', solve([('at',4),('put','a',N,6),('at',6),('lookup','a')]), ['new','missing'])\ncheck('5', solve([('put','a',N,2),('at',3),('at',1),('lookup','a')]), ['new','missing'])\ncheck('6', solve([('commit','absent',N),('lookup','absent')]), ['ignored','missing'])\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Stipulated bounded simulator, not a complete HTTP implementation or a standards 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.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"s3-http_retries-idempotency-expiry-eviction-state","generated_at":"2026-09-29T14:41:48.954282+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Offline deterministic model of HTTP request retries.","repair":"Restore the specified transition records.pop(k); old=None.","root_cause":"Eviction state violates retry transition semantics","sha256":"06ac440c7c7f9c73190edebc24d3417fde9bb8dfa7491a182e64a9b9937ccac1","title":"Idempotency receipt expiry during retry: Eviction state violates retry transition semantics · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.765,"exit_code":1,"observations":[{"actual":[],"check":"0","expected":[],"passed":true},{"actual":["missing","new","pending","committed","ignored",["cached",10],["cached",10],"conflict"],"check":"1","expected":["missing","new","pending","committed","ignored",["cached",10],["cached",10],"conflict"],"passed":true},{"actual":["expired","expired"],"check":"2","expected":["expired","expired"],"passed":true},{"actual":["new","ignored","missing","conflict","missing"],"check":"3","expected":["new","ignored","missing","new","pending"],"passed":false},{"actual":["new","missing"],"check":"4","expected":["new","missing"],"passed":true},{"actual":["new","missing"],"check":"5","expected":["new","missing"],"passed":true},{"actual":["ignored","missing"],"check":"6","expected":["ignored","missing"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"1\", \"actual\": [\"missing\", \"new\", \"pending\", \"committed\", \"ignored\", [\"cached\", 10], [\"cached\", 10], \"conflict\"], \"expected\": [\"missing\", \"new\", \"pending\", \"committed\", \"ignored\", [\"cached\", 10], [\"cached\", 10], \"conflict\"], \"passed\": true}, {\"check\": \"2\", \"actual\": [\"expired\", \"expired\"], \"expected\": [\"expired\", \"expired\"], \"passed\": true}, {\"check\": \"3\", \"actual\": [\"new\", \"ignored\", \"missing\", \"conflict\", \"missing\"], \"expected\": [\"new\", \"ignored\", \"missing\", \"new\", \"pending\"], \"passed\": false}, {\"check\": \"4\", \"actual\": [\"new\", \"missing\"], \"expected\": [\"new\", \"missing\"], \"passed\": true}, {\"check\": \"5\", \"actual\": [\"new\", \"missing\"], \"expected\": [\"new\", \"missing\"], \"passed\": true}, {\"check\": \"6\", \"actual\": [\"ignored\", \"missing\"], \"expected\": [\"ignored\", \"missing\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.135,"exit_code":1,"observations":[{"actual":[],"check":"0","expected":[],"passed":true},{"actual":["missing","new","pending","committed","ignored",["cached",10],["cached",10],"conflict"],"check":"1","expected":["missing","new","pending","committed","ignored",["cached",10],["cached",10],"conflict"],"passed":true},{"actual":["expired","expired"],"check":"2","expected":["expired","expired"],"passed":true},{"actual":["new","ignored","missing","conflict","missing"],"check":"3","expected":["new","ignored","missing","new","pending"],"passed":false},{"actual":["new","missing"],"check":"4","expected":["new","missing"],"passed":true},{"actual":["new","missing"],"check":"5","expected":["new","missing"],"passed":true},{"actual":["ignored","missing"],"check":"6","expected":["ignored","missing"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"1\", \"actual\": [\"missing\", \"new\", \"pending\", \"committed\", \"ignored\", [\"cached\", 10], [\"cached\", 10], \"conflict\"], \"expected\": [\"missing\", \"new\", \"pending\", \"committed\", \"ignored\", [\"cached\", 10], [\"cached\", 10], \"conflict\"], \"passed\": true}, {\"check\": \"2\", \"actual\": [\"expired\", \"expired\"], \"expected\": [\"expired\", \"expired\"], \"passed\": true}, {\"check\": \"3\", \"actual\": [\"new\", \"ignored\", \"missing\", \"conflict\", \"missing\"], \"expected\": [\"new\", \"ignored\", \"missing\", \"new\", \"pending\"], \"passed\": false}, {\"check\": \"4\", \"actual\": [\"new\", \"missing\"], \"expected\": [\"new\", \"missing\"], \"passed\": true}, {\"check\": \"5\", \"actual\": [\"new\", \"missing\"], \"expected\": [\"new\", \"missing\"], \"passed\": true}, {\"check\": \"6\", \"actual\": [\"ignored\", \"missing\"], \"expected\": [\"ignored\", \"missing\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.033,"exit_code":0,"observations":[{"actual":[],"check":"0","expected":[],"passed":true},{"actual":["missing","new","pending","committed","ignored",["cached",10],["cached",10],"conflict"],"check":"1","expected":["missing","new","pending","committed","ignored",["cached",10],["cached",10],"conflict"],"passed":true},{"actual":["expired","expired"],"check":"2","expected":["expired","expired"],"passed":true},{"actual":["new","ignored","missing","new","pending"],"check":"3","expected":["new","ignored","missing","new","pending"],"passed":true},{"actual":["new","missing"],"check":"4","expected":["new","missing"],"passed":true},{"actual":["new","missing"],"check":"5","expected":["new","missing"],"passed":true},{"actual":["ignored","missing"],"check":"6","expected":["ignored","missing"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"1\", \"actual\": [\"missing\", \"new\", \"pending\", \"committed\", \"ignored\", [\"cached\", 10], [\"cached\", 10], \"conflict\"], \"expected\": [\"missing\", \"new\", \"pending\", \"committed\", \"ignored\", [\"cached\", 10], [\"cached\", 10], \"conflict\"], \"passed\": true}, {\"check\": \"2\", \"actual\": [\"expired\", \"expired\"], \"expected\": [\"expired\", \"expired\"], \"passed\": true}, {\"check\": \"3\", \"actual\": [\"new\", \"ignored\", \"missing\", \"new\", \"pending\"], \"expected\": [\"new\", \"ignored\", \"missing\", \"new\", \"pending\"], \"passed\": true}, {\"check\": \"4\", \"actual\": [\"new\", \"missing\"], \"expected\": [\"new\", \"missing\"], \"passed\": true}, {\"check\": \"5\", \"actual\": [\"new\", \"missing\"], \"expected\": [\"new\", \"missing\"], \"passed\": true}, {\"check\": \"6\", \"actual\": [\"ignored\", \"missing\"], \"expected\": [\"ignored\", \"missing\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}