{"abstract":"Complete expiry violates retry transition semantics","category":"HTTP retries","checks":10,"contract":"begin(now,budget) pins a logical deadline. advance(time) uses monotonic logical time. queue(delay) schedules retry only for live request, wake starts only after due and strictly before deadline, complete succeeds only for running attempt before deadline. finish/cancel are terminal. Admission at expired time reports expired and closes request; queue never extends deadline. Return scheduling/attempt dispositions.","evaluation_group":"s3-http_retries-phase-deadline","failed_approach":"The attempted repair changes the faulty site to if False: state='expired'; out.append('expired'); continue\n        state but still violates a regression oracle.","family":"s3-http_retries-phase-deadline-complete-expiry","id":"FA-30441","implementations":{"attempt":{"sha256":"b553079e24a659446094640e4d655ada51fc118abad8c9e74cdb3953a9a6d381","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    now=0; deadline=0; due=None; state='idle'; out=[]\n    for e in events:\n        if e[0]=='begin':\n            now=e[1]; deadline=now+e[2]; due=None; state='ready'\n        elif e[0]=='advance': now=max(now,e[1])\n        elif e[0]=='cancel': state='cancelled'; due=None\n        elif e[0]=='queue':\n            if state not in ('ready','failed'): out.append('blocked'); continue\n            if now>=deadline: state='expired'; out.append('expired'); continue\n            due=now+e[1]; state='queued'; out.append(['queued',due])\n        elif e[0]=='wake':\n            if state!='queued': out.append('blocked'); continue\n            if now>=deadline: state='expired'; due=None; out.append('expired'); continue\n            if now<due: out.append('early'); continue\n            state='running'; due=None; out.append('started')\n        elif e[0]=='fail':\n            if state=='running': state='failed'\n        elif e[0]=='complete':\n            if state!='running': out.append('blocked'); continue\n            if False: state='expired'; out.append('expired'); continue\n            state='done'; out.append('success')\n    return [out,deadline,state]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([]), [[],0,'idle'])\ncheck('1', solve([('begin',N,5),('queue',2),('wake',),('advance',N+2),('wake',),('complete',),('queue',0)]), [[['queued',N+2],'early','started','success','blocked'],N+5,'done'])\ncheck('2', solve([('begin',N,2),('queue',2),('advance',N+2),('wake',)]), [[['queued',N+2],'expired'],N+2,'expired'])\ncheck('3', solve([('begin',N,2),('advance',N+2),('queue',0)]), [['expired'],N+2,'expired'])\ncheck('4', solve([('begin',N,2),('queue',0),('wake',),('advance',N+2),('complete',)]), [[['queued',N],'started','expired'],N+2,'expired'])\ncheck('5', solve([('begin',N,5),('queue',0),('wake',),('fail',),('queue',1),('advance',N+1),('wake',),('cancel',),('queue',0)]), [[['queued',N],'started',['queued',N+1],'started','blocked'],N+5,'cancelled'])\ncheck('6', solve([('begin',N,2),('advance',N+3),('advance',N),('queue',0)]), [['expired'],N+2,'expired'])\ncheck('7', solve([('begin',N,3),('cancel',),('fail',),('queue',0)]), [['blocked'],N+3,'cancelled'])\ncheck('8', solve([('begin',N,5),('queue',0),('wake',),('fail',)]), [[['queued',N],'started'],N+5,'failed'])\ncheck('9', solve([('begin',N,5),('cancel',),('wake',)]), [['blocked'],N+5,'cancelled'])\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":"eaf911080b732c03b49fd1dc41148e945035c58af333122938e77c67678e4569","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    now=0; deadline=0; due=None; state='idle'; out=[]\n    for e in events:\n        if e[0]=='begin':\n            now=e[1]; deadline=now+e[2]; due=None; state='ready'\n        elif e[0]=='advance': now=max(now,e[1])\n        elif e[0]=='cancel': state='cancelled'; due=None\n        elif e[0]=='queue':\n            if state not in ('ready','failed'): out.append('blocked'); continue\n            if now>=deadline: state='expired'; out.append('expired'); continue\n            due=now+e[1]; state='queued'; out.append(['queued',due])\n        elif e[0]=='wake':\n            if state!='queued': out.append('blocked'); continue\n            if now>=deadline: state='expired'; due=None; out.append('expired'); continue\n            if now<due: out.append('early'); continue\n            state='running'; due=None; out.append('started')\n        elif e[0]=='fail':\n            if state=='running': state='failed'\n        elif e[0]=='complete':\n            if state!='running': out.append('blocked'); continue\n            if now>deadline: state='expired'; out.append('expired'); continue\n            state='done'; out.append('success')\n    return [out,deadline,state]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([]), [[],0,'idle'])\ncheck('1', solve([('begin',N,5),('queue',2),('wake',),('advance',N+2),('wake',),('complete',),('queue',0)]), [[['queued',N+2],'early','started','success','blocked'],N+5,'done'])\ncheck('2', solve([('begin',N,2),('queue',2),('advance',N+2),('wake',)]), [[['queued',N+2],'expired'],N+2,'expired'])\ncheck('3', solve([('begin',N,2),('advance',N+2),('queue',0)]), [['expired'],N+2,'expired'])\ncheck('4', solve([('begin',N,2),('queue',0),('wake',),('advance',N+2),('complete',)]), [[['queued',N],'started','expired'],N+2,'expired'])\ncheck('5', solve([('begin',N,5),('queue',0),('wake',),('fail',),('queue',1),('advance',N+1),('wake',),('cancel',),('queue',0)]), [[['queued',N],'started',['queued',N+1],'started','blocked'],N+5,'cancelled'])\ncheck('6', solve([('begin',N,2),('advance',N+3),('advance',N),('queue',0)]), [['expired'],N+2,'expired'])\ncheck('7', solve([('begin',N,3),('cancel',),('fail',),('queue',0)]), [['blocked'],N+3,'cancelled'])\ncheck('8', solve([('begin',N,5),('queue',0),('wake',),('fail',)]), [[['queued',N],'started'],N+5,'failed'])\ncheck('9', solve([('begin',N,5),('cancel',),('wake',)]), [['blocked'],N+5,'cancelled'])\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":"e6f1aa764c2dfd68929b23b7f3e64ecda5d21dbc3576297149619285c013b3b0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(events):\n    now=0; deadline=0; due=None; state='idle'; out=[]\n    for e in events:\n        if e[0]=='begin':\n            now=e[1]; deadline=now+e[2]; due=None; state='ready'\n        elif e[0]=='advance': now=max(now,e[1])\n        elif e[0]=='cancel': state='cancelled'; due=None\n        elif e[0]=='queue':\n            if state not in ('ready','failed'): out.append('blocked'); continue\n            if now>=deadline: state='expired'; out.append('expired'); continue\n            due=now+e[1]; state='queued'; out.append(['queued',due])\n        elif e[0]=='wake':\n            if state!='queued': out.append('blocked'); continue\n            if now>=deadline: state='expired'; due=None; out.append('expired'); continue\n            if now<due: out.append('early'); continue\n            state='running'; due=None; out.append('started')\n        elif e[0]=='fail':\n            if state=='running': state='failed'\n        elif e[0]=='complete':\n            if state!='running': out.append('blocked'); continue\n            if now>=deadline: state='expired'; out.append('expired'); continue\n            state='done'; out.append('success')\n    return [out,deadline,state]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([]), [[],0,'idle'])\ncheck('1', solve([('begin',N,5),('queue',2),('wake',),('advance',N+2),('wake',),('complete',),('queue',0)]), [[['queued',N+2],'early','started','success','blocked'],N+5,'done'])\ncheck('2', solve([('begin',N,2),('queue',2),('advance',N+2),('wake',)]), [[['queued',N+2],'expired'],N+2,'expired'])\ncheck('3', solve([('begin',N,2),('advance',N+2),('queue',0)]), [['expired'],N+2,'expired'])\ncheck('4', solve([('begin',N,2),('queue',0),('wake',),('advance',N+2),('complete',)]), [[['queued',N],'started','expired'],N+2,'expired'])\ncheck('5', solve([('begin',N,5),('queue',0),('wake',),('fail',),('queue',1),('advance',N+1),('wake',),('cancel',),('queue',0)]), [[['queued',N],'started',['queued',N+1],'started','blocked'],N+5,'cancelled'])\ncheck('6', solve([('begin',N,2),('advance',N+3),('advance',N),('queue',0)]), [['expired'],N+2,'expired'])\ncheck('7', solve([('begin',N,3),('cancel',),('fail',),('queue',0)]), [['blocked'],N+3,'cancelled'])\ncheck('8', solve([('begin',N,5),('queue',0),('wake',),('fail',)]), [[['queued',N],'started'],N+5,'failed'])\ncheck('9', solve([('begin',N,5),('cancel',),('wake',)]), [['blocked'],N+5,'cancelled'])\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-phase-deadline-complete-expiry","generated_at":"2026-09-29T14:41:52.997854+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 if now>=deadline: state='expired'; out.append('expired'); continue\n        state.","root_cause":"Complete expiry violates retry transition semantics","sha256":"da0ca5de91a95945790427520505948aa2cb4caf2dd96af3fa6cad38c2bc886d","title":"Logical request deadline across retry phases: Complete expiry 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":39.754,"exit_code":1,"observations":[{"actual":[[],0,"idle"],"check":"0","expected":[[],0,"idle"],"passed":true},{"actual":[[["queued",3],"early","started","success","blocked"],6,"done"],"check":"1","expected":[[["queued",3],"early","started","success","blocked"],6,"done"],"passed":true},{"actual":[[["queued",3],"expired"],3,"expired"],"check":"2","expected":[[["queued",3],"expired"],3,"expired"],"passed":true},{"actual":[["expired"],3,"expired"],"check":"3","expected":[["expired"],3,"expired"],"passed":true},{"actual":[[["queued",1],"started","success"],3,"done"],"check":"4","expected":[[["queued",1],"started","expired"],3,"expired"],"passed":false},{"actual":[[["queued",1],"started",["queued",2],"started","blocked"],6,"cancelled"],"check":"5","expected":[[["queued",1],"started",["queued",2],"started","blocked"],6,"cancelled"],"passed":true},{"actual":[["expired"],3,"expired"],"check":"6","expected":[["expired"],3,"expired"],"passed":true},{"actual":[["blocked"],4,"cancelled"],"check":"7","expected":[["blocked"],4,"cancelled"],"passed":true},{"actual":[[["queued",1],"started"],6,"failed"],"check":"8","expected":[[["queued",1],"started"],6,"failed"],"passed":true},{"actual":[["blocked"],6,"cancelled"],"check":"9","expected":[["blocked"],6,"cancelled"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [[], 0, \"idle\"], \"expected\": [[], 0, \"idle\"], \"passed\": true}, {\"check\": \"1\", \"actual\": [[[\"queued\", 3], \"early\", \"started\", \"success\", \"blocked\"], 6, \"done\"], \"expected\": [[[\"queued\", 3], \"early\", \"started\", \"success\", \"blocked\"], 6, \"done\"], \"passed\": true}, {\"check\": \"2\", \"actual\": [[[\"queued\", 3], \"expired\"], 3, \"expired\"], \"expected\": [[[\"queued\", 3], \"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"3\", \"actual\": [[\"expired\"], 3, \"expired\"], \"expected\": [[\"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"4\", \"actual\": [[[\"queued\", 1], \"started\", \"success\"], 3, \"done\"], \"expected\": [[[\"queued\", 1], \"started\", \"expired\"], 3, \"expired\"], \"passed\": false}, {\"check\": \"5\", \"actual\": [[[\"queued\", 1], \"started\", [\"queued\", 2], \"started\", \"blocked\"], 6, \"cancelled\"], \"expected\": [[[\"queued\", 1], \"started\", [\"queued\", 2], \"started\", \"blocked\"], 6, \"cancelled\"], \"passed\": true}, {\"check\": \"6\", \"actual\": [[\"expired\"], 3, \"expired\"], \"expected\": [[\"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"7\", \"actual\": [[\"blocked\"], 4, \"cancelled\"], \"expected\": [[\"blocked\"], 4, \"cancelled\"], \"passed\": true}, {\"check\": \"8\", \"actual\": [[[\"queued\", 1], \"started\"], 6, \"failed\"], \"expected\": [[[\"queued\", 1], \"started\"], 6, \"failed\"], \"passed\": true}, {\"check\": \"9\", \"actual\": [[\"blocked\"], 6, \"cancelled\"], \"expected\": [[\"blocked\"], 6, \"cancelled\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.212,"exit_code":1,"observations":[{"actual":[[],0,"idle"],"check":"0","expected":[[],0,"idle"],"passed":true},{"actual":[[["queued",3],"early","started","success","blocked"],6,"done"],"check":"1","expected":[[["queued",3],"early","started","success","blocked"],6,"done"],"passed":true},{"actual":[[["queued",3],"expired"],3,"expired"],"check":"2","expected":[[["queued",3],"expired"],3,"expired"],"passed":true},{"actual":[["expired"],3,"expired"],"check":"3","expected":[["expired"],3,"expired"],"passed":true},{"actual":[[["queued",1],"started","success"],3,"done"],"check":"4","expected":[[["queued",1],"started","expired"],3,"expired"],"passed":false},{"actual":[[["queued",1],"started",["queued",2],"started","blocked"],6,"cancelled"],"check":"5","expected":[[["queued",1],"started",["queued",2],"started","blocked"],6,"cancelled"],"passed":true},{"actual":[["expired"],3,"expired"],"check":"6","expected":[["expired"],3,"expired"],"passed":true},{"actual":[["blocked"],4,"cancelled"],"check":"7","expected":[["blocked"],4,"cancelled"],"passed":true},{"actual":[[["queued",1],"started"],6,"failed"],"check":"8","expected":[[["queued",1],"started"],6,"failed"],"passed":true},{"actual":[["blocked"],6,"cancelled"],"check":"9","expected":[["blocked"],6,"cancelled"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [[], 0, \"idle\"], \"expected\": [[], 0, \"idle\"], \"passed\": true}, {\"check\": \"1\", \"actual\": [[[\"queued\", 3], \"early\", \"started\", \"success\", \"blocked\"], 6, \"done\"], \"expected\": [[[\"queued\", 3], \"early\", \"started\", \"success\", \"blocked\"], 6, \"done\"], \"passed\": true}, {\"check\": \"2\", \"actual\": [[[\"queued\", 3], \"expired\"], 3, \"expired\"], \"expected\": [[[\"queued\", 3], \"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"3\", \"actual\": [[\"expired\"], 3, \"expired\"], \"expected\": [[\"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"4\", \"actual\": [[[\"queued\", 1], \"started\", \"success\"], 3, \"done\"], \"expected\": [[[\"queued\", 1], \"started\", \"expired\"], 3, \"expired\"], \"passed\": false}, {\"check\": \"5\", \"actual\": [[[\"queued\", 1], \"started\", [\"queued\", 2], \"started\", \"blocked\"], 6, \"cancelled\"], \"expected\": [[[\"queued\", 1], \"started\", [\"queued\", 2], \"started\", \"blocked\"], 6, \"cancelled\"], \"passed\": true}, {\"check\": \"6\", \"actual\": [[\"expired\"], 3, \"expired\"], \"expected\": [[\"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"7\", \"actual\": [[\"blocked\"], 4, \"cancelled\"], \"expected\": [[\"blocked\"], 4, \"cancelled\"], \"passed\": true}, {\"check\": \"8\", \"actual\": [[[\"queued\", 1], \"started\"], 6, \"failed\"], \"expected\": [[[\"queued\", 1], \"started\"], 6, \"failed\"], \"passed\": true}, {\"check\": \"9\", \"actual\": [[\"blocked\"], 6, \"cancelled\"], \"expected\": [[\"blocked\"], 6, \"cancelled\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.001,"exit_code":0,"observations":[{"actual":[[],0,"idle"],"check":"0","expected":[[],0,"idle"],"passed":true},{"actual":[[["queued",3],"early","started","success","blocked"],6,"done"],"check":"1","expected":[[["queued",3],"early","started","success","blocked"],6,"done"],"passed":true},{"actual":[[["queued",3],"expired"],3,"expired"],"check":"2","expected":[[["queued",3],"expired"],3,"expired"],"passed":true},{"actual":[["expired"],3,"expired"],"check":"3","expected":[["expired"],3,"expired"],"passed":true},{"actual":[[["queued",1],"started","expired"],3,"expired"],"check":"4","expected":[[["queued",1],"started","expired"],3,"expired"],"passed":true},{"actual":[[["queued",1],"started",["queued",2],"started","blocked"],6,"cancelled"],"check":"5","expected":[[["queued",1],"started",["queued",2],"started","blocked"],6,"cancelled"],"passed":true},{"actual":[["expired"],3,"expired"],"check":"6","expected":[["expired"],3,"expired"],"passed":true},{"actual":[["blocked"],4,"cancelled"],"check":"7","expected":[["blocked"],4,"cancelled"],"passed":true},{"actual":[[["queued",1],"started"],6,"failed"],"check":"8","expected":[[["queued",1],"started"],6,"failed"],"passed":true},{"actual":[["blocked"],6,"cancelled"],"check":"9","expected":[["blocked"],6,"cancelled"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [[], 0, \"idle\"], \"expected\": [[], 0, \"idle\"], \"passed\": true}, {\"check\": \"1\", \"actual\": [[[\"queued\", 3], \"early\", \"started\", \"success\", \"blocked\"], 6, \"done\"], \"expected\": [[[\"queued\", 3], \"early\", \"started\", \"success\", \"blocked\"], 6, \"done\"], \"passed\": true}, {\"check\": \"2\", \"actual\": [[[\"queued\", 3], \"expired\"], 3, \"expired\"], \"expected\": [[[\"queued\", 3], \"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"3\", \"actual\": [[\"expired\"], 3, \"expired\"], \"expected\": [[\"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"4\", \"actual\": [[[\"queued\", 1], \"started\", \"expired\"], 3, \"expired\"], \"expected\": [[[\"queued\", 1], \"started\", \"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"5\", \"actual\": [[[\"queued\", 1], \"started\", [\"queued\", 2], \"started\", \"blocked\"], 6, \"cancelled\"], \"expected\": [[[\"queued\", 1], \"started\", [\"queued\", 2], \"started\", \"blocked\"], 6, \"cancelled\"], \"passed\": true}, {\"check\": \"6\", \"actual\": [[\"expired\"], 3, \"expired\"], \"expected\": [[\"expired\"], 3, \"expired\"], \"passed\": true}, {\"check\": \"7\", \"actual\": [[\"blocked\"], 4, \"cancelled\"], \"expected\": [[\"blocked\"], 4, \"cancelled\"], \"passed\": true}, {\"check\": \"8\", \"actual\": [[[\"queued\", 1], \"started\"], 6, \"failed\"], \"expected\": [[[\"queued\", 1], \"started\"], 6, \"failed\"], \"passed\": true}, {\"check\": \"9\", \"actual\": [[\"blocked\"], 6, \"cancelled\"], \"expected\": [[\"blocked\"], 6, \"cancelled\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}