FAILURE MAP
← Case archive

FA-38326 / Table interactions / Open access

Table column schema migration: draft renamed coordinate · case 01

The table draft renamed coordinate result violates the stipulated table column schema migration contract.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The draft renamed coordinate decision uses 'newdraft.append((r,c,value))' instead of 'newdraft.append((r,mapped,value))'.

THE FAILURE

The draft renamed coordinate decision uses 'newdraft.append((r,c,value))' instead of 'newdraft.append((r,mapped,value))'.

Unsuccessful approach: The attempted repair 'newdraft.append((r,mapped,None))' still loses a required part of the table contract.

Case 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.

Why this case matters

An offline table UI model isolates table column schema migration, including adversarial row/column relationships.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(old, new, aliases, view, drafts, selected, anchor):
    ids=[c['id'] for c in new]
    def remap(k):
        if k in ids: return k
        return aliases.get(k) if aliases.get(k) in ids else None
    order=[]
    for k in view['order']:
        mapped=remap(k)
        if mapped is not None and mapped not in order: order.append(mapped)
    order += [k for k in ids if k not in order]
    widths={}
    for k,v in view['widths'].items():
        mapped=remap(k)
        if mapped is not None and (mapped not in widths or k==mapped): widths[mapped]=v
    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')]
    newdraft=[]
    oldtypes={c['id']:c['type'] for c in old}; newtypes={c['id']:c['type'] for c in new}
    for r,c,value in drafts:
        mapped=remap(c)
        if mapped is not None and oldtypes.get(c)==newtypes[mapped]: newdraft.append((r,c,value))
    newsel=[]
    for r,c in selected:
        mapped=remap(c)
        if mapped is not None and (r,mapped) not in newsel: newsel.append((r,mapped))
    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}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 2:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 3:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 4:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 5:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
renamed numeric column{'anchor': ['r', 'new'], 'drafts': [['r', 'old', 3], ['r', 'b', 'x']], 'hidden': ['new'], 'order': ['new', 'b', 'fresh'], 'selected': [['r', 'new'], ['r', 'b']], 'widths': {'new': 8}}{'anchor': ['r', 'new'], 'drafts': [['r', 'new', 3], ['r', 'b', 'x']], 'hidden': ['new'], 'order': ['new', 'b', 'fresh'], 'selected': [['r', 'new'], ['r', 'b']], 'widths': {'new': 8}}Failed
direct id wins alias{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a', 'b'], 'selected': [], 'widths': {'a': 4, 'b': 5}}{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a', 'b'], 'selected': [], 'widths': {'a': 4, 'b': 5}}Passed
merged aliases direct widths last{'anchor': None, 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {'a': 8}}{'anchor': None, 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {'a': 8}}Passed
type-changed draft{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {}}{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {}}Passed
removed schema key{'anchor': None, 'drafts': [], 'hidden': [], 'order': [], 'selected': [], 'widths': {}}{'anchor': None, 'drafts': [], 'hidden': [], 'order': [], 'selected': [], 'widths': {}}Passed
reverse saved order{'anchor': None, 'drafts': [], 'hidden': ['b'], 'order': ['c', 'b', 'a'], 'selected': [], 'widths': {}}{'anchor': None, 'drafts': [], 'hidden': ['b'], 'order': ['c', 'b', 'a'], 'selected': [], 'widths': {}}Passed
required renamed column{'anchor': None, 'drafts': [], 'hidden': ['a'], 'order': ['a', 'new'], 'selected': [], 'widths': {}}{'anchor': None, 'drafts': [], 'hidden': ['a'], 'order': ['a', 'new'], 'selected': [], 'widths': {}}Passed

