{"abstract":"Cleanup is skipped after partial acquisition or stops when the first resource cleanup reports failure.","category":"Runtime and resources","checks":7,"contract":"Resources have unique names. Acquire a prefix cancel_after, or all when it is None, then unwind. Every acquired resource receives one cleanup attempt in reverse order. Named simulated cleanup failures stay open; other resources close. Return [attempt order,failure names,sorted open names].","evaluation_group":"model-f7192dae38ee7a67","failed_approach":"Adding a cancellation cleanup loop still leaks earlier resources if it aborts at the first cleanup failure.","family":"runtime-cancellation-cleanup","id":"FA-256","implementations":{"attempt":{"sha256":"e6ad9d3dbf83a67c5927a35aa0dde87305f592737a768f545d8f84f9bfa983b4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(resources, cancel_after, failures):\n    acquired = list(resources[:cancel_after]) if cancel_after is not None else list(resources)\n    remaining, attempted, errors = set(acquired), [], []\n    if True:\n        for identity in reversed(acquired):\n            attempted.append(identity)\n            if identity in failures:\n                errors.append(identity)\n                break\n            else:\n                remaining.remove(identity)\n    return [attempted, errors, sorted(remaining)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nresources = ['r'+str(i) for i in range(N+2)]\ncheck('cancellation after partial acquisition', solve(resources, N, []), [list(reversed(resources[:N])), [], []])\ncheck('normal completion also cleans', solve(resources, None, []), [list(reversed(resources)), [], []])\ncheck('one failure does not suppress rest', solve(resources, None, [resources[-1]]), [list(reversed(resources)), [resources[-1]], [resources[-1]]])\ncheck('cancel before first acquisition', solve(resources, 0, []), [[], [], []])\ncheck('nothing acquired', solve([], None, []), [[], [], []])\ncheck('multiple failures collected', solve(resources, None, [resources[0], resources[-1]]), [list(reversed(resources)), [resources[-1], resources[0]], sorted([resources[0], resources[-1]])])\ncheck('unacquired failure irrelevant', solve(resources, N, [resources[-1]]), [list(reversed(resources[: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":"dffd9b412db79ff8f088032b698c1884370229e6e790aa43e7d27a134ab26310","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(resources, cancel_after, failures):\n    acquired = list(resources[:cancel_after]) if cancel_after is not None else list(resources)\n    remaining, attempted, errors = set(acquired), [], []\n    if cancel_after is None:\n        for identity in reversed(acquired):\n            attempted.append(identity)\n            if identity in failures:\n                errors.append(identity)\n                continue\n            else:\n                remaining.remove(identity)\n    return [attempted, errors, sorted(remaining)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nresources = ['r'+str(i) for i in range(N+2)]\ncheck('cancellation after partial acquisition', solve(resources, N, []), [list(reversed(resources[:N])), [], []])\ncheck('normal completion also cleans', solve(resources, None, []), [list(reversed(resources)), [], []])\ncheck('one failure does not suppress rest', solve(resources, None, [resources[-1]]), [list(reversed(resources)), [resources[-1]], [resources[-1]]])\ncheck('cancel before first acquisition', solve(resources, 0, []), [[], [], []])\ncheck('nothing acquired', solve([], None, []), [[], [], []])\ncheck('multiple failures collected', solve(resources, None, [resources[0], resources[-1]]), [list(reversed(resources)), [resources[-1], resources[0]], sorted([resources[0], resources[-1]])])\ncheck('unacquired failure irrelevant', solve(resources, N, [resources[-1]]), [list(reversed(resources[: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":"f44af2f7a601468e81031623f28512490ee7ca7175d4ff4d5541655e68011348","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(resources, cancel_after, failures):\n    acquired = list(resources[:cancel_after]) if cancel_after is not None else list(resources)\n    remaining, attempted, errors = set(acquired), [], []\n    if True:\n        for identity in reversed(acquired):\n            attempted.append(identity)\n            if identity in failures:\n                errors.append(identity)\n                continue\n            else:\n                remaining.remove(identity)\n    return [attempted, errors, sorted(remaining)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nresources = ['r'+str(i) for i in range(N+2)]\ncheck('cancellation after partial acquisition', solve(resources, N, []), [list(reversed(resources[:N])), [], []])\ncheck('normal completion also cleans', solve(resources, None, []), [list(reversed(resources)), [], []])\ncheck('one failure does not suppress rest', solve(resources, None, [resources[-1]]), [list(reversed(resources)), [resources[-1]], [resources[-1]]])\ncheck('cancel before first acquisition', solve(resources, 0, []), [[], [], []])\ncheck('nothing acquired', solve([], None, []), [[], [], []])\ncheck('multiple failures collected', solve(resources, None, [resources[0], resources[-1]]), [list(reversed(resources)), [resources[-1], resources[0]], sorted([resources[0], resources[-1]])])\ncheck('unacquired failure irrelevant', solve(resources, N, [resources[-1]]), [list(reversed(resources[: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 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":"runtime-cancellation-cleanup","generated_at":"2026-09-29T14:36:51.535459+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Models nested resource scopes cancelled during setup and error-tolerant cleanup; failures are injected state transitions, not real file descriptors, network calls, or exception handlers.","repair":"Attempt cleanup of every acquired resource in reverse acquisition order and collect failures independently.","root_cause":"Unwinding follows only successful completion and lets one cleanup failure suppress the rest.","sha256":"732d73c1e5eda4f640c525102c964257002b9265e646faa26f6bf88ea2b514c7","title":"Cancellation leaves earlier acquired resources open · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":34.158,"exit_code":1,"observations":[{"actual":[["r0"],[],[]],"check":"cancellation after partial acquisition","expected":[["r0"],[],[]],"passed":true},{"actual":[["r2","r1","r0"],[],[]],"check":"normal completion also cleans","expected":[["r2","r1","r0"],[],[]],"passed":true},{"actual":[["r2"],["r2"],["r0","r1","r2"]],"check":"one failure does not suppress rest","expected":[["r2","r1","r0"],["r2"],["r2"]],"passed":false},{"actual":[[],[],[]],"check":"cancel before first acquisition","expected":[[],[],[]],"passed":true},{"actual":[[],[],[]],"check":"nothing acquired","expected":[[],[],[]],"passed":true},{"actual":[["r2"],["r2"],["r0","r1","r2"]],"check":"multiple failures collected","expected":[["r2","r1","r0"],["r2","r0"],["r0","r2"]],"passed":false},{"actual":[["r0"],[],[]],"check":"unacquired failure irrelevant","expected":[["r0"],[],[]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cancellation after partial acquisition\", \"actual\": [[\"r0\"], [], []], \"expected\": [[\"r0\"], [], []], \"passed\": true}, {\"check\": \"normal completion also cleans\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [], []], \"expected\": [[\"r2\", \"r1\", \"r0\"], [], []], \"passed\": true}, {\"check\": \"one failure does not suppress rest\", \"actual\": [[\"r2\"], [\"r2\"], [\"r0\", \"r1\", \"r2\"]], \"expected\": [[\"r2\", \"r1\", \"r0\"], [\"r2\"], [\"r2\"]], \"passed\": false}, {\"check\": \"cancel before first acquisition\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"nothing acquired\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"multiple failures collected\", \"actual\": [[\"r2\"], [\"r2\"], [\"r0\", \"r1\", \"r2\"]], \"expected\": [[\"r2\", \"r1\", \"r0\"], [\"r2\", \"r0\"], [\"r0\", \"r2\"]], \"passed\": false}, {\"check\": \"unacquired failure irrelevant\", \"actual\": [[\"r0\"], [], []], \"expected\": [[\"r0\"], [], []], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":32.011,"exit_code":1,"observations":[{"actual":[[],[],["r0"]],"check":"cancellation after partial acquisition","expected":[["r0"],[],[]],"passed":false},{"actual":[["r2","r1","r0"],[],[]],"check":"normal completion also cleans","expected":[["r2","r1","r0"],[],[]],"passed":true},{"actual":[["r2","r1","r0"],["r2"],["r2"]],"check":"one failure does not suppress rest","expected":[["r2","r1","r0"],["r2"],["r2"]],"passed":true},{"actual":[[],[],[]],"check":"cancel before first acquisition","expected":[[],[],[]],"passed":true},{"actual":[[],[],[]],"check":"nothing acquired","expected":[[],[],[]],"passed":true},{"actual":[["r2","r1","r0"],["r2","r0"],["r0","r2"]],"check":"multiple failures collected","expected":[["r2","r1","r0"],["r2","r0"],["r0","r2"]],"passed":true},{"actual":[[],[],["r0"]],"check":"unacquired failure irrelevant","expected":[["r0"],[],[]],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cancellation after partial acquisition\", \"actual\": [[], [], [\"r0\"]], \"expected\": [[\"r0\"], [], []], \"passed\": false}, {\"check\": \"normal completion also cleans\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [], []], \"expected\": [[\"r2\", \"r1\", \"r0\"], [], []], \"passed\": true}, {\"check\": \"one failure does not suppress rest\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [\"r2\"], [\"r2\"]], \"expected\": [[\"r2\", \"r1\", \"r0\"], [\"r2\"], [\"r2\"]], \"passed\": true}, {\"check\": \"cancel before first acquisition\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"nothing acquired\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"multiple failures collected\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [\"r2\", \"r0\"], [\"r0\", \"r2\"]], \"expected\": [[\"r2\", \"r1\", \"r0\"], [\"r2\", \"r0\"], [\"r0\", \"r2\"]], \"passed\": true}, {\"check\": \"unacquired failure irrelevant\", \"actual\": [[], [], [\"r0\"]], \"expected\": [[\"r0\"], [], []], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":36.967,"exit_code":0,"observations":[{"actual":[["r0"],[],[]],"check":"cancellation after partial acquisition","expected":[["r0"],[],[]],"passed":true},{"actual":[["r2","r1","r0"],[],[]],"check":"normal completion also cleans","expected":[["r2","r1","r0"],[],[]],"passed":true},{"actual":[["r2","r1","r0"],["r2"],["r2"]],"check":"one failure does not suppress rest","expected":[["r2","r1","r0"],["r2"],["r2"]],"passed":true},{"actual":[[],[],[]],"check":"cancel before first acquisition","expected":[[],[],[]],"passed":true},{"actual":[[],[],[]],"check":"nothing acquired","expected":[[],[],[]],"passed":true},{"actual":[["r2","r1","r0"],["r2","r0"],["r0","r2"]],"check":"multiple failures collected","expected":[["r2","r1","r0"],["r2","r0"],["r0","r2"]],"passed":true},{"actual":[["r0"],[],[]],"check":"unacquired failure irrelevant","expected":[["r0"],[],[]],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"cancellation after partial acquisition\", \"actual\": [[\"r0\"], [], []], \"expected\": [[\"r0\"], [], []], \"passed\": true}, {\"check\": \"normal completion also cleans\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [], []], \"expected\": [[\"r2\", \"r1\", \"r0\"], [], []], \"passed\": true}, {\"check\": \"one failure does not suppress rest\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [\"r2\"], [\"r2\"]], \"expected\": [[\"r2\", \"r1\", \"r0\"], [\"r2\"], [\"r2\"]], \"passed\": true}, {\"check\": \"cancel before first acquisition\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"nothing acquired\", \"actual\": [[], [], []], \"expected\": [[], [], []], \"passed\": true}, {\"check\": \"multiple failures collected\", \"actual\": [[\"r2\", \"r1\", \"r0\"], [\"r2\", \"r0\"], [\"r0\", \"r2\"]], \"expected\": [[\"r2\", \"r1\", \"r0\"], [\"r2\", \"r0\"], [\"r0\", \"r2\"]], \"passed\": true}, {\"check\": \"unacquired failure irrelevant\", \"actual\": [[\"r0\"], [], []], \"expected\": [[\"r0\"], [], []], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}