{"abstract":"Conflict hunks lack the original text, contrary to the diff3 conflict style.","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":"Writing the base marker without the base lines still hides the original text.","family":"w2-text-diff-merge-diff3-chunk-merge-base-section","id":"FA-75456","implementations":{"attempt":{"sha256":"88885c6d9e606506b2853404b8883744175f563a41d12dd0e8ae24e81722b82c","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.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":"c9de53b998c16a684a08163ce2fbe301ad19018aa7938a925f47d131ccbeb657","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('=======')\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-base-section","generated_at":"2026-09-29T14:49:06.649760+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":"Render the base marker followed by the base lines between ours and theirs.","root_cause":"The conflict renderer writes only ours and theirs.","sha256":"ba6c7f58c5a451f75acc8a00ec8729bd6b7efe2a3df2d36ad8e607170f4e57bb","title":"diff3 chunk merge: conflicts omit the base section · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.979,"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","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","=======","Y",">>>>>>> theirs","d","e"]},"check":"conflicting edits","expected":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"passed":false},{"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\", \"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\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"passed\": false}, {\"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":45.111,"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","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","=======","Y",">>>>>>> theirs","d","e"]},"check":"conflicting edits","expected":{"conflicts":1,"merged":["a","b","<<<<<<< ours","X","||||||| base","c","=======","Y",">>>>>>> theirs","d","e"]},"passed":false},{"actual":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","=======","T",">>>>>>> theirs"]},"check":"changes after the last stable line","expected":{"conflicts":1,"merged":["a","b","c","d","e","<<<<<<< ours","o0","||||||| base","=======","T",">>>>>>> theirs"]},"passed":false},{"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\", \"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\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"<<<<<<< ours\", \"X\", \"||||||| base\", \"c\", \"=======\", \"Y\", \">>>>>>> theirs\", \"d\", \"e\"], \"conflicts\": 1}, \"passed\": false}, {\"check\": \"changes after the last stable line\", \"actual\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"expected\": {\"merged\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"<<<<<<< ours\", \"o0\", \"||||||| base\", \"=======\", \"T\", \">>>>>>> theirs\"], \"conflicts\": 1}, \"passed\": false}, {\"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"},"fixed":{"elapsed_ms":46.528,"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"}