{"abstract":"The table stripe row position result violates the stipulated table cell render invalidation contract.","category":"Table interactions","checks":8,"contract":"Table invalidation uses column field accessors and stable row IDs; repaint follows value, symmetric selection, error-text, width, stripe parity, or theme changes. Only wrapped cells remeasure on value/width changes, and added/removed row IDs drive mount/disposal.","evaluation_group":"s3-table-interactions-render-dirty","failed_approach":"The attempted repair 'False' still loses a required part of the table contract.","family":"s3-table-interactions-render-dirty-stripe-row-position","id":"FA-38261","implementations":{"attempt":{"sha256":"b14602da113dc48ef0d0e0ac9e622e73a315e118bc8c659e1e6c3da16e2a92c2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old_rows, new_rows, columns, selected_before, selected_after, old_widths, new_widths, old_theme, new_theme, old_errors, new_errors):\n    old={r['id']:r for r in old_rows}; new={r['id']:r for r in new_rows}\n    old_order=[r['id'] for r in old_rows]; new_order=[r['id'] for r in new_rows]\n    paint=[]; measure=[]\n    for r in new_rows:\n        key=r['id']\n        for c in columns:\n            cell=(key,c['id'])\n            changed=key not in old or old[key].get(c['field'])!=r.get(c['field'])\n            decor=(cell in selected_before)!=(cell in selected_after) or old_errors.get(cell)!=new_errors.get(cell)\n            layout=old_widths.get(c['id'])!=new_widths.get(c['id'])\n            stripe=c.get('stripe',False) and (key not in old_order or False)\n            if changed or decor or layout or stripe or old_theme!=new_theme: paint.append(cell)\n            if c.get('wrap',False) and (changed or layout): measure.append(cell)\n    return {'paint':paint,'measure':measure,'removed':[k for k in old_order if k not in new],'added':[k for k in new_order if k not in old]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':1+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 2:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':2+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 3:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':3+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 4:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':4+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 5:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':5+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\ncheck('variant wrapping width invalidation', solve([{'id':'r','a':1}], [{'id':'r','a':1}], [{'id':'a','field':'a','wrap':True}], [], [], {'a':N}, {'a':3}, 'light', 'light', {}, {}), {'paint':[('r','a')] if N!=3 else [],'measure':[('r','a')] if N!=3 else [],'removed':[],'added':[]})\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":"329058a2c78128414807045ad71b596d4c4f77ba93319ad22b3260b2f8e3a675","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old_rows, new_rows, columns, selected_before, selected_after, old_widths, new_widths, old_theme, new_theme, old_errors, new_errors):\n    old={r['id']:r for r in old_rows}; new={r['id']:r for r in new_rows}\n    old_order=[r['id'] for r in old_rows]; new_order=[r['id'] for r in new_rows]\n    paint=[]; measure=[]\n    for r in new_rows:\n        key=r['id']\n        for c in columns:\n            cell=(key,c['id'])\n            changed=key not in old or old[key].get(c['field'])!=r.get(c['field'])\n            decor=(cell in selected_before)!=(cell in selected_after) or old_errors.get(cell)!=new_errors.get(cell)\n            layout=old_widths.get(c['id'])!=new_widths.get(c['id'])\n            stripe=c.get('stripe',False) and (key not in old_order or old_order.index(key)!=new_order.index(key))\n            if changed or decor or layout or stripe or old_theme!=new_theme: paint.append(cell)\n            if c.get('wrap',False) and (changed or layout): measure.append(cell)\n    return {'paint':paint,'measure':measure,'removed':[k for k in old_order if k not in new],'added':[k for k in new_order if k not in old]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':1+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 2:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':2+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 3:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':3+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 4:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':4+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 5:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':5+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\ncheck('variant wrapping width invalidation', solve([{'id':'r','a':1}], [{'id':'r','a':1}], [{'id':'a','field':'a','wrap':True}], [], [], {'a':N}, {'a':3}, 'light', 'light', {}, {}), {'paint':[('r','a')] if N!=3 else [],'measure':[('r','a')] if N!=3 else [],'removed':[],'added':[]})\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":"84efd57e3cf5914da913f12eb56893863bd1efc35bbacd038f1657d584c9ff83","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old_rows, new_rows, columns, selected_before, selected_after, old_widths, new_widths, old_theme, new_theme, old_errors, new_errors):\n    old={r['id']:r for r in old_rows}; new={r['id']:r for r in new_rows}\n    old_order=[r['id'] for r in old_rows]; new_order=[r['id'] for r in new_rows]\n    paint=[]; measure=[]\n    for r in new_rows:\n        key=r['id']\n        for c in columns:\n            cell=(key,c['id'])\n            changed=key not in old or old[key].get(c['field'])!=r.get(c['field'])\n            decor=(cell in selected_before)!=(cell in selected_after) or old_errors.get(cell)!=new_errors.get(cell)\n            layout=old_widths.get(c['id'])!=new_widths.get(c['id'])\n            stripe=c.get('stripe',False) and (key not in old_order or old_order.index(key)%2!=new_order.index(key)%2)\n            if changed or decor or layout or stripe or old_theme!=new_theme: paint.append(cell)\n            if c.get('wrap',False) and (changed or layout): measure.append(cell)\n    return {'paint':paint,'measure':measure,'removed':[k for k in old_order if k not in new],'added':[k for k in new_order if k not in old]}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':1+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 2:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':2+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 3:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':3+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 4:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':4+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\nif N == 5:\n    check('accessor value changes', solve([{'id':'a','amount':1,'note':'same'}], [{'id':'a','amount':5+2,'note':'same'}], [{'id':'display','field':'amount','wrap':True},{'id':'note','field':'note'}], [], [], {'display':8,'note':4}, {'display':8,'note':4}, 'light', 'light', {}, {}), {'paint': [('a', 'display')], 'measure': [('a', 'display')], 'removed': [], 'added': []})\n    check('selection removed and added', solve([{'id':'a','v':1},{'id':'b','v':2}], [{'id':'a','v':1},{'id':'b','v':2}], [{'id':'v','field':'v','wrap':True}], [('a','v')], [('b','v')], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('a', 'v'), ('b', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('error message changes', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {('a','v'):'old'}, {('a','v'):'new'}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('width shrinks wrapping', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':8}, {'v':4}, 'light', 'light', {}, {}), {'paint': [('a', 'v')], 'measure': [('a', 'v')], 'removed': [], 'added': []})\n    check('theme-only repaint', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v','wrap':True}], [], [], {'v':5}, {'v':5}, 'light', 'dark', {}, {}), {'paint': [('a', 'v')], 'measure': [], 'removed': [], 'added': []})\n    check('parity and removals', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3},{'id':'gone','v':4}], [{'id':'b','v':2},{'id':'c','v':3},{'id':'a','v':1},{'id':'new','v':5}], [{'id':'v','field':'v','stripe':True}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [('b', 'v'), ('c', 'v'), ('new', 'v')], 'measure': [], 'removed': ['gone'], 'added': ['new']})\n    check('unchanged', solve([{'id':'a','v':1}], [{'id':'a','v':1}], [{'id':'v','field':'v'}], [], [], {'v':5}, {'v':5}, 'light', 'light', {}, {}), {'paint': [], 'measure': [], 'removed': [], 'added': []})\n\ncheck('variant wrapping width invalidation', solve([{'id':'r','a':1}], [{'id':'r','a':1}], [{'id':'a','field':'a','wrap':True}], [], [], {'a':N}, {'a':3}, 'light', 'light', {}, {}), {'paint':[('r','a')] if N!=3 else [],'measure':[('r','a')] if N!=3 else [],'removed':[],'added':[]})\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"Source row and schema IDs are unique; accessors name direct fields and stripe invalidation uses parity only. 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-render-dirty-stripe-row-position","generated_at":"2026-09-29T14:43:09.417787+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates table cell render invalidation, including adversarial row/column relationships.","repair":"Apply the complete stripe row position rule: old_order.index(key)%2!=new_order.index(key)%2.","root_cause":"The stripe row position decision uses 'old_order.index(key)!=new_order.index(key)' instead of 'old_order.index(key)%2!=new_order.index(key)%2'.","sha256":"852c8f603850d1d3fe21d66e357dcad1dc26a3e867b7c6afafa18e9e0a519770","title":"Table cell render invalidation: stripe row position · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.605,"exit_code":1,"observations":[{"actual":{"added":[],"measure":[["a","display"]],"paint":[["a","display"]],"removed":[]},"check":"accessor value changes","expected":{"added":[],"measure":[["a","display"]],"paint":[["a","display"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"],["b","v"]],"removed":[]},"check":"selection removed and added","expected":{"added":[],"measure":[],"paint":[["a","v"],["b","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"check":"error message changes","expected":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[["a","v"]],"paint":[["a","v"]],"removed":[]},"check":"width shrinks wrapping","expected":{"added":[],"measure":[["a","v"]],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"check":"theme-only repaint","expected":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":["new"],"measure":[],"paint":[["new","v"]],"removed":["gone"]},"check":"parity and removals","expected":{"added":["new"],"measure":[],"paint":[["b","v"],["c","v"],["new","v"]],"removed":["gone"]},"passed":false},{"actual":{"added":[],"measure":[],"paint":[],"removed":[]},"check":"unchanged","expected":{"added":[],"measure":[],"paint":[],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[["r","a"]],"paint":[["r","a"]],"removed":[]},"check":"variant wrapping width invalidation","expected":{"added":[],"measure":[["r","a"]],"paint":[["r","a"]],"removed":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"accessor value changes\", \"actual\": {\"paint\": [[\"a\", \"display\"]], \"measure\": [[\"a\", \"display\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"display\"]], \"measure\": [[\"a\", \"display\"]], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"selection removed and added\", \"actual\": {\"paint\": [[\"a\", \"v\"], [\"b\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"], [\"b\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"error message changes\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"width shrinks wrapping\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [[\"a\", \"v\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [[\"a\", \"v\"]], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"theme-only repaint\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"parity and removals\", \"actual\": {\"paint\": [[\"new\", \"v\"]], \"measure\": [], \"removed\": [\"gone\"], \"added\": [\"new\"]}, \"expected\": {\"paint\": [[\"b\", \"v\"], [\"c\", \"v\"], [\"new\", \"v\"]], \"measure\": [], \"removed\": [\"gone\"], \"added\": [\"new\"]}, \"passed\": false}, {\"check\": \"unchanged\", \"actual\": {\"paint\": [], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"variant wrapping width invalidation\", \"actual\": {\"paint\": [[\"r\", \"a\"]], \"measure\": [[\"r\", \"a\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"r\", \"a\"]], \"measure\": [[\"r\", \"a\"]], \"removed\": [], \"added\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.841,"exit_code":1,"observations":[{"actual":{"added":[],"measure":[["a","display"]],"paint":[["a","display"]],"removed":[]},"check":"accessor value changes","expected":{"added":[],"measure":[["a","display"]],"paint":[["a","display"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"],["b","v"]],"removed":[]},"check":"selection removed and added","expected":{"added":[],"measure":[],"paint":[["a","v"],["b","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"check":"error message changes","expected":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[["a","v"]],"paint":[["a","v"]],"removed":[]},"check":"width shrinks wrapping","expected":{"added":[],"measure":[["a","v"]],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"check":"theme-only repaint","expected":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":["new"],"measure":[],"paint":[["b","v"],["c","v"],["a","v"],["new","v"]],"removed":["gone"]},"check":"parity and removals","expected":{"added":["new"],"measure":[],"paint":[["b","v"],["c","v"],["new","v"]],"removed":["gone"]},"passed":false},{"actual":{"added":[],"measure":[],"paint":[],"removed":[]},"check":"unchanged","expected":{"added":[],"measure":[],"paint":[],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[["r","a"]],"paint":[["r","a"]],"removed":[]},"check":"variant wrapping width invalidation","expected":{"added":[],"measure":[["r","a"]],"paint":[["r","a"]],"removed":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"accessor value changes\", \"actual\": {\"paint\": [[\"a\", \"display\"]], \"measure\": [[\"a\", \"display\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"display\"]], \"measure\": [[\"a\", \"display\"]], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"selection removed and added\", \"actual\": {\"paint\": [[\"a\", \"v\"], [\"b\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"], [\"b\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"error message changes\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"width shrinks wrapping\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [[\"a\", \"v\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [[\"a\", \"v\"]], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"theme-only repaint\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"parity and removals\", \"actual\": {\"paint\": [[\"b\", \"v\"], [\"c\", \"v\"], [\"a\", \"v\"], [\"new\", \"v\"]], \"measure\": [], \"removed\": [\"gone\"], \"added\": [\"new\"]}, \"expected\": {\"paint\": [[\"b\", \"v\"], [\"c\", \"v\"], [\"new\", \"v\"]], \"measure\": [], \"removed\": [\"gone\"], \"added\": [\"new\"]}, \"passed\": false}, {\"check\": \"unchanged\", \"actual\": {\"paint\": [], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"variant wrapping width invalidation\", \"actual\": {\"paint\": [[\"r\", \"a\"]], \"measure\": [[\"r\", \"a\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"r\", \"a\"]], \"measure\": [[\"r\", \"a\"]], \"removed\": [], \"added\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.981,"exit_code":0,"observations":[{"actual":{"added":[],"measure":[["a","display"]],"paint":[["a","display"]],"removed":[]},"check":"accessor value changes","expected":{"added":[],"measure":[["a","display"]],"paint":[["a","display"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"],["b","v"]],"removed":[]},"check":"selection removed and added","expected":{"added":[],"measure":[],"paint":[["a","v"],["b","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"check":"error message changes","expected":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[["a","v"]],"paint":[["a","v"]],"removed":[]},"check":"width shrinks wrapping","expected":{"added":[],"measure":[["a","v"]],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"check":"theme-only repaint","expected":{"added":[],"measure":[],"paint":[["a","v"]],"removed":[]},"passed":true},{"actual":{"added":["new"],"measure":[],"paint":[["b","v"],["c","v"],["new","v"]],"removed":["gone"]},"check":"parity and removals","expected":{"added":["new"],"measure":[],"paint":[["b","v"],["c","v"],["new","v"]],"removed":["gone"]},"passed":true},{"actual":{"added":[],"measure":[],"paint":[],"removed":[]},"check":"unchanged","expected":{"added":[],"measure":[],"paint":[],"removed":[]},"passed":true},{"actual":{"added":[],"measure":[["r","a"]],"paint":[["r","a"]],"removed":[]},"check":"variant wrapping width invalidation","expected":{"added":[],"measure":[["r","a"]],"paint":[["r","a"]],"removed":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"accessor value changes\", \"actual\": {\"paint\": [[\"a\", \"display\"]], \"measure\": [[\"a\", \"display\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"display\"]], \"measure\": [[\"a\", \"display\"]], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"selection removed and added\", \"actual\": {\"paint\": [[\"a\", \"v\"], [\"b\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"], [\"b\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"error message changes\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"width shrinks wrapping\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [[\"a\", \"v\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [[\"a\", \"v\"]], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"theme-only repaint\", \"actual\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"a\", \"v\"]], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"parity and removals\", \"actual\": {\"paint\": [[\"b\", \"v\"], [\"c\", \"v\"], [\"new\", \"v\"]], \"measure\": [], \"removed\": [\"gone\"], \"added\": [\"new\"]}, \"expected\": {\"paint\": [[\"b\", \"v\"], [\"c\", \"v\"], [\"new\", \"v\"]], \"measure\": [], \"removed\": [\"gone\"], \"added\": [\"new\"]}, \"passed\": true}, {\"check\": \"unchanged\", \"actual\": {\"paint\": [], \"measure\": [], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [], \"measure\": [], \"removed\": [], \"added\": []}, \"passed\": true}, {\"check\": \"variant wrapping width invalidation\", \"actual\": {\"paint\": [[\"r\", \"a\"]], \"measure\": [[\"r\", \"a\"]], \"removed\": [], \"added\": []}, \"expected\": {\"paint\": [[\"r\", \"a\"]], \"measure\": [[\"r\", \"a\"]], \"removed\": [], \"added\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}