{"abstract":"The table alias target validation result violates the stipulated table column schema migration contract.","category":"Table interactions","checks":7,"contract":"Schema migration gives surviving IDs precedence over aliases, validates alias targets, deduplicates migrated order/selection and appends new columns. Direct widths override alias widths, required columns stay visible, drafts migrate only across equal types, and deleted anchors clear.","evaluation_group":"s3-table-interactions-schema-migration","failed_approach":"The attempted repair 'k if k in ids else None' still loses a required part of the table contract.","family":"s3-table-interactions-schema-migration-alias-target-validation","id":"FA-38296","implementations":{"attempt":{"sha256":"2cc1a896c8486a68a07c94e20b8b40411343df49cae95d90c15fd1a6a9ce68f0","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old, new, aliases, view, drafts, selected, anchor):\n    ids=[c['id'] for c in new]\n    def remap(k):\n        if k in ids: return k\n        return k if k in ids else None\n    order=[]\n    for k in view['order']:\n        mapped=remap(k)\n        if mapped is not None and mapped not in order: order.append(mapped)\n    order += [k for k in ids if k not in order]\n    widths={}\n    for k,v in view['widths'].items():\n        mapped=remap(k)\n        if mapped is not None and (mapped not in widths or k==mapped): widths[mapped]=v\n    hidden=[k for k in order if any(remap(x)==k for x in view['hidden']) and not next(c for c in new if c['id']==k).get('required')]\n    newdraft=[]\n    oldtypes={c['id']:c['type'] for c in old}; newtypes={c['id']:c['type'] for c in new}\n    for r,c,value in drafts:\n        mapped=remap(c)\n        if mapped is not None and oldtypes.get(c)==newtypes[mapped]: newdraft.append((r,mapped,value))\n    newsel=[]\n    for r,c in selected:\n        mapped=remap(c)\n        if mapped is not None and (r,mapped) not in newsel: newsel.append((r,mapped))\n    return {'order':order,'widths':widths,'hidden':hidden,'drafts':newdraft,'selected':newsel,'anchor':(anchor[0],remap(anchor[1])) if anchor is not None and remap(anchor[1]) is not None else None}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':1+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 8}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 2:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':2+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 9}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 3:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':3+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 10}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 4:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':4+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 11}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 5:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':5+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 12}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\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":"90ba48243bb3a073e720b03c315786e83dc18597ba7296a3f839a9f2202e09a2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old, new, aliases, view, drafts, selected, anchor):\n    ids=[c['id'] for c in new]\n    def remap(k):\n        if k in ids: return k\n        return None\n    order=[]\n    for k in view['order']:\n        mapped=remap(k)\n        if mapped is not None and mapped not in order: order.append(mapped)\n    order += [k for k in ids if k not in order]\n    widths={}\n    for k,v in view['widths'].items():\n        mapped=remap(k)\n        if mapped is not None and (mapped not in widths or k==mapped): widths[mapped]=v\n    hidden=[k for k in order if any(remap(x)==k for x in view['hidden']) and not next(c for c in new if c['id']==k).get('required')]\n    newdraft=[]\n    oldtypes={c['id']:c['type'] for c in old}; newtypes={c['id']:c['type'] for c in new}\n    for r,c,value in drafts:\n        mapped=remap(c)\n        if mapped is not None and oldtypes.get(c)==newtypes[mapped]: newdraft.append((r,mapped,value))\n    newsel=[]\n    for r,c in selected:\n        mapped=remap(c)\n        if mapped is not None and (r,mapped) not in newsel: newsel.append((r,mapped))\n    return {'order':order,'widths':widths,'hidden':hidden,'drafts':newdraft,'selected':newsel,'anchor':(anchor[0],remap(anchor[1])) if anchor is not None and remap(anchor[1]) is not None else None}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':1+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 8}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 2:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':2+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 9}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 3:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':3+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 10}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 4:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':4+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 11}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 5:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':5+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 12}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\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":"5ce8751763296f2cd68024dfc112be5dca466c1e0cc5f6eba7eb0400ba8ba7e5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old, new, aliases, view, drafts, selected, anchor):\n    ids=[c['id'] for c in new]\n    def remap(k):\n        if k in ids: return k\n        return aliases.get(k) if aliases.get(k) in ids else None\n    order=[]\n    for k in view['order']:\n        mapped=remap(k)\n        if mapped is not None and mapped not in order: order.append(mapped)\n    order += [k for k in ids if k not in order]\n    widths={}\n    for k,v in view['widths'].items():\n        mapped=remap(k)\n        if mapped is not None and (mapped not in widths or k==mapped): widths[mapped]=v\n    hidden=[k for k in order if any(remap(x)==k for x in view['hidden']) and not next(c for c in new if c['id']==k).get('required')]\n    newdraft=[]\n    oldtypes={c['id']:c['type'] for c in old}; newtypes={c['id']:c['type'] for c in new}\n    for r,c,value in drafts:\n        mapped=remap(c)\n        if mapped is not None and oldtypes.get(c)==newtypes[mapped]: newdraft.append((r,mapped,value))\n    newsel=[]\n    for r,c in selected:\n        mapped=remap(c)\n        if mapped is not None and (r,mapped) not in newsel: newsel.append((r,mapped))\n    return {'order':order,'widths':widths,'hidden':hidden,'drafts':newdraft,'selected':newsel,'anchor':(anchor[0],remap(anchor[1])) if anchor is not None and remap(anchor[1]) is not None else None}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':1+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 8}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 2:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':2+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 9}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 3:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':3+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 10}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 4:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':4+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 11}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\n\nif N == 5:\n    check('renamed numeric column', solve([{'id':'old','type':'number'},{'id':'b','type':'text'}], [{'id':'new','type':'number'},{'id':'b','type':'text'},{'id':'fresh','type':'text'}], {'old':'new'}, {'order':['old','b'],'widths':{'old':5+7},'hidden':['old']}, [('r','old',3),('r','b','x')], [('r','old'),('r','b')], ('r','old')), {'order': ['new', 'b', 'fresh'], 'widths': {'new': 12}, 'hidden': ['new'], 'drafts': [('r', 'new', 3), ('r', 'b', 'x')], 'selected': [('r', 'new'), ('r', 'b')], 'anchor': ('r', 'new')})\n    check('direct id wins alias', solve([{'id':'a','type':'text'},{'id':'b','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'}], {'a':'b'}, {'order':['a','b'],'widths':{'a':4,'b':5},'hidden':[]}, [], [], ('r','a')), {'order': ['a', 'b'], 'widths': {'a': 4, 'b': 5}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': ('r', 'a')})\n    check('merged aliases direct widths last', solve([{'id':'x','type':'text'},{'id':'y','type':'text'},{'id':'a','type':'text'}], [{'id':'a','type':'text'}], {'x':'a','y':'a'}, {'order':['x','y','a'],'widths':{'x':4,'a':8,'y':6},'hidden':[]}, [], [('r','x'),('r','y')], None), {'order': ['a'], 'widths': {'a': 8}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': None})\n    check('type-changed draft', solve([{'id':'a','type':'text'}], [{'id':'a','type':'number'}], {}, {'order':['a'],'widths':{},'hidden':[]}, [('r','a','1')], [('r','a')], ('r','a')), {'order': ['a'], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [('r', 'a')], 'anchor': ('r', 'a')})\n    check('removed schema key', solve([{'id':'gone','type':'text'}], [], {'gone':'also-gone'}, {'order':['gone'],'widths':{'gone':9},'hidden':['gone']}, [('r','gone','v')], [('r','gone')], ('r','gone')), {'order': [], 'widths': {}, 'hidden': [], 'drafts': [], 'selected': [], 'anchor': None})\n    check('reverse saved order', solve([{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], [{'id':'a','type':'text'},{'id':'b','type':'text'},{'id':'c','type':'text'}], {}, {'order':['c','b','a'],'widths':{},'hidden':['b']}, [], [], None), {'order': ['c', 'b', 'a'], 'widths': {}, 'hidden': ['b'], 'drafts': [], 'selected': [], 'anchor': None})\n    check('required renamed column', solve([{'id':'old','type':'text'}], [{'id':'a','type':'text'},{'id':'new','type':'text','required':True}], {'old':'new'}, {'order':['a','old'],'widths':{},'hidden':['old','a']}, [], [], None), {'order': ['a', 'new'], 'widths': {}, 'hidden': ['a'], 'drafts': [], 'selected': [], 'anchor': None})\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":"Old/new schema IDs are unique and aliases are single-hop; draft compatibility requires exact stipulated type-name equality. 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-schema-migration-alias-target-validation","generated_at":"2026-09-29T14:43:09.705265+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates table column schema migration, including adversarial row/column relationships.","repair":"Apply the complete alias target validation rule: aliases.get(k) if aliases.get(k) in ids else None.","root_cause":"The alias target validation decision uses 'None' instead of 'aliases.get(k) if aliases.get(k) in ids else None'.","sha256":"ff976669e84574c8a1cabdfc7049528ab1d091191c82f28e4dde55ce43866ee5","title":"Table column schema migration: alias target validation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.92,"exit_code":1,"observations":[{"actual":{"anchor":null,"drafts":[["r","b","x"]],"hidden":[],"order":["b","new","fresh"],"selected":[["r","b"]],"widths":{}},"check":"renamed numeric column","expected":{"anchor":["r","new"],"drafts":[["r","new",3],["r","b","x"]],"hidden":["new"],"order":["new","b","fresh"],"selected":[["r","new"],["r","b"]],"widths":{"new":8}},"passed":false},{"actual":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a","b"],"selected":[],"widths":{"a":4,"b":5}},"check":"direct id wins alias","expected":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a","b"],"selected":[],"widths":{"a":4,"b":5}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":[],"order":["a"],"selected":[],"widths":{"a":8}},"check":"merged aliases direct widths last","expected":{"anchor":null,"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{"a":8}},"passed":false},{"actual":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{}},"check":"type-changed draft","expected":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":[],"order":[],"selected":[],"widths":{}},"check":"removed schema key","expected":{"anchor":null,"drafts":[],"hidden":[],"order":[],"selected":[],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":["b"],"order":["c","b","a"],"selected":[],"widths":{}},"check":"reverse saved order","expected":{"anchor":null,"drafts":[],"hidden":["b"],"order":["c","b","a"],"selected":[],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":["a"],"order":["a","new"],"selected":[],"widths":{}},"check":"required renamed column","expected":{"anchor":null,"drafts":[],"hidden":["a"],"order":["a","new"],"selected":[],"widths":{}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"renamed numeric column\", \"actual\": {\"order\": [\"b\", \"new\", \"fresh\"], \"widths\": {}, \"hidden\": [], \"drafts\": [[\"r\", \"b\", \"x\"]], \"selected\": [[\"r\", \"b\"]], \"anchor\": null}, \"expected\": {\"order\": [\"new\", \"b\", \"fresh\"], \"widths\": {\"new\": 8}, \"hidden\": [\"new\"], \"drafts\": [[\"r\", \"new\", 3], [\"r\", \"b\", \"x\"]], \"selected\": [[\"r\", \"new\"], [\"r\", \"b\"]], \"anchor\": [\"r\", \"new\"]}, \"passed\": false}, {\"check\": \"direct id wins alias\", \"actual\": {\"order\": [\"a\", \"b\"], \"widths\": {\"a\": 4, \"b\": 5}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": [\"r\", \"a\"]}, \"expected\": {\"order\": [\"a\", \"b\"], \"widths\": {\"a\": 4, \"b\": 5}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": [\"r\", \"a\"]}, \"passed\": true}, {\"check\": \"merged aliases direct widths last\", \"actual\": {\"order\": [\"a\"], \"widths\": {\"a\": 8}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"a\"], \"widths\": {\"a\": 8}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": null}, \"passed\": false}, {\"check\": \"type-changed draft\", \"actual\": {\"order\": [\"a\"], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": [\"r\", \"a\"]}, \"expected\": {\"order\": [\"a\"], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": [\"r\", \"a\"]}, \"passed\": true}, {\"check\": \"removed schema key\", \"actual\": {\"order\": [], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}, {\"check\": \"reverse saved order\", \"actual\": {\"order\": [\"c\", \"b\", \"a\"], \"widths\": {}, \"hidden\": [\"b\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"c\", \"b\", \"a\"], \"widths\": {}, \"hidden\": [\"b\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}, {\"check\": \"required renamed column\", \"actual\": {\"order\": [\"a\", \"new\"], \"widths\": {}, \"hidden\": [\"a\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"a\", \"new\"], \"widths\": {}, \"hidden\": [\"a\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.264,"exit_code":1,"observations":[{"actual":{"anchor":null,"drafts":[["r","b","x"]],"hidden":[],"order":["b","new","fresh"],"selected":[["r","b"]],"widths":{}},"check":"renamed numeric column","expected":{"anchor":["r","new"],"drafts":[["r","new",3],["r","b","x"]],"hidden":["new"],"order":["new","b","fresh"],"selected":[["r","new"],["r","b"]],"widths":{"new":8}},"passed":false},{"actual":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a","b"],"selected":[],"widths":{"a":4,"b":5}},"check":"direct id wins alias","expected":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a","b"],"selected":[],"widths":{"a":4,"b":5}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":[],"order":["a"],"selected":[],"widths":{"a":8}},"check":"merged aliases direct widths last","expected":{"anchor":null,"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{"a":8}},"passed":false},{"actual":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{}},"check":"type-changed draft","expected":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":[],"order":[],"selected":[],"widths":{}},"check":"removed schema key","expected":{"anchor":null,"drafts":[],"hidden":[],"order":[],"selected":[],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":["b"],"order":["c","b","a"],"selected":[],"widths":{}},"check":"reverse saved order","expected":{"anchor":null,"drafts":[],"hidden":["b"],"order":["c","b","a"],"selected":[],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":["a"],"order":["a","new"],"selected":[],"widths":{}},"check":"required renamed column","expected":{"anchor":null,"drafts":[],"hidden":["a"],"order":["a","new"],"selected":[],"widths":{}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"renamed numeric column\", \"actual\": {\"order\": [\"b\", \"new\", \"fresh\"], \"widths\": {}, \"hidden\": [], \"drafts\": [[\"r\", \"b\", \"x\"]], \"selected\": [[\"r\", \"b\"]], \"anchor\": null}, \"expected\": {\"order\": [\"new\", \"b\", \"fresh\"], \"widths\": {\"new\": 8}, \"hidden\": [\"new\"], \"drafts\": [[\"r\", \"new\", 3], [\"r\", \"b\", \"x\"]], \"selected\": [[\"r\", \"new\"], [\"r\", \"b\"]], \"anchor\": [\"r\", \"new\"]}, \"passed\": false}, {\"check\": \"direct id wins alias\", \"actual\": {\"order\": [\"a\", \"b\"], \"widths\": {\"a\": 4, \"b\": 5}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": [\"r\", \"a\"]}, \"expected\": {\"order\": [\"a\", \"b\"], \"widths\": {\"a\": 4, \"b\": 5}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": [\"r\", \"a\"]}, \"passed\": true}, {\"check\": \"merged aliases direct widths last\", \"actual\": {\"order\": [\"a\"], \"widths\": {\"a\": 8}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"a\"], \"widths\": {\"a\": 8}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": null}, \"passed\": false}, {\"check\": \"type-changed draft\", \"actual\": {\"order\": [\"a\"], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": [\"r\", \"a\"]}, \"expected\": {\"order\": [\"a\"], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": [\"r\", \"a\"]}, \"passed\": true}, {\"check\": \"removed schema key\", \"actual\": {\"order\": [], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}, {\"check\": \"reverse saved order\", \"actual\": {\"order\": [\"c\", \"b\", \"a\"], \"widths\": {}, \"hidden\": [\"b\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"c\", \"b\", \"a\"], \"widths\": {}, \"hidden\": [\"b\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}, {\"check\": \"required renamed column\", \"actual\": {\"order\": [\"a\", \"new\"], \"widths\": {}, \"hidden\": [\"a\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"a\", \"new\"], \"widths\": {}, \"hidden\": [\"a\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.564,"exit_code":0,"observations":[{"actual":{"anchor":["r","new"],"drafts":[["r","new",3],["r","b","x"]],"hidden":["new"],"order":["new","b","fresh"],"selected":[["r","new"],["r","b"]],"widths":{"new":8}},"check":"renamed numeric column","expected":{"anchor":["r","new"],"drafts":[["r","new",3],["r","b","x"]],"hidden":["new"],"order":["new","b","fresh"],"selected":[["r","new"],["r","b"]],"widths":{"new":8}},"passed":true},{"actual":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a","b"],"selected":[],"widths":{"a":4,"b":5}},"check":"direct id wins alias","expected":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a","b"],"selected":[],"widths":{"a":4,"b":5}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{"a":8}},"check":"merged aliases direct widths last","expected":{"anchor":null,"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{"a":8}},"passed":true},{"actual":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{}},"check":"type-changed draft","expected":{"anchor":["r","a"],"drafts":[],"hidden":[],"order":["a"],"selected":[["r","a"]],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":[],"order":[],"selected":[],"widths":{}},"check":"removed schema key","expected":{"anchor":null,"drafts":[],"hidden":[],"order":[],"selected":[],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":["b"],"order":["c","b","a"],"selected":[],"widths":{}},"check":"reverse saved order","expected":{"anchor":null,"drafts":[],"hidden":["b"],"order":["c","b","a"],"selected":[],"widths":{}},"passed":true},{"actual":{"anchor":null,"drafts":[],"hidden":["a"],"order":["a","new"],"selected":[],"widths":{}},"check":"required renamed column","expected":{"anchor":null,"drafts":[],"hidden":["a"],"order":["a","new"],"selected":[],"widths":{}},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"renamed numeric column\", \"actual\": {\"order\": [\"new\", \"b\", \"fresh\"], \"widths\": {\"new\": 8}, \"hidden\": [\"new\"], \"drafts\": [[\"r\", \"new\", 3], [\"r\", \"b\", \"x\"]], \"selected\": [[\"r\", \"new\"], [\"r\", \"b\"]], \"anchor\": [\"r\", \"new\"]}, \"expected\": {\"order\": [\"new\", \"b\", \"fresh\"], \"widths\": {\"new\": 8}, \"hidden\": [\"new\"], \"drafts\": [[\"r\", \"new\", 3], [\"r\", \"b\", \"x\"]], \"selected\": [[\"r\", \"new\"], [\"r\", \"b\"]], \"anchor\": [\"r\", \"new\"]}, \"passed\": true}, {\"check\": \"direct id wins alias\", \"actual\": {\"order\": [\"a\", \"b\"], \"widths\": {\"a\": 4, \"b\": 5}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": [\"r\", \"a\"]}, \"expected\": {\"order\": [\"a\", \"b\"], \"widths\": {\"a\": 4, \"b\": 5}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": [\"r\", \"a\"]}, \"passed\": true}, {\"check\": \"merged aliases direct widths last\", \"actual\": {\"order\": [\"a\"], \"widths\": {\"a\": 8}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": null}, \"expected\": {\"order\": [\"a\"], \"widths\": {\"a\": 8}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": null}, \"passed\": true}, {\"check\": \"type-changed draft\", \"actual\": {\"order\": [\"a\"], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": [\"r\", \"a\"]}, \"expected\": {\"order\": [\"a\"], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [[\"r\", \"a\"]], \"anchor\": [\"r\", \"a\"]}, \"passed\": true}, {\"check\": \"removed schema key\", \"actual\": {\"order\": [], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [], \"widths\": {}, \"hidden\": [], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}, {\"check\": \"reverse saved order\", \"actual\": {\"order\": [\"c\", \"b\", \"a\"], \"widths\": {}, \"hidden\": [\"b\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"c\", \"b\", \"a\"], \"widths\": {}, \"hidden\": [\"b\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}, {\"check\": \"required renamed column\", \"actual\": {\"order\": [\"a\", \"new\"], \"widths\": {}, \"hidden\": [\"a\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"expected\": {\"order\": [\"a\", \"new\"], \"widths\": {}, \"hidden\": [\"a\"], \"drafts\": [], \"selected\": [], \"anchor\": null}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}