{"abstract":"Locked version drift is ignored.","category":"Dependency resolution","checks":7,"contract":"Report missing names, extra names, version mismatches, digest mismatches, and source mismatches as separate sorted lists. Only compare names present on both sides.","evaluation_group":"xt-lock-consistency","failed_approach":"The attempted repair substitutes wanted[n][0] == locked[n][0]. Fixture 4 still yields {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []} instead of {'missing': [], 'extra': [], 'version': ['a'], 'digest': [], 'source': []}.","family":"xt-lock-consistency-version-check","id":"FA-9441","implementations":{"attempt":{"sha256":"7d24fa01c4d01fafea20897e38cf5cd82da0d2caaf78a335c0c0df012298cfb0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(wanted, locked):\n    common = set(wanted) & set(locked)\n    return {\n     'missing': sorted(set(wanted) - set(locked)),\n     'extra': sorted(set(locked) - set(wanted)),\n     'version': sorted(n for n in common if wanted[n][0] == locked[n][0]),\n     'digest': sorted(n for n in common if wanted[n][1] != locked[n][1]),\n     'source': sorted(n for n in common if wanted[n][2] != locked[n][2])\n    }\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('fixture 1', solve({}, {}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 2', solve({'a': ('1', 'd', 'public')}, {}), {'missing': ['a'], 'extra': [], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 3', solve({}, {'b': ('1', 'd', 'public')}), {'missing': [], 'extra': ['b'], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 4', solve({'a': ('1', 'd', 'public')}, {'a': ('2', 'd', 'public')}), {'missing': [], 'extra': [], 'version': ['a'], 'digest': [], 'source': []})\ncheck('fixture 5', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'e', 'public')}), {'missing': [], 'extra': [], 'version': [], 'digest': ['a'], 'source': []})\ncheck('fixture 6', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'd', 'private')}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': ['a']})\ncheck('fixture 7', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'd', 'public')}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []})\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":"3ec47ace66984e4c2148efb4c8cb63552405a0db15dbb060580a1352cfb5a816","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(wanted, locked):\n    common = set(wanted) & set(locked)\n    return {\n     'missing': sorted(set(wanted) - set(locked)),\n     'extra': sorted(set(locked) - set(wanted)),\n     'version': sorted(n for n in common if False),\n     'digest': sorted(n for n in common if wanted[n][1] != locked[n][1]),\n     'source': sorted(n for n in common if wanted[n][2] != locked[n][2])\n    }\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('fixture 1', solve({}, {}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 2', solve({'a': ('1', 'd', 'public')}, {}), {'missing': ['a'], 'extra': [], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 3', solve({}, {'b': ('1', 'd', 'public')}), {'missing': [], 'extra': ['b'], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 4', solve({'a': ('1', 'd', 'public')}, {'a': ('2', 'd', 'public')}), {'missing': [], 'extra': [], 'version': ['a'], 'digest': [], 'source': []})\ncheck('fixture 5', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'e', 'public')}), {'missing': [], 'extra': [], 'version': [], 'digest': ['a'], 'source': []})\ncheck('fixture 6', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'd', 'private')}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': ['a']})\ncheck('fixture 7', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'd', 'public')}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []})\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":"6d068b8e742d9824d4234224771f4bbf5faf8b1df4b67e08124dfe59331b4905","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(wanted, locked):\n    common = set(wanted) & set(locked)\n    return {\n     'missing': sorted(set(wanted) - set(locked)),\n     'extra': sorted(set(locked) - set(wanted)),\n     'version': sorted(n for n in common if wanted[n][0] != locked[n][0]),\n     'digest': sorted(n for n in common if wanted[n][1] != locked[n][1]),\n     'source': sorted(n for n in common if wanted[n][2] != locked[n][2])\n    }\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncheck('fixture 1', solve({}, {}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 2', solve({'a': ('1', 'd', 'public')}, {}), {'missing': ['a'], 'extra': [], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 3', solve({}, {'b': ('1', 'd', 'public')}), {'missing': [], 'extra': ['b'], 'version': [], 'digest': [], 'source': []})\ncheck('fixture 4', solve({'a': ('1', 'd', 'public')}, {'a': ('2', 'd', 'public')}), {'missing': [], 'extra': [], 'version': ['a'], 'digest': [], 'source': []})\ncheck('fixture 5', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'e', 'public')}), {'missing': [], 'extra': [], 'version': [], 'digest': ['a'], 'source': []})\ncheck('fixture 6', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'd', 'private')}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': ['a']})\ncheck('fixture 7', solve({'a': ('1', 'd', 'public')}, {'a': ('1', 'd', 'public')}), {'missing': [], 'extra': [], 'version': [], 'digest': [], 'source': []})\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":"xt-lock-consistency-version-check","generated_at":"2026-09-29T14:38:29.930498+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline model of lockfile consistency report, suitable for testing build and release tooling without external services.","repair":"Compare locked and wanted versions.","root_cause":"The implementation substitutes False for wanted[n][0] != locked[n][0], so locked version drift is ignored.","sha256":"ca380cc939f3b6192289dc73fe0bdabaea2c3624f0cbe0191b8e8a2d8bbe7d83","title":"Lockfile consistency report: Locked version drift is ignored · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":37.53,"exit_code":1,"observations":[{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 1","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":["a"],"source":[],"version":[]},"check":"fixture 2","expected":{"digest":[],"extra":[],"missing":["a"],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":["b"],"missing":[],"source":[],"version":[]},"check":"fixture 3","expected":{"digest":[],"extra":["b"],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 4","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":["a"]},"passed":false},{"actual":{"digest":["a"],"extra":[],"missing":[],"source":[],"version":["a"]},"check":"fixture 5","expected":{"digest":["a"],"extra":[],"missing":[],"source":[],"version":[]},"passed":false},{"actual":{"digest":[],"extra":[],"missing":[],"source":["a"],"version":["a"]},"check":"fixture 6","expected":{"digest":[],"extra":[],"missing":[],"source":["a"],"version":[]},"passed":false},{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":["a"]},"check":"fixture 7","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fixture 1\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 2\", \"actual\": {\"missing\": [\"a\"], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [\"a\"], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 3\", \"actual\": {\"missing\": [], \"extra\": [\"b\"], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [\"b\"], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 4\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [], \"source\": []}, \"passed\": false}, {\"check\": \"fixture 5\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [\"a\"], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [\"a\"], \"source\": []}, \"passed\": false}, {\"check\": \"fixture 6\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [], \"source\": [\"a\"]}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": [\"a\"]}, \"passed\": false}, {\"check\": \"fixture 7\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.776,"exit_code":1,"observations":[{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 1","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":["a"],"source":[],"version":[]},"check":"fixture 2","expected":{"digest":[],"extra":[],"missing":["a"],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":["b"],"missing":[],"source":[],"version":[]},"check":"fixture 3","expected":{"digest":[],"extra":["b"],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 4","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":["a"]},"passed":false},{"actual":{"digest":["a"],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 5","expected":{"digest":["a"],"extra":[],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":["a"],"version":[]},"check":"fixture 6","expected":{"digest":[],"extra":[],"missing":[],"source":["a"],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 7","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fixture 1\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 2\", \"actual\": {\"missing\": [\"a\"], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [\"a\"], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 3\", \"actual\": {\"missing\": [], \"extra\": [\"b\"], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [\"b\"], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 4\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [], \"source\": []}, \"passed\": false}, {\"check\": \"fixture 5\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [\"a\"], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [\"a\"], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 6\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": [\"a\"]}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": [\"a\"]}, \"passed\": true}, {\"check\": \"fixture 7\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.322,"exit_code":0,"observations":[{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 1","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":["a"],"source":[],"version":[]},"check":"fixture 2","expected":{"digest":[],"extra":[],"missing":["a"],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":["b"],"missing":[],"source":[],"version":[]},"check":"fixture 3","expected":{"digest":[],"extra":["b"],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":["a"]},"check":"fixture 4","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":["a"]},"passed":true},{"actual":{"digest":["a"],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 5","expected":{"digest":["a"],"extra":[],"missing":[],"source":[],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":["a"],"version":[]},"check":"fixture 6","expected":{"digest":[],"extra":[],"missing":[],"source":["a"],"version":[]},"passed":true},{"actual":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"check":"fixture 7","expected":{"digest":[],"extra":[],"missing":[],"source":[],"version":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"fixture 1\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 2\", \"actual\": {\"missing\": [\"a\"], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [\"a\"], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 3\", \"actual\": {\"missing\": [], \"extra\": [\"b\"], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [\"b\"], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 4\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [\"a\"], \"digest\": [], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 5\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [\"a\"], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [\"a\"], \"source\": []}, \"passed\": true}, {\"check\": \"fixture 6\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": [\"a\"]}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": [\"a\"]}, \"passed\": true}, {\"check\": \"fixture 7\", \"actual\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"expected\": {\"missing\": [], \"extra\": [], \"version\": [], \"digest\": [], \"source\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}