{"abstract":"New settings introduced on the other branch are missing after the merge.","category":"Text diff and three-way merge","checks":10,"contract":"Merge base, ours and theirs maps key by key over the union of keys; an absent key and a key holding null are different states. If ours and theirs agree, take that state; else if ours equals base take theirs; else if theirs equals base take ours; otherwise record a conflict and keep ours. Return sorted merged [key, value] pairs and sorted conflicting keys.","evaluation_group":"w2-text-diff-merge-keyvalue-three-way","failed_approach":"Using base and theirs drops keys added only on our branch.","family":"w2-text-diff-merge-keyvalue-three-way-key-universe","id":"FA-75671","implementations":{"attempt":{"sha256":"bfa3d180322b6011cb383b1c4806120598124682ed30917b4035982c38f551ca","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(base, ours, theirs):\n    MISSING = object()\n    merged, conflicts = {}, []\n    for k in sorted(set(base) | set(theirs)):\n        b = base.get(k, MISSING)\n        o = ours.get(k, MISSING)\n        t = theirs.get(k, MISSING)\n        if o == t:\n            r = o\n        elif o == b:\n            r = t\n        elif t == b:\n            r = o\n        else:\n            conflicts.append(k)\n            r = o\n        if r is not MISSING:\n            merged[k] = r\n    return {'merged': sorted([k, v] for k, v in merged.items()), 'conflicts': conflicts}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '81', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '81']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z1'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z1'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e1'}], {'merged': [['extra', 'e1'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm1'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm1'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    2: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '82', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '82']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z2'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z2'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e2'}], {'merged': [['extra', 'e2'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm2'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm2'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    3: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '83', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '83']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z3'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z3'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e3'}], {'merged': [['extra', 'e3'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm3'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm3'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    4: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '84', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '84']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z4'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z4'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e4'}], {'merged': [['extra', 'e4'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm4'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm4'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    5: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '85', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '85']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z5'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z5'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e5'}], {'merged': [['extra', 'e5'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm5'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm5'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n}[N]\nfor label, args, expected in cases:\n    check(label, solve(*args), expected)\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":"2fd292ab502f4c198c44a7fbe644075afbc3d8633a0e89e454d39b3e3a57f964","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(base, ours, theirs):\n    MISSING = object()\n    merged, conflicts = {}, []\n    for k in sorted(set(base) | set(ours)):\n        b = base.get(k, MISSING)\n        o = ours.get(k, MISSING)\n        t = theirs.get(k, MISSING)\n        if o == t:\n            r = o\n        elif o == b:\n            r = t\n        elif t == b:\n            r = o\n        else:\n            conflicts.append(k)\n            r = o\n        if r is not MISSING:\n            merged[k] = r\n    return {'merged': sorted([k, v] for k, v in merged.items()), 'conflicts': conflicts}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '81', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '81']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z1'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z1'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e1'}], {'merged': [['extra', 'e1'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm1'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm1'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    2: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '82', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '82']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z2'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z2'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e2'}], {'merged': [['extra', 'e2'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm2'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm2'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    3: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '83', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '83']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z3'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z3'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e3'}], {'merged': [['extra', 'e3'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm3'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm3'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    4: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '84', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '84']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z4'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z4'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e4'}], {'merged': [['extra', 'e4'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm4'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm4'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    5: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '85', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '85']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z5'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z5'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e5'}], {'merged': [['extra', 'e5'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm5'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm5'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n}[N]\nfor label, args, expected in cases:\n    check(label, solve(*args), expected)\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":"8d90e3af1313999b155a9ede11ce8e2147e1a6712b46c8e934df371b31dd4764","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(base, ours, theirs):\n    MISSING = object()\n    merged, conflicts = {}, []\n    for k in sorted(set(base) | set(ours) | set(theirs)):\n        b = base.get(k, MISSING)\n        o = ours.get(k, MISSING)\n        t = theirs.get(k, MISSING)\n        if o == t:\n            r = o\n        elif o == b:\n            r = t\n        elif t == b:\n            r = o\n        else:\n            conflicts.append(k)\n            r = o\n        if r is not MISSING:\n            merged[k] = r\n    return {'merged': sorted([k, v] for k, v in merged.items()), 'conflicts': conflicts}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '81', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '81']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z1'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z1'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e1'}], {'merged': [['extra', 'e1'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm1'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm1'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    2: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '82', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '82']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z2'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z2'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e2'}], {'merged': [['extra', 'e2'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm2'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm2'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    3: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '83', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '83']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z3'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z3'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e3'}], {'merged': [['extra', 'e3'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm3'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm3'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    4: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '84', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '84']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z4'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z4'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e4'}], {'merged': [['extra', 'e4'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm4'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm4'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n    5: [('each side changes a different key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'b', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '85', 'mode': 'x'}], {'merged': [['host', 'b'], ['mode', 'x'], ['port', '85']], 'conflicts': []}), ('both change a key the same way', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'y'}, {'host': 'a', 'port': '80', 'mode': 'y'}], {'merged': [['host', 'a'], ['mode', 'y'], ['port', '80']], 'conflicts': []}), ('both delete the same key', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['port', '80']], 'conflicts': []}), ('conflicting changes keep ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '1', 'mode': 'x'}, {'host': 'a', 'port': '2', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x'], ['port', '1']], 'conflicts': ['port']}), ('delete versus modify conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'z5'}, {'host': 'a', 'port': '80'}], {'merged': [['host', 'a'], ['mode', 'z5'], ['port', '80']], 'conflicts': ['mode']}), ('explicit null differs from deletion', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': None}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', None], ['port', '80']], 'conflicts': []}), ('key added only by theirs', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'extra': 'e5'}], {'merged': [['extra', 'e5'], ['host', 'a'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('key added only by ours', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'port': '80', 'mode': 'x', 'mine': 'm5'}, {'host': 'a', 'port': '80', 'mode': 'x'}], {'merged': [['host', 'a'], ['mine', 'm5'], ['mode', 'x'], ['port', '80']], 'conflicts': []}), ('modify versus delete conflicts', [{'host': 'a', 'port': '80', 'mode': 'x'}, {'host': 'a', 'mode': 'x'}, {'host': 'a', 'port': '443', 'mode': 'x'}], {'merged': [['host', 'a'], ['mode', 'x']], 'conflicts': ['port']}), ('null in base and deleted by ours', [{'k': None, 'j': '1'}, {'j': '1'}, {'k': None, 'j': '2'}], {'merged': [['j', '2']], 'conflicts': []})],\n}[N]\nfor label, args, expected in cases:\n    check(label, solve(*args), expected)\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":"A deterministic, bounded teaching model of one diff, patch or merge rule with stipulated conventions; it is not a production diff or version-control implementation and makes no claim of conformance to any specific tool. 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":"w2-text-diff-merge-keyvalue-three-way-key-universe","generated_at":"2026-09-29T14:49:09.032107+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Structured configuration and lock files are merged per key, where deletions and null values must stay distinguishable.","repair":"Iterate over the union of keys from base, ours and theirs.","root_cause":"The key universe is built from base and ours only.","sha256":"27c94ef03e02bb6d29f5e1b95c5544915080e5f32b6d7cce7ca3c03e0295236c","title":"Three-way key-value merge: keys added only by their branch are dropped · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.574,"exit_code":1,"observations":[{"actual":{"conflicts":[],"merged":[["host","b"],["mode","x"],["port","81"]]},"check":"each side changes a different key","expected":{"conflicts":[],"merged":[["host","b"],["mode","x"],["port","81"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode","y"],["port","80"]]},"check":"both change a key the same way","expected":{"conflicts":[],"merged":[["host","a"],["mode","y"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["port","80"]]},"check":"both delete the same key","expected":{"conflicts":[],"merged":[["host","a"],["port","80"]]},"passed":true},{"actual":{"conflicts":["port"],"merged":[["host","a"],["mode","x"],["port","1"]]},"check":"conflicting changes keep ours","expected":{"conflicts":["port"],"merged":[["host","a"],["mode","x"],["port","1"]]},"passed":true},{"actual":{"conflicts":["mode"],"merged":[["host","a"],["mode","z1"],["port","80"]]},"check":"delete versus modify conflicts","expected":{"conflicts":["mode"],"merged":[["host","a"],["mode","z1"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode",null],["port","80"]]},"check":"explicit null differs from deletion","expected":{"conflicts":[],"merged":[["host","a"],["mode",null],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["extra","e1"],["host","a"],["mode","x"],["port","80"]]},"check":"key added only by theirs","expected":{"conflicts":[],"merged":[["extra","e1"],["host","a"],["mode","x"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode","x"],["port","80"]]},"check":"key added only by ours","expected":{"conflicts":[],"merged":[["host","a"],["mine","m1"],["mode","x"],["port","80"]]},"passed":false},{"actual":{"conflicts":["port"],"merged":[["host","a"],["mode","x"]]},"check":"modify versus delete conflicts","expected":{"conflicts":["port"],"merged":[["host","a"],["mode","x"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["j","2"]]},"check":"null in base and deleted by ours","expected":{"conflicts":[],"merged":[["j","2"]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"each side changes a different key\", \"actual\": {\"merged\": [[\"host\", \"b\"], [\"mode\", \"x\"], [\"port\", \"81\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"b\"], [\"mode\", \"x\"], [\"port\", \"81\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"both change a key the same way\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"y\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"y\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"both delete the same key\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"conflicting changes keep ours\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"1\"]], \"conflicts\": [\"port\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"1\"]], \"conflicts\": [\"port\"]}, \"passed\": true}, {\"check\": \"delete versus modify conflicts\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"z1\"], [\"port\", \"80\"]], \"conflicts\": [\"mode\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"z1\"], [\"port\", \"80\"]], \"conflicts\": [\"mode\"]}, \"passed\": true}, {\"check\": \"explicit null differs from deletion\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", null], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", null], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"key added only by theirs\", \"actual\": {\"merged\": [[\"extra\", \"e1\"], [\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"extra\", \"e1\"], [\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"key added only by ours\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mine\", \"m1\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": false}, {\"check\": \"modify versus delete conflicts\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"]], \"conflicts\": [\"port\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"]], \"conflicts\": [\"port\"]}, \"passed\": true}, {\"check\": \"null in base and deleted by ours\", \"actual\": {\"merged\": [[\"j\", \"2\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"j\", \"2\"]], \"conflicts\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.691,"exit_code":1,"observations":[{"actual":{"conflicts":[],"merged":[["host","b"],["mode","x"],["port","81"]]},"check":"each side changes a different key","expected":{"conflicts":[],"merged":[["host","b"],["mode","x"],["port","81"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode","y"],["port","80"]]},"check":"both change a key the same way","expected":{"conflicts":[],"merged":[["host","a"],["mode","y"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["port","80"]]},"check":"both delete the same key","expected":{"conflicts":[],"merged":[["host","a"],["port","80"]]},"passed":true},{"actual":{"conflicts":["port"],"merged":[["host","a"],["mode","x"],["port","1"]]},"check":"conflicting changes keep ours","expected":{"conflicts":["port"],"merged":[["host","a"],["mode","x"],["port","1"]]},"passed":true},{"actual":{"conflicts":["mode"],"merged":[["host","a"],["mode","z1"],["port","80"]]},"check":"delete versus modify conflicts","expected":{"conflicts":["mode"],"merged":[["host","a"],["mode","z1"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode",null],["port","80"]]},"check":"explicit null differs from deletion","expected":{"conflicts":[],"merged":[["host","a"],["mode",null],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode","x"],["port","80"]]},"check":"key added only by theirs","expected":{"conflicts":[],"merged":[["extra","e1"],["host","a"],["mode","x"],["port","80"]]},"passed":false},{"actual":{"conflicts":[],"merged":[["host","a"],["mine","m1"],["mode","x"],["port","80"]]},"check":"key added only by ours","expected":{"conflicts":[],"merged":[["host","a"],["mine","m1"],["mode","x"],["port","80"]]},"passed":true},{"actual":{"conflicts":["port"],"merged":[["host","a"],["mode","x"]]},"check":"modify versus delete conflicts","expected":{"conflicts":["port"],"merged":[["host","a"],["mode","x"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["j","2"]]},"check":"null in base and deleted by ours","expected":{"conflicts":[],"merged":[["j","2"]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"each side changes a different key\", \"actual\": {\"merged\": [[\"host\", \"b\"], [\"mode\", \"x\"], [\"port\", \"81\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"b\"], [\"mode\", \"x\"], [\"port\", \"81\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"both change a key the same way\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"y\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"y\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"both delete the same key\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"conflicting changes keep ours\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"1\"]], \"conflicts\": [\"port\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"1\"]], \"conflicts\": [\"port\"]}, \"passed\": true}, {\"check\": \"delete versus modify conflicts\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"z1\"], [\"port\", \"80\"]], \"conflicts\": [\"mode\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"z1\"], [\"port\", \"80\"]], \"conflicts\": [\"mode\"]}, \"passed\": true}, {\"check\": \"explicit null differs from deletion\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", null], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", null], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"key added only by theirs\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"extra\", \"e1\"], [\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": false}, {\"check\": \"key added only by ours\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mine\", \"m1\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mine\", \"m1\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"modify versus delete conflicts\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"]], \"conflicts\": [\"port\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"]], \"conflicts\": [\"port\"]}, \"passed\": true}, {\"check\": \"null in base and deleted by ours\", \"actual\": {\"merged\": [[\"j\", \"2\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"j\", \"2\"]], \"conflicts\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.908,"exit_code":0,"observations":[{"actual":{"conflicts":[],"merged":[["host","b"],["mode","x"],["port","81"]]},"check":"each side changes a different key","expected":{"conflicts":[],"merged":[["host","b"],["mode","x"],["port","81"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode","y"],["port","80"]]},"check":"both change a key the same way","expected":{"conflicts":[],"merged":[["host","a"],["mode","y"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["port","80"]]},"check":"both delete the same key","expected":{"conflicts":[],"merged":[["host","a"],["port","80"]]},"passed":true},{"actual":{"conflicts":["port"],"merged":[["host","a"],["mode","x"],["port","1"]]},"check":"conflicting changes keep ours","expected":{"conflicts":["port"],"merged":[["host","a"],["mode","x"],["port","1"]]},"passed":true},{"actual":{"conflicts":["mode"],"merged":[["host","a"],["mode","z1"],["port","80"]]},"check":"delete versus modify conflicts","expected":{"conflicts":["mode"],"merged":[["host","a"],["mode","z1"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mode",null],["port","80"]]},"check":"explicit null differs from deletion","expected":{"conflicts":[],"merged":[["host","a"],["mode",null],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["extra","e1"],["host","a"],["mode","x"],["port","80"]]},"check":"key added only by theirs","expected":{"conflicts":[],"merged":[["extra","e1"],["host","a"],["mode","x"],["port","80"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["host","a"],["mine","m1"],["mode","x"],["port","80"]]},"check":"key added only by ours","expected":{"conflicts":[],"merged":[["host","a"],["mine","m1"],["mode","x"],["port","80"]]},"passed":true},{"actual":{"conflicts":["port"],"merged":[["host","a"],["mode","x"]]},"check":"modify versus delete conflicts","expected":{"conflicts":["port"],"merged":[["host","a"],["mode","x"]]},"passed":true},{"actual":{"conflicts":[],"merged":[["j","2"]]},"check":"null in base and deleted by ours","expected":{"conflicts":[],"merged":[["j","2"]]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"each side changes a different key\", \"actual\": {\"merged\": [[\"host\", \"b\"], [\"mode\", \"x\"], [\"port\", \"81\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"b\"], [\"mode\", \"x\"], [\"port\", \"81\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"both change a key the same way\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"y\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"y\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"both delete the same key\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"conflicting changes keep ours\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"1\"]], \"conflicts\": [\"port\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"1\"]], \"conflicts\": [\"port\"]}, \"passed\": true}, {\"check\": \"delete versus modify conflicts\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"z1\"], [\"port\", \"80\"]], \"conflicts\": [\"mode\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"z1\"], [\"port\", \"80\"]], \"conflicts\": [\"mode\"]}, \"passed\": true}, {\"check\": \"explicit null differs from deletion\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", null], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", null], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"key added only by theirs\", \"actual\": {\"merged\": [[\"extra\", \"e1\"], [\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"extra\", \"e1\"], [\"host\", \"a\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"key added only by ours\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mine\", \"m1\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mine\", \"m1\"], [\"mode\", \"x\"], [\"port\", \"80\"]], \"conflicts\": []}, \"passed\": true}, {\"check\": \"modify versus delete conflicts\", \"actual\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"]], \"conflicts\": [\"port\"]}, \"expected\": {\"merged\": [[\"host\", \"a\"], [\"mode\", \"x\"]], \"conflicts\": [\"port\"]}, \"passed\": true}, {\"check\": \"null in base and deleted by ours\", \"actual\": {\"merged\": [[\"j\", \"2\"]], \"conflicts\": []}, \"expected\": {\"merged\": [[\"j\", \"2\"]], \"conflicts\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}