SHA-256 / 269a62196f1d33f46f76c3d6d1eb1dbc3ad4b3f5ef9aee636aeae3b98ba63015

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(old, new, aliases, view, drafts, selected, anchor):
    ids=[c['id'] for c in new]
    def remap(k):
        if k in ids: return k
        return aliases.get(k) if aliases.get(k) in ids else None
    order=[]
    for k in view['order']:
        mapped=remap(k)
        if mapped is not None and mapped not in order: order.append(mapped)
    order += [k for k in ids if k not in order]
    widths={}
    for k,v in view['widths'].items():
        mapped=remap(k)
        if mapped is not None and (mapped not in widths or k==mapped): widths[mapped]=v
    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')]
    newdraft=[]
    oldtypes={c['id']:c['type'] for c in old}; newtypes={c['id']:c['type'] for c in new}
    for r,c,value in drafts:
        mapped=remap(c)
        if mapped is not None and oldtypes.get(c)==newtypes[mapped]: newdraft.append((r,mapped,None))
    newsel=[]
    for r,c in selected:
        mapped=remap(c)
        if mapped is not None and (r,mapped) not in newsel: newsel.append((r,mapped))
    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}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
if N == 1:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 2:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 3:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 4:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

if N == 5:
    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')})
    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')})
    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})
    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')})
    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})
    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})
    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})

print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
renamed numeric column{'anchor': ['r', 'new'], 'drafts': [['r', 'new', None], ['r', 'b', None]], 'hidden': ['new'], 'order': ['new', 'b', 'fresh'], 'selected': [['r', 'new'], ['r', 'b']], 'widths': {'new': 8}}{'anchor': ['r', 'new'], 'drafts': [['r', 'new', 3], ['r', 'b', 'x']], 'hidden': ['new'], 'order': ['new', 'b', 'fresh'], 'selected': [['r', 'new'], ['r', 'b']], 'widths': {'new': 8}}Failed
direct id wins alias{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a', 'b'], 'selected': [], 'widths': {'a': 4, 'b': 5}}{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a', 'b'], 'selected': [], 'widths': {'a': 4, 'b': 5}}Passed
merged aliases direct widths last{'anchor': None, 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {'a': 8}}{'anchor': None, 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {'a': 8}}Passed
type-changed draft{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {}}{'anchor': ['r', 'a'], 'drafts': [], 'hidden': [], 'order': ['a'], 'selected': [['r', 'a']], 'widths': {}}Passed
removed schema key{'anchor': None, 'drafts': [], 'hidden': [], 'order': [], 'selected': [], 'widths': {}}{'anchor': None, 'drafts': [], 'hidden': [], 'order': [], 'selected': [], 'widths': {}}Passed
reverse saved order{'anchor': None, 'drafts': [], 'hidden': ['b'], 'order': ['c', 'b', 'a'], 'selected': [], 'widths': {}}{'anchor': None, 'drafts': [], 'hidden': ['b'], 'order': ['c', 'b', 'a'], 'selected': [], 'widths': {}}Passed
required renamed column{'anchor': None, 'drafts': [], 'hidden': ['a'], 'order': ['a', 'new'], 'selected': [], 'widths': {}}{'anchor': None, 'drafts': [], 'hidden': ['a'], 'order': ['a', 'new'], 'selected': [], 'widths': {}}Passed

SHA-256 / 0a0ab96694398cca00a316a5b0ad3b859d15e49ebc424e0d074a59f75663b708

HELD IN THE MEMBER ARCHIVE

The verified repair and its recorded checks are member-only.

This mechanism has 7 recorded checks per implementation. The open-access tier publishes the failure and the unsuccessful fix; the repaired source that passes every check, and the observations that prove it, are available to members.

Every case sharing this mechanism uses the same contract and the same repair, so this one record is held back for all of them.

Member access is invitation-based. Sign in with your invited account to inspect the repair.

Sign in to the archive ↗

Verification & scope

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.

Observations recorded using Python 3.12.14 at 2026-09-29T14:43:10.124664+00:00.

Case digest / 58fe02bf7446aad7437f3aa7b1dd5368642f6dbf4ef3ec5ed15fd7399aea822d