{"abstract":"The table column span end result violates the stipulated merged cell rendering contract.","category":"Table interactions","checks":6,"contract":"Merged rectangles are expressed in source coordinates, clipped to source bounds and visible rows/columns, rebased to the first visible cell, and accepted in declaration order only if disjoint; plain cells omit every accepted merged cell.","evaluation_group":"s3-table-interactions-merged-cells","failed_approach":"The attempted repair \"a['c']+a['cs']+1\" still loses a required part of the table contract.","family":"s3-table-interactions-merged-cells-column-span-end","id":"FA-37006","implementations":{"attempt":{"sha256":"ff910eb67224ee75d5efc3332160f610ca9d0f335b8ef9f0977ee8ccdf2302a8","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rows, cols, anchors, hidden_rows, hidden_cols):\n    vr=[r for r in rows if r not in hidden_rows]\n    vc=[c for c in cols if c not in hidden_cols]\n    result=[]\n    covered=set()\n    for a in anchors:\n        rr=[r for r in rows[a['r']:a['r']+a['rs']] if r in vr]\n        cc=[c for c in cols[a['c']:a['c']+a['cs']+1] if c in vc]\n        if not rr or not cc: continue\n        cells={(r,c) for r in rr for c in cc}\n        if cells & covered: continue\n        covered |= cells\n        result.append({'anchor':[rr[0],cc[0]],'rowspan':len(rr),'colspan':len(cc),'value':a['value'],'covered':sorted(cells-{(rr[0],cc[0])})})\n    return {'merges':result,'plain':[(r,c) for r in vr for c in vc if (r,c) not in covered]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':1}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 1, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 2:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':2}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 2, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 3:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':3}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 3, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 4:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':4}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 4, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 5:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':5}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 5, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\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":"5b9bca258c15112901ddc09f4a3abe2802720aeebbad617d6fc77f730e040e78","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rows, cols, anchors, hidden_rows, hidden_cols):\n    vr=[r for r in rows if r not in hidden_rows]\n    vc=[c for c in cols if c not in hidden_cols]\n    result=[]\n    covered=set()\n    for a in anchors:\n        rr=[r for r in rows[a['r']:a['r']+a['rs']] if r in vr]\n        cc=[c for c in cols[a['c']:a['cs']] if c in vc]\n        if not rr or not cc: continue\n        cells={(r,c) for r in rr for c in cc}\n        if cells & covered: continue\n        covered |= cells\n        result.append({'anchor':[rr[0],cc[0]],'rowspan':len(rr),'colspan':len(cc),'value':a['value'],'covered':sorted(cells-{(rr[0],cc[0])})})\n    return {'merges':result,'plain':[(r,c) for r in vr for c in vc if (r,c) not in covered]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':1}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 1, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 2:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':2}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 2, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 3:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':3}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 3, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 4:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':4}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 4, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 5:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':5}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 5, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\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":"513f2c9a9c3a7ad3daec07864c3318145a8c6c8920526982202f2d1a99aaec6f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rows, cols, anchors, hidden_rows, hidden_cols):\n    vr=[r for r in rows if r not in hidden_rows]\n    vc=[c for c in cols if c not in hidden_cols]\n    result=[]\n    covered=set()\n    for a in anchors:\n        rr=[r for r in rows[a['r']:a['r']+a['rs']] if r in vr]\n        cc=[c for c in cols[a['c']:a['c']+a['cs']] if c in vc]\n        if not rr or not cc: continue\n        cells={(r,c) for r in rr for c in cc}\n        if cells & covered: continue\n        covered |= cells\n        result.append({'anchor':[rr[0],cc[0]],'rowspan':len(rr),'colspan':len(cc),'value':a['value'],'covered':sorted(cells-{(rr[0],cc[0])})})\n    return {'merges':result,'plain':[(r,c) for r in vr for c in vc if (r,c) not in covered]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':1}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 1, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 2:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':2}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 2, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 3:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':3}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 3, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 4:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':4}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 4, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\nif N == 5:\n    check('nonzero origin', solve(['r0','r1','r2','r3'], ['a','b','c','d'], [{'r':1,'c':1,'rs':2,'cs':2,'value':5}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 2, 'colspan': 2, 'value': 5, 'covered': [('r1', 'c'), ('r2', 'b'), ('r2', 'c')]}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r0', 'c'), ('r0', 'd'), ('r1', 'a'), ('r1', 'd'), ('r2', 'a'), ('r2', 'd'), ('r3', 'a'), ('r3', 'b'), ('r3', 'c'), ('r3', 'd')]})\n    check('hidden anchor', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':3,'cs':3,'value':'x'}], ['r0','r1'], ['a','b']), {'merges': [{'anchor': ['r2', 'c'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': []})\n    check('partial overlap', solve(['r0','r1','r2'], ['a','b','c'], [{'r':0,'c':0,'rs':2,'cs':2,'value':'x'},{'r':1,'c':1,'rs':2,'cs':2,'value':'y'}], [], []), {'merges': [{'anchor': ['r0', 'a'], 'rowspan': 2, 'colspan': 2, 'value': 'x', 'covered': [('r0', 'b'), ('r1', 'a'), ('r1', 'b')]}], 'plain': [('r0', 'c'), ('r1', 'c'), ('r2', 'a'), ('r2', 'b'), ('r2', 'c')]})\n    check('hidden merge', solve(['r0'], ['a'], [{'r':0,'c':0,'rs':1,'cs':1,'value':'x'}], ['r0'], []), {'merges': [], 'plain': []})\n    check('clamped span', solve(['r0','r1'], ['a','b'], [{'r':1,'c':1,'rs':4,'cs':4,'value':'x'}], [], []), {'merges': [{'anchor': ['r1', 'b'], 'rowspan': 1, 'colspan': 1, 'value': 'x', 'covered': []}], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a')]})\n    check('unmerged grid', solve(['r0','r1'], ['a','b'], [], [], []), {'merges': [], 'plain': [('r0', 'a'), ('r0', 'b'), ('r1', 'a'), ('r1', 'b')]})\n\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":"Source axes have unique IDs; anchor origins are valid source indices and spans are positive integers. Deterministic offline table UI model; no browser, DOM, framework, or standards conformance is claimed. 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":"s3-table-interactions-merged-cells-column-span-end","generated_at":"2026-09-29T14:42:56.951339+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates merged cell rendering, including adversarial row/column relationships.","repair":"Apply the complete column span end rule: a['c']+a['cs'].","root_cause":"The column span end decision uses \"a['cs']\" instead of \"a['c']+a['cs']\".","sha256":"46e2ff66f786060e621d848be6b882337af77297caaf6d50e2a893bec1ba5f11","title":"Merged cell rendering: column span end · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.868,"exit_code":1,"observations":[{"actual":{"merges":[{"anchor":["r1","b"],"colspan":3,"covered":[["r1","c"],["r1","d"],["r2","b"],["r2","c"],["r2","d"]],"rowspan":2,"value":1}],"plain":[["r0","a"],["r0","b"],["r0","c"],["r0","d"],["r1","a"],["r2","a"],["r3","a"],["r3","b"],["r3","c"],["r3","d"]]},"check":"nonzero origin","expected":{"merges":[{"anchor":["r1","b"],"colspan":2,"covered":[["r1","c"],["r2","b"],["r2","c"]],"rowspan":2,"value":1}],"plain":[["r0","a"],["r0","b"],["r0","c"],["r0","d"],["r1","a"],["r1","d"],["r2","a"],["r2","d"],["r3","a"],["r3","b"],["r3","c"],["r3","d"]]},"passed":false},{"actual":{"merges":[{"anchor":["r2","c"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[]},"check":"hidden anchor","expected":{"merges":[{"anchor":["r2","c"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[]},"passed":true},{"actual":{"merges":[{"anchor":["r0","a"],"colspan":3,"covered":[["r0","b"],["r0","c"],["r1","a"],["r1","b"],["r1","c"]],"rowspan":2,"value":"x"}],"plain":[["r2","a"],["r2","b"],["r2","c"]]},"check":"partial overlap","expected":{"merges":[{"anchor":["r0","a"],"colspan":2,"covered":[["r0","b"],["r1","a"],["r1","b"]],"rowspan":2,"value":"x"}],"plain":[["r0","c"],["r1","c"],["r2","a"],["r2","b"],["r2","c"]]},"passed":false},{"actual":{"merges":[],"plain":[]},"check":"hidden merge","expected":{"merges":[],"plain":[]},"passed":true},{"actual":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[["r0","a"],["r0","b"],["r1","a"]]},"check":"clamped span","expected":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[["r0","a"],["r0","b"],["r1","a"]]},"passed":true},{"actual":{"merges":[],"plain":[["r0","a"],["r0","b"],["r1","a"],["r1","b"]]},"check":"unmerged grid","expected":{"merges":[],"plain":[["r0","a"],["r0","b"],["r1","a"],["r1","b"]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"nonzero origin\", \"actual\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 2, \"colspan\": 3, \"value\": 1, \"covered\": [[\"r1\", \"c\"], [\"r1\", \"d\"], [\"r2\", \"b\"], [\"r2\", \"c\"], [\"r2\", \"d\"]]}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r0\", \"c\"], [\"r0\", \"d\"], [\"r1\", \"a\"], [\"r2\", \"a\"], [\"r3\", \"a\"], [\"r3\", \"b\"], [\"r3\", \"c\"], [\"r3\", \"d\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 2, \"colspan\": 2, \"value\": 1, \"covered\": [[\"r1\", \"c\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r0\", \"c\"], [\"r0\", \"d\"], [\"r1\", \"a\"], [\"r1\", \"d\"], [\"r2\", \"a\"], [\"r2\", \"d\"], [\"r3\", \"a\"], [\"r3\", \"b\"], [\"r3\", \"c\"], [\"r3\", \"d\"]]}, \"passed\": false}, {\"check\": \"hidden anchor\", \"actual\": {\"merges\": [{\"anchor\": [\"r2\", \"c\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": []}, \"expected\": {\"merges\": [{\"anchor\": [\"r2\", \"c\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": []}, \"passed\": true}, {\"check\": \"partial overlap\", \"actual\": {\"merges\": [{\"anchor\": [\"r0\", \"a\"], \"rowspan\": 2, \"colspan\": 3, \"value\": \"x\", \"covered\": [[\"r0\", \"b\"], [\"r0\", \"c\"], [\"r1\", \"a\"], [\"r1\", \"b\"], [\"r1\", \"c\"]]}], \"plain\": [[\"r2\", \"a\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r0\", \"a\"], \"rowspan\": 2, \"colspan\": 2, \"value\": \"x\", \"covered\": [[\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}], \"plain\": [[\"r0\", \"c\"], [\"r1\", \"c\"], [\"r2\", \"a\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}, \"passed\": false}, {\"check\": \"hidden merge\", \"actual\": {\"merges\": [], \"plain\": []}, \"expected\": {\"merges\": [], \"plain\": []}, \"passed\": true}, {\"check\": \"clamped span\", \"actual\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"]]}, \"passed\": true}, {\"check\": \"unmerged grid\", \"actual\": {\"merges\": [], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}, \"expected\": {\"merges\": [], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.581,"exit_code":1,"observations":[{"actual":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[["r2","b"]],"rowspan":2,"value":1}],"plain":[["r0","a"],["r0","b"],["r0","c"],["r0","d"],["r1","a"],["r1","c"],["r1","d"],["r2","a"],["r2","c"],["r2","d"],["r3","a"],["r3","b"],["r3","c"],["r3","d"]]},"check":"nonzero origin","expected":{"merges":[{"anchor":["r1","b"],"colspan":2,"covered":[["r1","c"],["r2","b"],["r2","c"]],"rowspan":2,"value":1}],"plain":[["r0","a"],["r0","b"],["r0","c"],["r0","d"],["r1","a"],["r1","d"],["r2","a"],["r2","d"],["r3","a"],["r3","b"],["r3","c"],["r3","d"]]},"passed":false},{"actual":{"merges":[{"anchor":["r2","c"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[]},"check":"hidden anchor","expected":{"merges":[{"anchor":["r2","c"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[]},"passed":true},{"actual":{"merges":[{"anchor":["r0","a"],"colspan":2,"covered":[["r0","b"],["r1","a"],["r1","b"]],"rowspan":2,"value":"x"}],"plain":[["r0","c"],["r1","c"],["r2","a"],["r2","b"],["r2","c"]]},"check":"partial overlap","expected":{"merges":[{"anchor":["r0","a"],"colspan":2,"covered":[["r0","b"],["r1","a"],["r1","b"]],"rowspan":2,"value":"x"}],"plain":[["r0","c"],["r1","c"],["r2","a"],["r2","b"],["r2","c"]]},"passed":true},{"actual":{"merges":[],"plain":[]},"check":"hidden merge","expected":{"merges":[],"plain":[]},"passed":true},{"actual":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[["r0","a"],["r0","b"],["r1","a"]]},"check":"clamped span","expected":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[["r0","a"],["r0","b"],["r1","a"]]},"passed":true},{"actual":{"merges":[],"plain":[["r0","a"],["r0","b"],["r1","a"],["r1","b"]]},"check":"unmerged grid","expected":{"merges":[],"plain":[["r0","a"],["r0","b"],["r1","a"],["r1","b"]]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"nonzero origin\", \"actual\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 2, \"colspan\": 1, \"value\": 1, \"covered\": [[\"r2\", \"b\"]]}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r0\", \"c\"], [\"r0\", \"d\"], [\"r1\", \"a\"], [\"r1\", \"c\"], [\"r1\", \"d\"], [\"r2\", \"a\"], [\"r2\", \"c\"], [\"r2\", \"d\"], [\"r3\", \"a\"], [\"r3\", \"b\"], [\"r3\", \"c\"], [\"r3\", \"d\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 2, \"colspan\": 2, \"value\": 1, \"covered\": [[\"r1\", \"c\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r0\", \"c\"], [\"r0\", \"d\"], [\"r1\", \"a\"], [\"r1\", \"d\"], [\"r2\", \"a\"], [\"r2\", \"d\"], [\"r3\", \"a\"], [\"r3\", \"b\"], [\"r3\", \"c\"], [\"r3\", \"d\"]]}, \"passed\": false}, {\"check\": \"hidden anchor\", \"actual\": {\"merges\": [{\"anchor\": [\"r2\", \"c\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": []}, \"expected\": {\"merges\": [{\"anchor\": [\"r2\", \"c\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": []}, \"passed\": true}, {\"check\": \"partial overlap\", \"actual\": {\"merges\": [{\"anchor\": [\"r0\", \"a\"], \"rowspan\": 2, \"colspan\": 2, \"value\": \"x\", \"covered\": [[\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}], \"plain\": [[\"r0\", \"c\"], [\"r1\", \"c\"], [\"r2\", \"a\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r0\", \"a\"], \"rowspan\": 2, \"colspan\": 2, \"value\": \"x\", \"covered\": [[\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}], \"plain\": [[\"r0\", \"c\"], [\"r1\", \"c\"], [\"r2\", \"a\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}, \"passed\": true}, {\"check\": \"hidden merge\", \"actual\": {\"merges\": [], \"plain\": []}, \"expected\": {\"merges\": [], \"plain\": []}, \"passed\": true}, {\"check\": \"clamped span\", \"actual\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"]]}, \"passed\": true}, {\"check\": \"unmerged grid\", \"actual\": {\"merges\": [], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}, \"expected\": {\"merges\": [], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":46.089,"exit_code":0,"observations":[{"actual":{"merges":[{"anchor":["r1","b"],"colspan":2,"covered":[["r1","c"],["r2","b"],["r2","c"]],"rowspan":2,"value":1}],"plain":[["r0","a"],["r0","b"],["r0","c"],["r0","d"],["r1","a"],["r1","d"],["r2","a"],["r2","d"],["r3","a"],["r3","b"],["r3","c"],["r3","d"]]},"check":"nonzero origin","expected":{"merges":[{"anchor":["r1","b"],"colspan":2,"covered":[["r1","c"],["r2","b"],["r2","c"]],"rowspan":2,"value":1}],"plain":[["r0","a"],["r0","b"],["r0","c"],["r0","d"],["r1","a"],["r1","d"],["r2","a"],["r2","d"],["r3","a"],["r3","b"],["r3","c"],["r3","d"]]},"passed":true},{"actual":{"merges":[{"anchor":["r2","c"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[]},"check":"hidden anchor","expected":{"merges":[{"anchor":["r2","c"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[]},"passed":true},{"actual":{"merges":[{"anchor":["r0","a"],"colspan":2,"covered":[["r0","b"],["r1","a"],["r1","b"]],"rowspan":2,"value":"x"}],"plain":[["r0","c"],["r1","c"],["r2","a"],["r2","b"],["r2","c"]]},"check":"partial overlap","expected":{"merges":[{"anchor":["r0","a"],"colspan":2,"covered":[["r0","b"],["r1","a"],["r1","b"]],"rowspan":2,"value":"x"}],"plain":[["r0","c"],["r1","c"],["r2","a"],["r2","b"],["r2","c"]]},"passed":true},{"actual":{"merges":[],"plain":[]},"check":"hidden merge","expected":{"merges":[],"plain":[]},"passed":true},{"actual":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[["r0","a"],["r0","b"],["r1","a"]]},"check":"clamped span","expected":{"merges":[{"anchor":["r1","b"],"colspan":1,"covered":[],"rowspan":1,"value":"x"}],"plain":[["r0","a"],["r0","b"],["r1","a"]]},"passed":true},{"actual":{"merges":[],"plain":[["r0","a"],["r0","b"],["r1","a"],["r1","b"]]},"check":"unmerged grid","expected":{"merges":[],"plain":[["r0","a"],["r0","b"],["r1","a"],["r1","b"]]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"nonzero origin\", \"actual\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 2, \"colspan\": 2, \"value\": 1, \"covered\": [[\"r1\", \"c\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r0\", \"c\"], [\"r0\", \"d\"], [\"r1\", \"a\"], [\"r1\", \"d\"], [\"r2\", \"a\"], [\"r2\", \"d\"], [\"r3\", \"a\"], [\"r3\", \"b\"], [\"r3\", \"c\"], [\"r3\", \"d\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 2, \"colspan\": 2, \"value\": 1, \"covered\": [[\"r1\", \"c\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r0\", \"c\"], [\"r0\", \"d\"], [\"r1\", \"a\"], [\"r1\", \"d\"], [\"r2\", \"a\"], [\"r2\", \"d\"], [\"r3\", \"a\"], [\"r3\", \"b\"], [\"r3\", \"c\"], [\"r3\", \"d\"]]}, \"passed\": true}, {\"check\": \"hidden anchor\", \"actual\": {\"merges\": [{\"anchor\": [\"r2\", \"c\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": []}, \"expected\": {\"merges\": [{\"anchor\": [\"r2\", \"c\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": []}, \"passed\": true}, {\"check\": \"partial overlap\", \"actual\": {\"merges\": [{\"anchor\": [\"r0\", \"a\"], \"rowspan\": 2, \"colspan\": 2, \"value\": \"x\", \"covered\": [[\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}], \"plain\": [[\"r0\", \"c\"], [\"r1\", \"c\"], [\"r2\", \"a\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r0\", \"a\"], \"rowspan\": 2, \"colspan\": 2, \"value\": \"x\", \"covered\": [[\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}], \"plain\": [[\"r0\", \"c\"], [\"r1\", \"c\"], [\"r2\", \"a\"], [\"r2\", \"b\"], [\"r2\", \"c\"]]}, \"passed\": true}, {\"check\": \"hidden merge\", \"actual\": {\"merges\": [], \"plain\": []}, \"expected\": {\"merges\": [], \"plain\": []}, \"passed\": true}, {\"check\": \"clamped span\", \"actual\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"]]}, \"expected\": {\"merges\": [{\"anchor\": [\"r1\", \"b\"], \"rowspan\": 1, \"colspan\": 1, \"value\": \"x\", \"covered\": []}], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"]]}, \"passed\": true}, {\"check\": \"unmerged grid\", \"actual\": {\"merges\": [], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}, \"expected\": {\"merges\": [], \"plain\": [[\"r0\", \"a\"], [\"r0\", \"b\"], [\"r1\", \"a\"], [\"r1\", \"b\"]]}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}