{"abstract":"Unlinking the last name invalidates an open file.","category":"Filesystem semantics","checks":6,"contract":"Deterministic in-memory filesystem model. Given initial positive link count and nonnegative open count, remove one link; return [remaining links, whether inode survives].","evaluation_group":"model-01b7f2253fdfedc0","failed_approach":"Keeping files only when multiple descriptors exist loses the single remaining descriptor.","family":"z-filesystems-unlinked-open-inode","id":"FA-11541","implementations":{"attempt":{"sha256":"63c3de083da55b94dc637cecee8b5a7e56b8fe5bd7c4a2650d5e5f0e893dc03e","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(links, opens):\n    return [links-1, links-1 > 0 or opens > 1]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('one descriptor retains last unlinked inode', solve(1,1), [0,True])\ncheck('several descriptors retain inode', solve(1,N+1), [0,True])\ncheck('last reference removed', solve(1,0), [0,False])\ncheck('another name retains inode', solve(N+1,0), [N,True])\ncheck('names and descriptor retain inode', solve(N+1,1), [N,True])\ncheck('two links no descriptors', solve(2,0), [1,True])\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":"f87aca1496b8864b6794e273519740bc1fcfcf28928d084311f89da6f125953a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(links, opens):\n    return [links-1, links-1 > 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('one descriptor retains last unlinked inode', solve(1,1), [0,True])\ncheck('several descriptors retain inode', solve(1,N+1), [0,True])\ncheck('last reference removed', solve(1,0), [0,False])\ncheck('another name retains inode', solve(N+1,0), [N,True])\ncheck('names and descriptor retain inode', solve(N+1,1), [N,True])\ncheck('two links no descriptors', solve(2,0), [1,True])\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":"55dd7af11983bd946c314900bb646f21f249c4b9e976a8e3ad7a75008cb8c286","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(links, opens):\n    return [links-1, links-1 > 0 or opens > 0]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('one descriptor retains last unlinked inode', solve(1,1), [0,True])\ncheck('several descriptors retain inode', solve(1,N+1), [0,True])\ncheck('last reference removed', solve(1,0), [0,False])\ncheck('another name retains inode', solve(N+1,0), [N,True])\ncheck('names and descriptor retain inode', solve(N+1,1), [N,True])\ncheck('two links no descriptors', solve(2,0), [1,True])\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":"z-filesystems-unlinked-open-inode","generated_at":"2026-09-29T14:38:48.769769+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline semantic experiment for file API clients; it models only the stated operations, not a complete operating system.","repair":"Retain the inode while either a link or an open descriptor refers to it.","root_cause":"Object lifetime is equated with directory-name lifetime.","sha256":"49395aab9aedcd6cc2136c4c420f80fe006d82405506d874994b96a107bfe26e","title":"Unlinking the last name invalidates an open file · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.182,"exit_code":1,"observations":[{"actual":[0,false],"check":"one descriptor retains last unlinked inode","expected":[0,true],"passed":false},{"actual":[0,true],"check":"several descriptors retain inode","expected":[0,true],"passed":true},{"actual":[0,false],"check":"last reference removed","expected":[0,false],"passed":true},{"actual":[1,true],"check":"another name retains inode","expected":[1,true],"passed":true},{"actual":[1,true],"check":"names and descriptor retain inode","expected":[1,true],"passed":true},{"actual":[1,true],"check":"two links no descriptors","expected":[1,true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"one descriptor retains last unlinked inode\", \"actual\": [0, false], \"expected\": [0, true], \"passed\": false}, {\"check\": \"several descriptors retain inode\", \"actual\": [0, true], \"expected\": [0, true], \"passed\": true}, {\"check\": \"last reference removed\", \"actual\": [0, false], \"expected\": [0, false], \"passed\": true}, {\"check\": \"another name retains inode\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}, {\"check\": \"names and descriptor retain inode\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}, {\"check\": \"two links no descriptors\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.235,"exit_code":1,"observations":[{"actual":[0,false],"check":"one descriptor retains last unlinked inode","expected":[0,true],"passed":false},{"actual":[0,false],"check":"several descriptors retain inode","expected":[0,true],"passed":false},{"actual":[0,false],"check":"last reference removed","expected":[0,false],"passed":true},{"actual":[1,true],"check":"another name retains inode","expected":[1,true],"passed":true},{"actual":[1,true],"check":"names and descriptor retain inode","expected":[1,true],"passed":true},{"actual":[1,true],"check":"two links no descriptors","expected":[1,true],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"one descriptor retains last unlinked inode\", \"actual\": [0, false], \"expected\": [0, true], \"passed\": false}, {\"check\": \"several descriptors retain inode\", \"actual\": [0, false], \"expected\": [0, true], \"passed\": false}, {\"check\": \"last reference removed\", \"actual\": [0, false], \"expected\": [0, false], \"passed\": true}, {\"check\": \"another name retains inode\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}, {\"check\": \"names and descriptor retain inode\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}, {\"check\": \"two links no descriptors\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":36.605,"exit_code":0,"observations":[{"actual":[0,true],"check":"one descriptor retains last unlinked inode","expected":[0,true],"passed":true},{"actual":[0,true],"check":"several descriptors retain inode","expected":[0,true],"passed":true},{"actual":[0,false],"check":"last reference removed","expected":[0,false],"passed":true},{"actual":[1,true],"check":"another name retains inode","expected":[1,true],"passed":true},{"actual":[1,true],"check":"names and descriptor retain inode","expected":[1,true],"passed":true},{"actual":[1,true],"check":"two links no descriptors","expected":[1,true],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"one descriptor retains last unlinked inode\", \"actual\": [0, true], \"expected\": [0, true], \"passed\": true}, {\"check\": \"several descriptors retain inode\", \"actual\": [0, true], \"expected\": [0, true], \"passed\": true}, {\"check\": \"last reference removed\", \"actual\": [0, false], \"expected\": [0, false], \"passed\": true}, {\"check\": \"another name retains inode\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}, {\"check\": \"names and descriptor retain inode\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}, {\"check\": \"two links no descriptors\", \"actual\": [1, true], \"expected\": [1, true], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}