{"abstract":"Final drain fails to wake terminal deque consumers.","category":"Bounded deques","checks":9,"contract":"Graceful close forbids future insertion but permits draining buffered values. Empty closed deque reports closed rather than empty. Terminal consumer waiters wake exactly on first empty close or final drain.","evaluation_group":"s3-bounded-deques-graceful-close","failed_approach":"The partial repair still applies the incorrect transition to an admitted boundary or multi-element case.","family":"s3-bounded-deques-graceful-close-last-drain-wake","id":"FA-46801","implementations":{"attempt":{"sha256":"e3e8d66af0cf5097e4088e21fe2efbb87f8381e2cc05f6fd14b3031c79648a0e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    a,closed,op,value,cap,waiters=x\n    if op=='close':\n        wakes=waiters if not a and not closed else []\n        return [a,True,None,wakes,not closed]\n    if op=='push':\n        if closed or len(a)==cap:return [a,closed,None,[],False]\n        return [a+[value],closed,None,[],True]\n    if not a:return [a,closed,'closed' if closed else 'empty',[],False]\n    result=a[1:]\n    wakes=waiters if closed and not result and len(waiters)==1 else []\n    return [result,closed,a[0],wakes,True]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([[N],False,\"close\",0,3,[1,2]]), {1: [[1], True, None, [], True], 2: [[2], True, None, [], True], 3: [[3], True, None, [], True], 4: [[4], True, None, [], True], 5: [[5], True, None, [], True]}[N])\ncheck('1', solve([[],False,\"close\",0,3,[1,2]]), {1: [[], True, None, [1, 2], True], 2: [[], True, None, [1, 2], True], 3: [[], True, None, [1, 2], True], 4: [[], True, None, [1, 2], True], 5: [[], True, None, [1, 2], True]}[N])\ncheck('2', solve([[],True,\"close\",0,3,[1,2]]), {1: [[], True, None, [], False], 2: [[], True, None, [], False], 3: [[], True, None, [], False], 4: [[], True, None, [], False], 5: [[], True, None, [], False]}[N])\ncheck('3', solve([[N],True,\"push\",N+1,3,[1]]), {1: [[1], True, None, [], False], 2: [[2], True, None, [], False], 3: [[3], True, None, [], False], 4: [[4], True, None, [], False], 5: [[5], True, None, [], False]}[N])\ncheck('4', solve([[N,N+1],True,\"pop\",0,3,[1]]), {1: [[2], True, 1, [], True], 2: [[3], True, 2, [], True], 3: [[4], True, 3, [], True], 4: [[5], True, 4, [], True], 5: [[6], True, 5, [], True]}[N])\ncheck('5', solve([[N],True,\"pop\",0,3,[1,2]]), {1: [[], True, 1, [1, 2], True], 2: [[], True, 2, [1, 2], True], 3: [[], True, 3, [1, 2], True], 4: [[], True, 4, [1, 2], True], 5: [[], True, 5, [1, 2], True]}[N])\ncheck('6', solve([[],True,\"pop\",0,3,[1]]), {1: [[], True, 'closed', [], False], 2: [[], True, 'closed', [], False], 3: [[], True, 'closed', [], False], 4: [[], True, 'closed', [], False], 5: [[], True, 'closed', [], False]}[N])\ncheck('7', solve([[],False,\"pop\",0,3,[1]]), {1: [[], False, 'empty', [], False], 2: [[], False, 'empty', [], False], 3: [[], False, 'empty', [], False], 4: [[], False, 'empty', [], False], 5: [[], False, 'empty', [], False]}[N])\ncheck('8', solve([[N],False,\"push\",N+1,3,[]]), {1: [[1, 2], False, None, [], True], 2: [[2, 3], False, None, [], True], 3: [[3, 4], False, None, [], True], 4: [[4, 5], False, None, [], True], 5: [[5, 6], False, None, [], True]}[N])\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":"dbd22a39fb07dca1311c6c1f09e55ef720d267ae997707fe456f1aae07a3121f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    a,closed,op,value,cap,waiters=x\n    if op=='close':\n        wakes=waiters if not a and not closed else []\n        return [a,True,None,wakes,not closed]\n    if op=='push':\n        if closed or len(a)==cap:return [a,closed,None,[],False]\n        return [a+[value],closed,None,[],True]\n    if not a:return [a,closed,'closed' if closed else 'empty',[],False]\n    result=a[1:]\n    wakes=[]\n    return [result,closed,a[0],wakes,True]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([[N],False,\"close\",0,3,[1,2]]), {1: [[1], True, None, [], True], 2: [[2], True, None, [], True], 3: [[3], True, None, [], True], 4: [[4], True, None, [], True], 5: [[5], True, None, [], True]}[N])\ncheck('1', solve([[],False,\"close\",0,3,[1,2]]), {1: [[], True, None, [1, 2], True], 2: [[], True, None, [1, 2], True], 3: [[], True, None, [1, 2], True], 4: [[], True, None, [1, 2], True], 5: [[], True, None, [1, 2], True]}[N])\ncheck('2', solve([[],True,\"close\",0,3,[1,2]]), {1: [[], True, None, [], False], 2: [[], True, None, [], False], 3: [[], True, None, [], False], 4: [[], True, None, [], False], 5: [[], True, None, [], False]}[N])\ncheck('3', solve([[N],True,\"push\",N+1,3,[1]]), {1: [[1], True, None, [], False], 2: [[2], True, None, [], False], 3: [[3], True, None, [], False], 4: [[4], True, None, [], False], 5: [[5], True, None, [], False]}[N])\ncheck('4', solve([[N,N+1],True,\"pop\",0,3,[1]]), {1: [[2], True, 1, [], True], 2: [[3], True, 2, [], True], 3: [[4], True, 3, [], True], 4: [[5], True, 4, [], True], 5: [[6], True, 5, [], True]}[N])\ncheck('5', solve([[N],True,\"pop\",0,3,[1,2]]), {1: [[], True, 1, [1, 2], True], 2: [[], True, 2, [1, 2], True], 3: [[], True, 3, [1, 2], True], 4: [[], True, 4, [1, 2], True], 5: [[], True, 5, [1, 2], True]}[N])\ncheck('6', solve([[],True,\"pop\",0,3,[1]]), {1: [[], True, 'closed', [], False], 2: [[], True, 'closed', [], False], 3: [[], True, 'closed', [], False], 4: [[], True, 'closed', [], False], 5: [[], True, 'closed', [], False]}[N])\ncheck('7', solve([[],False,\"pop\",0,3,[1]]), {1: [[], False, 'empty', [], False], 2: [[], False, 'empty', [], False], 3: [[], False, 'empty', [], False], 4: [[], False, 'empty', [], False], 5: [[], False, 'empty', [], False]}[N])\ncheck('8', solve([[N],False,\"push\",N+1,3,[]]), {1: [[1, 2], False, None, [], True], 2: [[2, 3], False, None, [], True], 3: [[3, 4], False, None, [], True], 4: [[4, 5], False, None, [], True], 5: [[5, 6], False, None, [], True]}[N])\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":"5c27617c44c18a7cce4d334b8ac196a75b6ceb4e05051c33b168c9e88261d661","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    a,closed,op,value,cap,waiters=x\n    if op=='close':\n        wakes=waiters if not a and not closed else []\n        return [a,True,None,wakes,not closed]\n    if op=='push':\n        if closed or len(a)==cap:return [a,closed,None,[],False]\n        return [a+[value],closed,None,[],True]\n    if not a:return [a,closed,'closed' if closed else 'empty',[],False]\n    result=a[1:]\n    wakes=waiters if closed and not result else []\n    return [result,closed,a[0],wakes,True]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('0', solve([[N],False,\"close\",0,3,[1,2]]), {1: [[1], True, None, [], True], 2: [[2], True, None, [], True], 3: [[3], True, None, [], True], 4: [[4], True, None, [], True], 5: [[5], True, None, [], True]}[N])\ncheck('1', solve([[],False,\"close\",0,3,[1,2]]), {1: [[], True, None, [1, 2], True], 2: [[], True, None, [1, 2], True], 3: [[], True, None, [1, 2], True], 4: [[], True, None, [1, 2], True], 5: [[], True, None, [1, 2], True]}[N])\ncheck('2', solve([[],True,\"close\",0,3,[1,2]]), {1: [[], True, None, [], False], 2: [[], True, None, [], False], 3: [[], True, None, [], False], 4: [[], True, None, [], False], 5: [[], True, None, [], False]}[N])\ncheck('3', solve([[N],True,\"push\",N+1,3,[1]]), {1: [[1], True, None, [], False], 2: [[2], True, None, [], False], 3: [[3], True, None, [], False], 4: [[4], True, None, [], False], 5: [[5], True, None, [], False]}[N])\ncheck('4', solve([[N,N+1],True,\"pop\",0,3,[1]]), {1: [[2], True, 1, [], True], 2: [[3], True, 2, [], True], 3: [[4], True, 3, [], True], 4: [[5], True, 4, [], True], 5: [[6], True, 5, [], True]}[N])\ncheck('5', solve([[N],True,\"pop\",0,3,[1,2]]), {1: [[], True, 1, [1, 2], True], 2: [[], True, 2, [1, 2], True], 3: [[], True, 3, [1, 2], True], 4: [[], True, 4, [1, 2], True], 5: [[], True, 5, [1, 2], True]}[N])\ncheck('6', solve([[],True,\"pop\",0,3,[1]]), {1: [[], True, 'closed', [], False], 2: [[], True, 'closed', [], False], 3: [[], True, 'closed', [], False], 4: [[], True, 'closed', [], False], 5: [[], True, 'closed', [], False]}[N])\ncheck('7', solve([[],False,\"pop\",0,3,[1]]), {1: [[], False, 'empty', [], False], 2: [[], False, 'empty', [], False], 3: [[], False, 'empty', [], False], 4: [[], False, 'empty', [], False], 5: [[], False, 'empty', [], False]}[N])\ncheck('8', solve([[N],False,\"push\",N+1,3,[]]), {1: [[1, 2], False, None, [], True], 2: [[2, 3], False, None, [], True], 3: [[3, 4], False, None, [], True], 4: [[4, 5], False, None, [], True], 5: [[5, 6], False, None, [], True]}[N])\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":"Offline finite deterministic model; no claim of production implementation or concurrent memory-model conformance. 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-bounded-deques-graceful-close-last-drain-wake","generated_at":"2026-09-29T14:44:35.573171+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Controlled bounded deque implementation model with explicit storage and lifecycle observations.","repair":"Restore the documented last drain wake invariant in graceful-close.","root_cause":"Final drain fails to wake terminal deque consumers.","sha256":"3e81d105f092f11dc46e3544ef83928e5ba7ffd77cee53436cc12ec32dfb8891","title":"Final drain fails to wake terminal deque consumers · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":36.984,"exit_code":1,"observations":[{"actual":[[1],true,null,[],true],"check":"0","expected":[[1],true,null,[],true],"passed":true},{"actual":[[],true,null,[1,2],true],"check":"1","expected":[[],true,null,[1,2],true],"passed":true},{"actual":[[],true,null,[],false],"check":"2","expected":[[],true,null,[],false],"passed":true},{"actual":[[1],true,null,[],false],"check":"3","expected":[[1],true,null,[],false],"passed":true},{"actual":[[2],true,1,[],true],"check":"4","expected":[[2],true,1,[],true],"passed":true},{"actual":[[],true,1,[],true],"check":"5","expected":[[],true,1,[1,2],true],"passed":false},{"actual":[[],true,"closed",[],false],"check":"6","expected":[[],true,"closed",[],false],"passed":true},{"actual":[[],false,"empty",[],false],"check":"7","expected":[[],false,"empty",[],false],"passed":true},{"actual":[[1,2],false,null,[],true],"check":"8","expected":[[1,2],false,null,[],true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [[1], true, null, [], true], \"expected\": [[1], true, null, [], true], \"passed\": true}, {\"check\": \"1\", \"actual\": [[], true, null, [1, 2], true], \"expected\": [[], true, null, [1, 2], true], \"passed\": true}, {\"check\": \"2\", \"actual\": [[], true, null, [], false], \"expected\": [[], true, null, [], false], \"passed\": true}, {\"check\": \"3\", \"actual\": [[1], true, null, [], false], \"expected\": [[1], true, null, [], false], \"passed\": true}, {\"check\": \"4\", \"actual\": [[2], true, 1, [], true], \"expected\": [[2], true, 1, [], true], \"passed\": true}, {\"check\": \"5\", \"actual\": [[], true, 1, [], true], \"expected\": [[], true, 1, [1, 2], true], \"passed\": false}, {\"check\": \"6\", \"actual\": [[], true, \"closed\", [], false], \"expected\": [[], true, \"closed\", [], false], \"passed\": true}, {\"check\": \"7\", \"actual\": [[], false, \"empty\", [], false], \"expected\": [[], false, \"empty\", [], false], \"passed\": true}, {\"check\": \"8\", \"actual\": [[1, 2], false, null, [], true], \"expected\": [[1, 2], false, null, [], true], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.07,"exit_code":1,"observations":[{"actual":[[1],true,null,[],true],"check":"0","expected":[[1],true,null,[],true],"passed":true},{"actual":[[],true,null,[1,2],true],"check":"1","expected":[[],true,null,[1,2],true],"passed":true},{"actual":[[],true,null,[],false],"check":"2","expected":[[],true,null,[],false],"passed":true},{"actual":[[1],true,null,[],false],"check":"3","expected":[[1],true,null,[],false],"passed":true},{"actual":[[2],true,1,[],true],"check":"4","expected":[[2],true,1,[],true],"passed":true},{"actual":[[],true,1,[],true],"check":"5","expected":[[],true,1,[1,2],true],"passed":false},{"actual":[[],true,"closed",[],false],"check":"6","expected":[[],true,"closed",[],false],"passed":true},{"actual":[[],false,"empty",[],false],"check":"7","expected":[[],false,"empty",[],false],"passed":true},{"actual":[[1,2],false,null,[],true],"check":"8","expected":[[1,2],false,null,[],true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [[1], true, null, [], true], \"expected\": [[1], true, null, [], true], \"passed\": true}, {\"check\": \"1\", \"actual\": [[], true, null, [1, 2], true], \"expected\": [[], true, null, [1, 2], true], \"passed\": true}, {\"check\": \"2\", \"actual\": [[], true, null, [], false], \"expected\": [[], true, null, [], false], \"passed\": true}, {\"check\": \"3\", \"actual\": [[1], true, null, [], false], \"expected\": [[1], true, null, [], false], \"passed\": true}, {\"check\": \"4\", \"actual\": [[2], true, 1, [], true], \"expected\": [[2], true, 1, [], true], \"passed\": true}, {\"check\": \"5\", \"actual\": [[], true, 1, [], true], \"expected\": [[], true, 1, [1, 2], true], \"passed\": false}, {\"check\": \"6\", \"actual\": [[], true, \"closed\", [], false], \"expected\": [[], true, \"closed\", [], false], \"passed\": true}, {\"check\": \"7\", \"actual\": [[], false, \"empty\", [], false], \"expected\": [[], false, \"empty\", [], false], \"passed\": true}, {\"check\": \"8\", \"actual\": [[1, 2], false, null, [], true], \"expected\": [[1, 2], false, null, [], true], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.072,"exit_code":0,"observations":[{"actual":[[1],true,null,[],true],"check":"0","expected":[[1],true,null,[],true],"passed":true},{"actual":[[],true,null,[1,2],true],"check":"1","expected":[[],true,null,[1,2],true],"passed":true},{"actual":[[],true,null,[],false],"check":"2","expected":[[],true,null,[],false],"passed":true},{"actual":[[1],true,null,[],false],"check":"3","expected":[[1],true,null,[],false],"passed":true},{"actual":[[2],true,1,[],true],"check":"4","expected":[[2],true,1,[],true],"passed":true},{"actual":[[],true,1,[1,2],true],"check":"5","expected":[[],true,1,[1,2],true],"passed":true},{"actual":[[],true,"closed",[],false],"check":"6","expected":[[],true,"closed",[],false],"passed":true},{"actual":[[],false,"empty",[],false],"check":"7","expected":[[],false,"empty",[],false],"passed":true},{"actual":[[1,2],false,null,[],true],"check":"8","expected":[[1,2],false,null,[],true],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"0\", \"actual\": [[1], true, null, [], true], \"expected\": [[1], true, null, [], true], \"passed\": true}, {\"check\": \"1\", \"actual\": [[], true, null, [1, 2], true], \"expected\": [[], true, null, [1, 2], true], \"passed\": true}, {\"check\": \"2\", \"actual\": [[], true, null, [], false], \"expected\": [[], true, null, [], false], \"passed\": true}, {\"check\": \"3\", \"actual\": [[1], true, null, [], false], \"expected\": [[1], true, null, [], false], \"passed\": true}, {\"check\": \"4\", \"actual\": [[2], true, 1, [], true], \"expected\": [[2], true, 1, [], true], \"passed\": true}, {\"check\": \"5\", \"actual\": [[], true, 1, [1, 2], true], \"expected\": [[], true, 1, [1, 2], true], \"passed\": true}, {\"check\": \"6\", \"actual\": [[], true, \"closed\", [], false], \"expected\": [[], true, \"closed\", [], false], \"passed\": true}, {\"check\": \"7\", \"actual\": [[], false, \"empty\", [], false], \"expected\": [[], false, \"empty\", [], false], \"passed\": true}, {\"check\": \"8\", \"actual\": [[1, 2], false, null, [], true], \"expected\": [[1, 2], false, null, [], true], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}