{"abstract":"Replacing generated file content revokes the blob URL still used by a reader.","category":"Client state","checks":6,"contract":"Generated-file URL retirement preserves the active generation and every generation referenced by a reader; only unreferenced inactive generations are revoked.","evaluation_group":"s3-client-state-blob-url-generation","failed_approach":"The partial repair still violates at least one explicit regression oracle.","family":"s3-client-state-blob-url-generation","id":"FA-24791","implementations":{"attempt":{"sha256":"b9841fc7c5a9d6076cbc8caf49e164459e8ca9d259056c5171454c3ad30c0bcd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(generations, active, readers):\n    return [url for generation,url in generations if generation not in readers.values()]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('old generation still read', solve([(1,'old'),(2,'new')],2,{'preview':1}), [])\ncheck('old unreferenced', solve([(1,'old'),(2,'new')],2,{}), ['old'])\ncheck('active no reader', solve([(1,'active')],1,{}), [])\ncheck('multiple stale generations', solve([(1,'a'),(2,'b'),(3,'c')],3,{'save':2}), ['a'])\ncheck('empty', solve([],0,{}), [])\ncheck('parameterized generations', solve([(i,str(i)) for i in range(N+2)],N+1,{'preview':N}), [str(i) for i in range(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":"cb0e970aa44497b6a82304cdc587ac88d327c87da07536c834f3e5a636ae9769","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(generations, active, readers):\n    return [url for generation,url in generations if generation!=active]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('old generation still read', solve([(1,'old'),(2,'new')],2,{'preview':1}), [])\ncheck('old unreferenced', solve([(1,'old'),(2,'new')],2,{}), ['old'])\ncheck('active no reader', solve([(1,'active')],1,{}), [])\ncheck('multiple stale generations', solve([(1,'a'),(2,'b'),(3,'c')],3,{'save':2}), ['a'])\ncheck('empty', solve([],0,{}), [])\ncheck('parameterized generations', solve([(i,str(i)) for i in range(N+2)],N+1,{'preview':N}), [str(i) for i in range(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":"59a26322e17b997b6694173f932cb0eb548c451c81b83d00af5c1d4f59167ac2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(generations, active, readers):\n    used=set(readers.values())|{active}\n    return [url for generation,url in generations if generation not in used]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('old generation still read', solve([(1,'old'),(2,'new')],2,{'preview':1}), [])\ncheck('old unreferenced', solve([(1,'old'),(2,'new')],2,{}), ['old'])\ncheck('active no reader', solve([(1,'active')],1,{}), [])\ncheck('multiple stale generations', solve([(1,'a'),(2,'b'),(3,'c')],3,{'save':2}), ['a'])\ncheck('empty', solve([],0,{}), [])\ncheck('parameterized generations', solve([(i,str(i)) for i in range(N+2)],N+1,{'preview':N}), [str(i) for i in range(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":"This models the stated application policy only; no browser or framework conformance is claimed. 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-client-state-blob-url-generation","generated_at":"2026-09-29T14:41:00.699289+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"A bounded offline client-state transition with explicit lifecycle inputs.","repair":"Generated-file URL retirement preserves the active generation and every generation referenced by a reader; only unreferenced inactive generations are revoked.","root_cause":"The faulty implementation violates Generated-file URL retirement preserves the active generation and every generation referenced by a reader; only unreferenced inactive generations are revoked.","sha256":"f9dee48c47a21ef0f1771b883b97a4f57be2202acaaf08dc79dbf0a37d0c3379","title":"Replacing generated file content revokes the blob URL still used by a reader · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.104,"exit_code":1,"observations":[{"actual":["new"],"check":"old generation still read","expected":[],"passed":false},{"actual":["old","new"],"check":"old unreferenced","expected":["old"],"passed":false},{"actual":["active"],"check":"active no reader","expected":[],"passed":false},{"actual":["a","c"],"check":"multiple stale generations","expected":["a"],"passed":false},{"actual":[],"check":"empty","expected":[],"passed":true},{"actual":["0","2"],"check":"parameterized generations","expected":["0"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"old generation still read\", \"actual\": [\"new\"], \"expected\": [], \"passed\": false}, {\"check\": \"old unreferenced\", \"actual\": [\"old\", \"new\"], \"expected\": [\"old\"], \"passed\": false}, {\"check\": \"active no reader\", \"actual\": [\"active\"], \"expected\": [], \"passed\": false}, {\"check\": \"multiple stale generations\", \"actual\": [\"a\", \"c\"], \"expected\": [\"a\"], \"passed\": false}, {\"check\": \"empty\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"parameterized generations\", \"actual\": [\"0\", \"2\"], \"expected\": [\"0\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.736,"exit_code":1,"observations":[{"actual":["old"],"check":"old generation still read","expected":[],"passed":false},{"actual":["old"],"check":"old unreferenced","expected":["old"],"passed":true},{"actual":[],"check":"active no reader","expected":[],"passed":true},{"actual":["a","b"],"check":"multiple stale generations","expected":["a"],"passed":false},{"actual":[],"check":"empty","expected":[],"passed":true},{"actual":["0","1"],"check":"parameterized generations","expected":["0"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"old generation still read\", \"actual\": [\"old\"], \"expected\": [], \"passed\": false}, {\"check\": \"old unreferenced\", \"actual\": [\"old\"], \"expected\": [\"old\"], \"passed\": true}, {\"check\": \"active no reader\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"multiple stale generations\", \"actual\": [\"a\", \"b\"], \"expected\": [\"a\"], \"passed\": false}, {\"check\": \"empty\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"parameterized generations\", \"actual\": [\"0\", \"1\"], \"expected\": [\"0\"], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.399,"exit_code":0,"observations":[{"actual":[],"check":"old generation still read","expected":[],"passed":true},{"actual":["old"],"check":"old unreferenced","expected":["old"],"passed":true},{"actual":[],"check":"active no reader","expected":[],"passed":true},{"actual":["a"],"check":"multiple stale generations","expected":["a"],"passed":true},{"actual":[],"check":"empty","expected":[],"passed":true},{"actual":["0"],"check":"parameterized generations","expected":["0"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"old generation still read\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"old unreferenced\", \"actual\": [\"old\"], \"expected\": [\"old\"], \"passed\": true}, {\"check\": \"active no reader\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"multiple stale generations\", \"actual\": [\"a\"], \"expected\": [\"a\"], \"passed\": true}, {\"check\": \"empty\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"parameterized generations\", \"actual\": [\"0\"], \"expected\": [\"0\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}