{"abstract":"The table pin side validation result violates the stipulated saved table view restoration contract.","category":"Table interactions","checks":6,"contract":"Restore a table view only at matching schema version; deduplicate known order, append new schema columns, keep required columns visible, accept positive-clamped integer nonboolean widths, validate pin sides/density/page-size enums, and ignore removed columns.","evaluation_group":"s3-table-interactions-view-restore","failed_approach":"The attempted repair \"p=='left'\" still loses a required part of the table contract.","family":"s3-table-interactions-view-restore-pin-side-validation","id":"FA-37726","implementations":{"attempt":{"sha256":"e1f8c85ef6f9acab9edc547e4ea10a080469ab631fd7d62cd569f0549c7b1093","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(schema, saved, version, defaults):\n    ids=[c['id'] for c in schema]\n    if saved.get('version')!=version: return defaults\n    order=[]\n    for c in saved.get('order',[]):\n        if c in ids and c not in order: order.append(c)\n    order += [c for c in ids if c not in order]\n    hidden=[c for c in order if c in saved.get('hidden',[]) and not next((x for x in schema if x['id']==c),{}).get('required')]\n    widths={c:max(1,w) for c,w in saved.get('widths',{}).items() if c in ids and isinstance(w,int) and not isinstance(w,bool)}\n    pins={c:p for c,p in saved.get('pins',{}).items() if c in ids and p=='left'}\n    return {'order':order,'hidden':hidden,'widths':widths,'pins':pins,'density':saved.get('density') if saved.get('density') in ('compact','normal','comfortable') else defaults['density'],'page_size':saved.get('page_size') if saved.get('page_size') in (10,25,50) else defaults['page_size']}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':1+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 3, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 2:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':2+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 4, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 3:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':3+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 5, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 4:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':4+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 6, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 5:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':5+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 7, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\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":"cd7762d2dd7b28e177cadc4e971fc10678d16208c1f9190526239a835896164f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(schema, saved, version, defaults):\n    ids=[c['id'] for c in schema]\n    if saved.get('version')!=version: return defaults\n    order=[]\n    for c in saved.get('order',[]):\n        if c in ids and c not in order: order.append(c)\n    order += [c for c in ids if c not in order]\n    hidden=[c for c in order if c in saved.get('hidden',[]) and not next((x for x in schema if x['id']==c),{}).get('required')]\n    widths={c:max(1,w) for c,w in saved.get('widths',{}).items() if c in ids and isinstance(w,int) and not isinstance(w,bool)}\n    pins={c:p for c,p in saved.get('pins',{}).items() if c in ids and True}\n    return {'order':order,'hidden':hidden,'widths':widths,'pins':pins,'density':saved.get('density') if saved.get('density') in ('compact','normal','comfortable') else defaults['density'],'page_size':saved.get('page_size') if saved.get('page_size') in (10,25,50) else defaults['page_size']}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':1+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 3, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 2:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':2+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 4, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 3:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':3+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 5, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 4:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':4+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 6, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 5:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':5+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 7, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\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":"d7163c5befc0179556e3fe5e1acf225a7df86fd365167ca209e5a55f870c9ebd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(schema, saved, version, defaults):\n    ids=[c['id'] for c in schema]\n    if saved.get('version')!=version: return defaults\n    order=[]\n    for c in saved.get('order',[]):\n        if c in ids and c not in order: order.append(c)\n    order += [c for c in ids if c not in order]\n    hidden=[c for c in order if c in saved.get('hidden',[]) and not next((x for x in schema if x['id']==c),{}).get('required')]\n    widths={c:max(1,w) for c,w in saved.get('widths',{}).items() if c in ids and isinstance(w,int) and not isinstance(w,bool)}\n    pins={c:p for c,p in saved.get('pins',{}).items() if c in ids and p in ('left','right')}\n    return {'order':order,'hidden':hidden,'widths':widths,'pins':pins,'density':saved.get('density') if saved.get('density') in ('compact','normal','comfortable') else defaults['density'],'page_size':saved.get('page_size') if saved.get('page_size') in (10,25,50) else defaults['page_size']}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':1+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 3, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 2:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':2+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 4, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 3:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':3+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 5, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 4:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':4+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 6, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\n\nif N == 5:\n    check('schema evolution', solve([{'id':'a','required':True},{'id':'b'},{'id':'c'}], {'version':2,'order':['b','gone','b'],'hidden':['a','b'],'widths':{'a':5+2,'b':0,'gone':8},'pins':{'a':'right','b':'middle'},'density':'comfortable','page_size':25}, 2, {'density':'normal','page_size':10}), {'order': ['b', 'a', 'c'], 'hidden': ['b'], 'widths': {'a': 7, 'b': 1}, 'pins': {'a': 'right'}, 'density': 'comfortable', 'page_size': 25})\n    check('old version', solve([{'id':'a'}], {'version':1}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('missing version', solve([{'id':'a'}], {}, 2, {'density':'normal','page_size':10}), {'density': 'normal', 'page_size': 10})\n    check('invalid values', solve([{'id':'a'},{'id':'b'}], {'version':2,'widths':{'a':True,'b':2.5},'density':'wild','page_size':13}, 2, {'density':'normal','page_size':10}), {'order': ['a', 'b'], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'normal', 'page_size': 10})\n    check('negative width', solve([{'id':'a'}], {'version':2,'widths':{'a':-4},'pins':{'a':'left'},'density':'normal','page_size':50}, 2, {'density':'compact','page_size':10}), {'order': ['a'], 'hidden': [], 'widths': {'a': 1}, 'pins': {'a': 'left'}, 'density': 'normal', 'page_size': 50})\n    check('empty schema', solve([], {'version':2,'order':['gone'],'hidden':['gone'],'widths':{},'pins':{'gone':'left'},'density':'compact','page_size':10}, 2, {'density':'normal','page_size':25}), {'order': [], 'hidden': [], 'widths': {}, 'pins': {}, 'density': 'compact', 'page_size': 10})\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":"Schema IDs are unique; settings are finite Python scalar/container values with an explicitly enumerated restoration policy. 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-view-restore-pin-side-validation","generated_at":"2026-09-29T14:43:04.056813+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates saved table view restoration, including adversarial row/column relationships.","repair":"Apply the complete pin side validation rule: p in ('left','right').","root_cause":"The pin side validation decision uses 'True' instead of \"p in ('left','right')\".","sha256":"a1594aa2bd4e5cf86c57bf4c8dd6859805a9337178d25ef26b2d0b1a3da84a73","title":"Saved table view restoration: pin side validation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.181,"exit_code":1,"observations":[{"actual":{"density":"comfortable","hidden":["b"],"order":["b","a","c"],"page_size":25,"pins":{},"widths":{"a":3,"b":1}},"check":"schema evolution","expected":{"density":"comfortable","hidden":["b"],"order":["b","a","c"],"page_size":25,"pins":{"a":"right"},"widths":{"a":3,"b":1}},"passed":false},{"actual":{"density":"normal","page_size":10},"check":"old version","expected":{"density":"normal","page_size":10},"passed":true},{"actual":{"density":"normal","page_size":10},"check":"missing version","expected":{"density":"normal","page_size":10},"passed":true},{"actual":{"density":"normal","hidden":[],"order":["a","b"],"page_size":10,"pins":{},"widths":{}},"check":"invalid values","expected":{"density":"normal","hidden":[],"order":["a","b"],"page_size":10,"pins":{},"widths":{}},"passed":true},{"actual":{"density":"normal","hidden":[],"order":["a"],"page_size":50,"pins":{"a":"left"},"widths":{"a":1}},"check":"negative width","expected":{"density":"normal","hidden":[],"order":["a"],"page_size":50,"pins":{"a":"left"},"widths":{"a":1}},"passed":true},{"actual":{"density":"compact","hidden":[],"order":[],"page_size":10,"pins":{},"widths":{}},"check":"empty schema","expected":{"density":"compact","hidden":[],"order":[],"page_size":10,"pins":{},"widths":{}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"schema evolution\", \"actual\": {\"order\": [\"b\", \"a\", \"c\"], \"hidden\": [\"b\"], \"widths\": {\"a\": 3, \"b\": 1}, \"pins\": {}, \"density\": \"comfortable\", \"page_size\": 25}, \"expected\": {\"order\": [\"b\", \"a\", \"c\"], \"hidden\": [\"b\"], \"widths\": {\"a\": 3, \"b\": 1}, \"pins\": {\"a\": \"right\"}, \"density\": \"comfortable\", \"page_size\": 25}, \"passed\": false}, {\"check\": \"old version\", \"actual\": {\"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"missing version\", \"actual\": {\"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"invalid values\", \"actual\": {\"order\": [\"a\", \"b\"], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"order\": [\"a\", \"b\"], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"negative width\", \"actual\": {\"order\": [\"a\"], \"hidden\": [], \"widths\": {\"a\": 1}, \"pins\": {\"a\": \"left\"}, \"density\": \"normal\", \"page_size\": 50}, \"expected\": {\"order\": [\"a\"], \"hidden\": [], \"widths\": {\"a\": 1}, \"pins\": {\"a\": \"left\"}, \"density\": \"normal\", \"page_size\": 50}, \"passed\": true}, {\"check\": \"empty schema\", \"actual\": {\"order\": [], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"compact\", \"page_size\": 10}, \"expected\": {\"order\": [], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"compact\", \"page_size\": 10}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.945,"exit_code":1,"observations":[{"actual":{"density":"comfortable","hidden":["b"],"order":["b","a","c"],"page_size":25,"pins":{"a":"right","b":"middle"},"widths":{"a":3,"b":1}},"check":"schema evolution","expected":{"density":"comfortable","hidden":["b"],"order":["b","a","c"],"page_size":25,"pins":{"a":"right"},"widths":{"a":3,"b":1}},"passed":false},{"actual":{"density":"normal","page_size":10},"check":"old version","expected":{"density":"normal","page_size":10},"passed":true},{"actual":{"density":"normal","page_size":10},"check":"missing version","expected":{"density":"normal","page_size":10},"passed":true},{"actual":{"density":"normal","hidden":[],"order":["a","b"],"page_size":10,"pins":{},"widths":{}},"check":"invalid values","expected":{"density":"normal","hidden":[],"order":["a","b"],"page_size":10,"pins":{},"widths":{}},"passed":true},{"actual":{"density":"normal","hidden":[],"order":["a"],"page_size":50,"pins":{"a":"left"},"widths":{"a":1}},"check":"negative width","expected":{"density":"normal","hidden":[],"order":["a"],"page_size":50,"pins":{"a":"left"},"widths":{"a":1}},"passed":true},{"actual":{"density":"compact","hidden":[],"order":[],"page_size":10,"pins":{},"widths":{}},"check":"empty schema","expected":{"density":"compact","hidden":[],"order":[],"page_size":10,"pins":{},"widths":{}},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"schema evolution\", \"actual\": {\"order\": [\"b\", \"a\", \"c\"], \"hidden\": [\"b\"], \"widths\": {\"a\": 3, \"b\": 1}, \"pins\": {\"a\": \"right\", \"b\": \"middle\"}, \"density\": \"comfortable\", \"page_size\": 25}, \"expected\": {\"order\": [\"b\", \"a\", \"c\"], \"hidden\": [\"b\"], \"widths\": {\"a\": 3, \"b\": 1}, \"pins\": {\"a\": \"right\"}, \"density\": \"comfortable\", \"page_size\": 25}, \"passed\": false}, {\"check\": \"old version\", \"actual\": {\"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"missing version\", \"actual\": {\"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"invalid values\", \"actual\": {\"order\": [\"a\", \"b\"], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"order\": [\"a\", \"b\"], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"negative width\", \"actual\": {\"order\": [\"a\"], \"hidden\": [], \"widths\": {\"a\": 1}, \"pins\": {\"a\": \"left\"}, \"density\": \"normal\", \"page_size\": 50}, \"expected\": {\"order\": [\"a\"], \"hidden\": [], \"widths\": {\"a\": 1}, \"pins\": {\"a\": \"left\"}, \"density\": \"normal\", \"page_size\": 50}, \"passed\": true}, {\"check\": \"empty schema\", \"actual\": {\"order\": [], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"compact\", \"page_size\": 10}, \"expected\": {\"order\": [], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"compact\", \"page_size\": 10}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":44.565,"exit_code":0,"observations":[{"actual":{"density":"comfortable","hidden":["b"],"order":["b","a","c"],"page_size":25,"pins":{"a":"right"},"widths":{"a":3,"b":1}},"check":"schema evolution","expected":{"density":"comfortable","hidden":["b"],"order":["b","a","c"],"page_size":25,"pins":{"a":"right"},"widths":{"a":3,"b":1}},"passed":true},{"actual":{"density":"normal","page_size":10},"check":"old version","expected":{"density":"normal","page_size":10},"passed":true},{"actual":{"density":"normal","page_size":10},"check":"missing version","expected":{"density":"normal","page_size":10},"passed":true},{"actual":{"density":"normal","hidden":[],"order":["a","b"],"page_size":10,"pins":{},"widths":{}},"check":"invalid values","expected":{"density":"normal","hidden":[],"order":["a","b"],"page_size":10,"pins":{},"widths":{}},"passed":true},{"actual":{"density":"normal","hidden":[],"order":["a"],"page_size":50,"pins":{"a":"left"},"widths":{"a":1}},"check":"negative width","expected":{"density":"normal","hidden":[],"order":["a"],"page_size":50,"pins":{"a":"left"},"widths":{"a":1}},"passed":true},{"actual":{"density":"compact","hidden":[],"order":[],"page_size":10,"pins":{},"widths":{}},"check":"empty schema","expected":{"density":"compact","hidden":[],"order":[],"page_size":10,"pins":{},"widths":{}},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"schema evolution\", \"actual\": {\"order\": [\"b\", \"a\", \"c\"], \"hidden\": [\"b\"], \"widths\": {\"a\": 3, \"b\": 1}, \"pins\": {\"a\": \"right\"}, \"density\": \"comfortable\", \"page_size\": 25}, \"expected\": {\"order\": [\"b\", \"a\", \"c\"], \"hidden\": [\"b\"], \"widths\": {\"a\": 3, \"b\": 1}, \"pins\": {\"a\": \"right\"}, \"density\": \"comfortable\", \"page_size\": 25}, \"passed\": true}, {\"check\": \"old version\", \"actual\": {\"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"missing version\", \"actual\": {\"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"invalid values\", \"actual\": {\"order\": [\"a\", \"b\"], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"normal\", \"page_size\": 10}, \"expected\": {\"order\": [\"a\", \"b\"], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"normal\", \"page_size\": 10}, \"passed\": true}, {\"check\": \"negative width\", \"actual\": {\"order\": [\"a\"], \"hidden\": [], \"widths\": {\"a\": 1}, \"pins\": {\"a\": \"left\"}, \"density\": \"normal\", \"page_size\": 50}, \"expected\": {\"order\": [\"a\"], \"hidden\": [], \"widths\": {\"a\": 1}, \"pins\": {\"a\": \"left\"}, \"density\": \"normal\", \"page_size\": 50}, \"passed\": true}, {\"check\": \"empty schema\", \"actual\": {\"order\": [], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"compact\", \"page_size\": 10}, \"expected\": {\"order\": [], \"hidden\": [], \"widths\": {}, \"pins\": {}, \"density\": \"compact\", \"page_size\": 10}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}