{"abstract":"Edits from the other branch silently vanish when our side left the region untouched.","category":"Text diff and three-way merge","checks":9,"contract":"Match base against ours and against theirs with difflib.SequenceMatcher (autojunk off). Base lines matched on both sides are stable anchors. Between consecutive anchors (and after the last) compare the three regions: unchanged ours takes theirs, unchanged theirs takes ours, identical changes take ours, anything else is a conflict rendered as \"<<<<<<< ours\", ours, \"||||||| base\", base, \"=======\", theirs, \">>>>>>> theirs\". Return merged lines and the conflict count.","evaluation_group":"w2-text-diff-merge-diff3-chunk-merge","failed_approach":"Taking theirs only when it is non-empty still ignores deletions made on their side.","family":"w2-text-diff-merge-diff3-chunk-merge-one-sided-change","id":"FA-75441","implementations":{"attempt":{"sha256":"dfce89a7be150239a2f78009baf74deff2b32515dd48768cf92a1d1c23e601e9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport difflib\nN = 1\nobservations = []\ndef solve(base, ours, theirs):\n    def matches(x):\n        sm = difflib.SequenceMatcher(None, base, x, autojunk=False)\n        mp = {}\n        for i, j, size in sm.get_matching_blocks():\n            for t in range(size):\n                mp[i + t] = j + t\n        return mp\n    mo, mt = matches(ours), matches(theirs)\n    out = []\n    conflicts = 0\n    i = j = k = 0\n    anchors = [bi for bi in range(len(base)) if bi in mo and bi in mt] + [None]\n    for bi in anchors:\n        if bi is None:\n            i1, j1, k1 = len(base), len(ours), len(theirs)\n        else:\n            i1, j1, k1 = bi, mo[bi], mt[bi]\n        B, O, T = base[i:i1], ours[j:j1], theirs[k:k1]\n        if O == B:\n            out.extend(T if T else O)\n        elif T == B:\n            out.extend(O)\n        elif O == T:\n            out.extend(O)\n        else:\n            conflicts += 1\n            out.append('<<<<<<< ours')\n            out.extend(O)\n            out.append('||||||| base')\n            out.extend(B)\n            out.append('=======')\n            out.extend(T)\n            out.append('>>>>>>> theirs')\n        if bi is not None:\n            out.append(base[bi])\n            i, j, k = i1 + 1, j1 + 1, k1 + 1\n    return {'merged': out, 'conflicts': conflicts}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C1', 'd', 'e'], ['a', 'b', 'C1', 'd', 'e']], {'merged': ['a', 'b', 'C1', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    2: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C2', 'd', 'e'], ['a', 'b', 'C2', 'd', 'e']], {'merged': ['a', 'b', 'C2', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    3: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C3', 'd', 'e'], ['a', 'b', 'C3', 'd', 'e']], {'merged': ['a', 'b', 'C3', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    4: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C4', 'd', 'e'], ['a', 'b', 'C4', 'd', 'e']], {'merged': ['a', 'b', 'C4', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2', 'o3'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', 'o3', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    5: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C5', 'd', 'e'], ['a', 'b', 'C5', 'd', 'e']], {'merged': ['a', 'b', 'C5', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2', 'o3', 'o4'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', 'o3', 'o4', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3', 't4']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3', 't4'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\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":"75f88f6f25ed751aaafab0f92f3939cc7b39fc67f48bd326c25ed380bd3f12d1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport difflib\nN = 1\nobservations = []\ndef solve(base, ours, theirs):\n    def matches(x):\n        sm = difflib.SequenceMatcher(None, base, x, autojunk=False)\n        mp = {}\n        for i, j, size in sm.get_matching_blocks():\n            for t in range(size):\n                mp[i + t] = j + t\n        return mp\n    mo, mt = matches(ours), matches(theirs)\n    out = []\n    conflicts = 0\n    i = j = k = 0\n    anchors = [bi for bi in range(len(base)) if bi in mo and bi in mt] + [None]\n    for bi in anchors:\n        if bi is None:\n            i1, j1, k1 = len(base), len(ours), len(theirs)\n        else:\n            i1, j1, k1 = bi, mo[bi], mt[bi]\n        B, O, T = base[i:i1], ours[j:j1], theirs[k:k1]\n        if O == B:\n            out.extend(O)\n        elif T == B:\n            out.extend(O)\n        elif O == T:\n            out.extend(O)\n        else:\n            conflicts += 1\n            out.append('<<<<<<< ours')\n            out.extend(O)\n            out.append('||||||| base')\n            out.extend(B)\n            out.append('=======')\n            out.extend(T)\n            out.append('>>>>>>> theirs')\n        if bi is not None:\n            out.append(base[bi])\n            i, j, k = i1 + 1, j1 + 1, k1 + 1\n    return {'merged': out, 'conflicts': conflicts}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C1', 'd', 'e'], ['a', 'b', 'C1', 'd', 'e']], {'merged': ['a', 'b', 'C1', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    2: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C2', 'd', 'e'], ['a', 'b', 'C2', 'd', 'e']], {'merged': ['a', 'b', 'C2', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    3: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C3', 'd', 'e'], ['a', 'b', 'C3', 'd', 'e']], {'merged': ['a', 'b', 'C3', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    4: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C4', 'd', 'e'], ['a', 'b', 'C4', 'd', 'e']], {'merged': ['a', 'b', 'C4', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2', 'o3'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', 'o3', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    5: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C5', 'd', 'e'], ['a', 'b', 'C5', 'd', 'e']], {'merged': ['a', 'b', 'C5', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2', 'o3', 'o4'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', 'o3', 'o4', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3', 't4']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3', 't4'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\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":"49406ae7d09c60d0a236e21e0e5f54274ecae938b4d0f70dc9ac08aad069a425","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport difflib\nN = 1\nobservations = []\ndef solve(base, ours, theirs):\n    def matches(x):\n        sm = difflib.SequenceMatcher(None, base, x, autojunk=False)\n        mp = {}\n        for i, j, size in sm.get_matching_blocks():\n            for t in range(size):\n                mp[i + t] = j + t\n        return mp\n    mo, mt = matches(ours), matches(theirs)\n    out = []\n    conflicts = 0\n    i = j = k = 0\n    anchors = [bi for bi in range(len(base)) if bi in mo and bi in mt] + [None]\n    for bi in anchors:\n        if bi is None:\n            i1, j1, k1 = len(base), len(ours), len(theirs)\n        else:\n            i1, j1, k1 = bi, mo[bi], mt[bi]\n        B, O, T = base[i:i1], ours[j:j1], theirs[k:k1]\n        if O == B:\n            out.extend(T)\n        elif T == B:\n            out.extend(O)\n        elif O == T:\n            out.extend(O)\n        else:\n            conflicts += 1\n            out.append('<<<<<<< ours')\n            out.extend(O)\n            out.append('||||||| base')\n            out.extend(B)\n            out.append('=======')\n            out.extend(T)\n            out.append('>>>>>>> theirs')\n        if bi is not None:\n            out.append(base[bi])\n            i, j, k = i1 + 1, j1 + 1, k1 + 1\n    return {'merged': out, 'conflicts': conflicts}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C1', 'd', 'e'], ['a', 'b', 'C1', 'd', 'e']], {'merged': ['a', 'b', 'C1', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    2: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C2', 'd', 'e'], ['a', 'b', 'C2', 'd', 'e']], {'merged': ['a', 'b', 'C2', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    3: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C3', 'd', 'e'], ['a', 'b', 'C3', 'd', 'e']], {'merged': ['a', 'b', 'C3', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    4: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C4', 'd', 'e'], ['a', 'b', 'C4', 'd', 'e']], {'merged': ['a', 'b', 'C4', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2', 'o3'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', 'o3', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\n    5: [('only ours changed', [['a', 'b', 'c', 'd', 'e'], ['a', 'B', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e']], {'merged': ['a', 'B', 'c', 'd', 'e'], 'conflicts': 0}), ('only theirs deleted a line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'd', 'e']], {'merged': ['a', 'b', 'd', 'e'], 'conflicts': 0}), ('both made the same change', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'C5', 'd', 'e'], ['a', 'b', 'C5', 'd', 'e']], {'merged': ['a', 'b', 'C5', 'd', 'e'], 'conflicts': 0}), ('both deleted the same line', [['a', 'b', 'c', 'd', 'e'], ['a', 'c', 'd', 'e'], ['a', 'c', 'd', 'e']], {'merged': ['a', 'c', 'd', 'e'], 'conflicts': 0}), ('conflicting edits', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'X', 'd', 'e'], ['a', 'b', 'Y', 'd', 'e']], {'merged': ['a', 'b', '<<<<<<< ours', 'X', '||||||| base', 'c', '=======', 'Y', '>>>>>>> theirs', 'd', 'e'], 'conflicts': 1}), ('changes after the last stable line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 'o0', 'o1', 'o2', 'o3', 'o4'], ['a', 'b', 'c', 'd', 'e', 'T']], {'merged': ['a', 'b', 'c', 'd', 'e', '<<<<<<< ours', 'o0', 'o1', 'o2', 'o3', 'o4', '||||||| base', '=======', 'T', '>>>>>>> theirs'], 'conflicts': 1}), ('appended by one side only', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3', 't4']], {'merged': ['a', 'b', 'c', 'd', 'e', 't0', 't1', 't2', 't3', 't4'], 'conflicts': 0}), ('changes on both sides in different places', [['a', 'b', 'c', 'd', 'e'], ['A', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'D', 'e']], {'merged': ['A', 'b', 'c', 'D', 'e'], 'conflicts': 0}), ('theirs changes the last base line', [['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'e'], ['a', 'b', 'c', 'd', 'E']], {'merged': ['a', 'b', 'c', 'd', 'E'], 'conflicts': 0})],\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-diff3-chunk-merge-one-sided-change","generated_at":"2026-09-29T14:49:06.649239+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Three-way merge tools classify each region between stable lines to decide between clean merges and conflicts.","repair":"If ours is unchanged, take theirs for that region.","root_cause":"When ours equals base the merge copies ours instead of theirs.","sha256":"c11e4e411c4c44c743b7d434e5ccb72d2c5a15fb8b524e89803f9ba5e93ca8ab","title":"diff3 chunk merge: a change made only on their side is discarded · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":46.331,"exit_code":1,"observations":[{"actual":{"conflicts":0,"merged":["a","B","c","d","e"]},"check":"only ours changed","expected":{"conflicts":0,"merged":["a","B","c","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","e"]},"check":"only theirs deleted a line","expected":{"conflicts":0,"merged":["a","b","d","e"]},"passed":false},{"actual":{"conflicts":0,"merged":["a","b","C1","d","e"]},"check":"both made the same change","expected":{"conflicts":0,"merged":["a","b","C1","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","c","d","e"]},"check":"both deleted the same line","expected":{"conflicts":0,"merged":["a","c","d","e"]},"passed":true},{"actual":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"check":"conflicting edits","expected":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"passed":true},{"actual":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"check":"changes after the last stable line","expected":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","e","t0"]},"check":"appended by one side only","expected":{"conflicts":0,"merged":["a","b","c","d","e","t0"]},"passed":true},{"actual":{"conflicts":0,"merged":["A","b","c","D","e"]},"check":"changes on both sides in different places","expected":{"conflicts":0,"merged":["A","b","c","D","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","E"]},"check":"theirs changes the last base line","expected":{"conflicts":0,"merged":["a","b","c","d","E"]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"only ours changed\", \"actual\": {\"merged\": [\"a\", \"B\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"B\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"only theirs deleted a line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": false}, {\"check\": \"both made the same change\", \"actual\": {\"merged\": [\"a\", \"b\", \"C1\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"C1\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"both deleted the same line\", \"actual\": {\"merged\": [\"a\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"conflicting edits\", \"actual\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"passed\": true}, {\"check\": \"changes after the last stable line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"passed\": true}, {\"check\": \"appended by one side only\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"t0\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"t0\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"changes on both sides in different places\", \"actual\": {\"merged\": [\"A\", \"b\", \"c\", \"D\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"A\", \"b\", \"c\", \"D\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"theirs changes the last base line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"E\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"E\"], \"conflicts\": 0}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":46.517,"exit_code":1,"observations":[{"actual":{"conflicts":0,"merged":["a","B","c","d","e"]},"check":"only ours changed","expected":{"conflicts":0,"merged":["a","B","c","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","e"]},"check":"only theirs deleted a line","expected":{"conflicts":0,"merged":["a","b","d","e"]},"passed":false},{"actual":{"conflicts":0,"merged":["a","b","C1","d","e"]},"check":"both made the same change","expected":{"conflicts":0,"merged":["a","b","C1","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","c","d","e"]},"check":"both deleted the same line","expected":{"conflicts":0,"merged":["a","c","d","e"]},"passed":true},{"actual":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"check":"conflicting edits","expected":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"passed":true},{"actual":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"check":"changes after the last stable line","expected":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","e"]},"check":"appended by one side only","expected":{"conflicts":0,"merged":["a","b","c","d","e","t0"]},"passed":false},{"actual":{"conflicts":0,"merged":["A","b","c","d","e"]},"check":"changes on both sides in different places","expected":{"conflicts":0,"merged":["A","b","c","D","e"]},"passed":false},{"actual":{"conflicts":0,"merged":["a","b","c","d","e"]},"check":"theirs changes the last base line","expected":{"conflicts":0,"merged":["a","b","c","d","E"]},"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"only ours changed\", \"actual\": {\"merged\": [\"a\", \"B\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"B\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"only theirs deleted a line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": false}, {\"check\": \"both made the same change\", \"actual\": {\"merged\": [\"a\", \"b\", \"C1\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"C1\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"both deleted the same line\", \"actual\": {\"merged\": [\"a\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"conflicting edits\", \"actual\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"passed\": true}, {\"check\": \"changes after the last stable line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"passed\": true}, {\"check\": \"appended by one side only\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"t0\"], \"conflicts\": 0}, \"passed\": false}, {\"check\": \"changes on both sides in different places\", \"actual\": {\"merged\": [\"A\", \"b\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"A\", \"b\", \"c\", \"D\", \"e\"], \"conflicts\": 0}, \"passed\": false}, {\"check\": \"theirs changes the last base line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"E\"], \"conflicts\": 0}, \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":47.504,"exit_code":0,"observations":[{"actual":{"conflicts":0,"merged":["a","B","c","d","e"]},"check":"only ours changed","expected":{"conflicts":0,"merged":["a","B","c","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","d","e"]},"check":"only theirs deleted a line","expected":{"conflicts":0,"merged":["a","b","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","C1","d","e"]},"check":"both made the same change","expected":{"conflicts":0,"merged":["a","b","C1","d","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","c","d","e"]},"check":"both deleted the same line","expected":{"conflicts":0,"merged":["a","c","d","e"]},"passed":true},{"actual":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"check":"conflicting edits","expected":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"passed":true},{"actual":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"check":"changes after the last stable line","expected":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","e","t0"]},"check":"appended by one side only","expected":{"conflicts":0,"merged":["a","b","c","d","e","t0"]},"passed":true},{"actual":{"conflicts":0,"merged":["A","b","c","D","e"]},"check":"changes on both sides in different places","expected":{"conflicts":0,"merged":["A","b","c","D","e"]},"passed":true},{"actual":{"conflicts":0,"merged":["a","b","c","d","E"]},"check":"theirs changes the last base line","expected":{"conflicts":0,"merged":["a","b","c","d","E"]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"only ours changed\", \"actual\": {\"merged\": [\"a\", \"B\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"B\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"only theirs deleted a line\", \"actual\": {\"merged\": [\"a\", \"b\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"both made the same change\", \"actual\": {\"merged\": [\"a\", \"b\", \"C1\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"C1\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"both deleted the same line\", \"actual\": {\"merged\": [\"a\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"c\", \"d\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"conflicting edits\", \"actual\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"passed\": true}, {\"check\": \"changes after the last stable line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"passed\": true}, {\"check\": \"appended by one side only\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"t0\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"t0\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"changes on both sides in different places\", \"actual\": {\"merged\": [\"A\", \"b\", \"c\", \"D\", \"e\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"A\", \"b\", \"c\", \"D\", \"e\"], \"conflicts\": 0}, \"passed\": true}, {\"check\": \"theirs changes the last base line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"E\"], \"conflicts\": 0}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"E\"], \"conflicts\": 0}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}