{"abstract":"The table empty group policy result violates the stipulated table grouped row projection contract.","category":"Table interactions","checks":6,"contract":"Table group headers retain stable namespaced group keys distinct from labels, count visible members, derive tri-state selection over visible children, honor empty/collapsed group policies, and reset row striping within each group.","evaluation_group":"s3-table-interactions-grouped-rows","failed_approach":"The attempted repair 'if False:' still loses a required part of the table contract.","family":"s3-table-interactions-grouped-rows-empty-group-policy","id":"FA-37846","implementations":{"attempt":{"sha256":"5663ab3c4d790c4150922dfa3db3393ace81a3568da12be501836109956490ed","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(groups, collapsed, hidden, selected, show_empty):\n    out=[]\n    for g in groups:\n        children=[r for r in g['rows'] if r['id'] not in hidden]\n        if False: continue\n        key=g['key']\n        picked=[r for r in children if r['id'] in selected]\n        out.append({'kind':'group','key':('group',key),'label':g['label'],'count':len(children),'checked':bool(children) and len(picked)==len(children),'mixed':0<len(picked)<len(children)})\n        if key in collapsed: continue\n        out += [{'kind':'row','key':('row',r['id']),'group':key,'row':r,'stripe':i%2} for i,r in enumerate(children)]\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':1},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 1}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 2:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':2},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 2}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 3:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':3},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 3}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 4:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':4},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 4}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 5:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':5},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 5}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\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":"8b4efe47b5d21fa8413ea2b163262b3b25718110d54c4b29ac5486b91c24eeed","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(groups, collapsed, hidden, selected, show_empty):\n    out=[]\n    for g in groups:\n        children=[r for r in g['rows'] if r['id'] not in hidden]\n        if not children: continue\n        key=g['key']\n        picked=[r for r in children if r['id'] in selected]\n        out.append({'kind':'group','key':('group',key),'label':g['label'],'count':len(children),'checked':bool(children) and len(picked)==len(children),'mixed':0<len(picked)<len(children)})\n        if key in collapsed: continue\n        out += [{'kind':'row','key':('row',r['id']),'group':key,'row':r,'stripe':i%2} for i,r in enumerate(children)]\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':1},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 1}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 2:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':2},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 2}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 3:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':3},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 3}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 4:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':4},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 4}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 5:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':5},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 5}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\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":"0efa1b8931fc2ac0fda3ec681533f2cc051b10309dbe939c5dc57ce50f3f342d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(groups, collapsed, hidden, selected, show_empty):\n    out=[]\n    for g in groups:\n        children=[r for r in g['rows'] if r['id'] not in hidden]\n        if not children and not show_empty: continue\n        key=g['key']\n        picked=[r for r in children if r['id'] in selected]\n        out.append({'kind':'group','key':('group',key),'label':g['label'],'count':len(children),'checked':bool(children) and len(picked)==len(children),'mixed':0<len(picked)<len(children)})\n        if key in collapsed: continue\n        out += [{'kind':'row','key':('row',r['id']),'group':key,'row':r,'stripe':i%2} for i,r in enumerate(children)]\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':1},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 1}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 2:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':2},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 2}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 3:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':3},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 3}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 4:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':4},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 4}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\n\nif N == 5:\n    check('partial selected group', solve([{'key':'g1','label':'Group','rows':[{'id':'a','v':5},{'id':'b'}]},{'key':'g2','label':'Group','rows':[{'id':'c'},{'id':'d'}]}], [], [], ['a','c','d'], False), [{'kind': 'group', 'key': ('group', 'g1'), 'label': 'Group', 'count': 2, 'checked': False, 'mixed': True}, {'kind': 'row', 'key': ('row', 'a'), 'group': 'g1', 'row': {'id': 'a', 'v': 5}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'b'), 'group': 'g1', 'row': {'id': 'b'}, 'stripe': 1}, {'kind': 'group', 'key': ('group', 'g2'), 'label': 'Group', 'count': 2, 'checked': True, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g2', 'row': {'id': 'c'}, 'stripe': 0}, {'kind': 'row', 'key': ('row', 'd'), 'group': 'g2', 'row': {'id': 'd'}, 'stripe': 1}])\n    check('collapsed group', solve([{'key':'g','label':'Label','rows':[{'id':'a'}]}], ['g'], [], ['a'], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'Label', 'count': 1, 'checked': True, 'mixed': False}])\n    check('hidden members', solve([{'key':'g','label':'G','rows':[{'id':'a'},{'id':'b'},{'id':'c'}]}], [], ['a','b'], [], False), [{'kind': 'group', 'key': ('group', 'g'), 'label': 'G', 'count': 1, 'checked': False, 'mixed': False}, {'kind': 'row', 'key': ('row', 'c'), 'group': 'g', 'row': {'id': 'c'}, 'stripe': 0}])\n    check('empty shown', solve([{'key':'g','label':'','rows':[]}], [], [], [], True), [{'kind': 'group', 'key': ('group', 'g'), 'label': '', 'count': 0, 'checked': False, 'mixed': False}])\n    check('empty removed', solve([{'key':'g','label':'G','rows':[]}], [], [], [], False), [])\n    check('no groups', solve([], [], [], [], False), [])\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":"Group keys and member row IDs are stable and unique; group label strings may be equal or empty. 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-grouped-rows-empty-group-policy","generated_at":"2026-09-29T14:43:05.221032+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates table grouped row projection, including adversarial row/column relationships.","repair":"Apply the complete empty group policy rule: if not children and not show_empty:.","root_cause":"The empty group policy decision uses 'if not children:' instead of 'if not children and not show_empty:'.","sha256":"de371111bf7a007b773ddd7f600b49dc7873bd33661184218cf6a561f4c449b1","title":"Table grouped row projection: empty group policy · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":44.321,"exit_code":1,"observations":[{"actual":[{"checked":false,"count":2,"key":["group","g1"],"kind":"group","label":"Group","mixed":true},{"group":"g1","key":["row","a"],"kind":"row","row":{"id":"a","v":1},"stripe":0},{"group":"g1","key":["row","b"],"kind":"row","row":{"id":"b"},"stripe":1},{"checked":true,"count":2,"key":["group","g2"],"kind":"group","label":"Group","mixed":false},{"group":"g2","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0},{"group":"g2","key":["row","d"],"kind":"row","row":{"id":"d"},"stripe":1}],"check":"partial selected group","expected":[{"checked":false,"count":2,"key":["group","g1"],"kind":"group","label":"Group","mixed":true},{"group":"g1","key":["row","a"],"kind":"row","row":{"id":"a","v":1},"stripe":0},{"group":"g1","key":["row","b"],"kind":"row","row":{"id":"b"},"stripe":1},{"checked":true,"count":2,"key":["group","g2"],"kind":"group","label":"Group","mixed":false},{"group":"g2","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0},{"group":"g2","key":["row","d"],"kind":"row","row":{"id":"d"},"stripe":1}],"passed":true},{"actual":[{"checked":true,"count":1,"key":["group","g"],"kind":"group","label":"Label","mixed":false}],"check":"collapsed group","expected":[{"checked":true,"count":1,"key":["group","g"],"kind":"group","label":"Label","mixed":false}],"passed":true},{"actual":[{"checked":false,"count":1,"key":["group","g"],"kind":"group","label":"G","mixed":false},{"group":"g","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0}],"check":"hidden members","expected":[{"checked":false,"count":1,"key":["group","g"],"kind":"group","label":"G","mixed":false},{"group":"g","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0}],"passed":true},{"actual":[{"checked":false,"count":0,"key":["group","g"],"kind":"group","label":"","mixed":false}],"check":"empty shown","expected":[{"checked":false,"count":0,"key":["group","g"],"kind":"group","label":"","mixed":false}],"passed":true},{"actual":[{"checked":false,"count":0,"key":["group","g"],"kind":"group","label":"G","mixed":false}],"check":"empty removed","expected":[],"passed":false},{"actual":[],"check":"no groups","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"partial selected group\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g1\"], \"label\": \"Group\", \"count\": 2, \"checked\": false, \"mixed\": true}, {\"kind\": \"row\", \"key\": [\"row\", \"a\"], \"group\": \"g1\", \"row\": {\"id\": \"a\", \"v\": 1}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"b\"], \"group\": \"g1\", \"row\": {\"id\": \"b\"}, \"stripe\": 1}, {\"kind\": \"group\", \"key\": [\"group\", \"g2\"], \"label\": \"Group\", \"count\": 2, \"checked\": true, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g2\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"d\"], \"group\": \"g2\", \"row\": {\"id\": \"d\"}, \"stripe\": 1}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g1\"], \"label\": \"Group\", \"count\": 2, \"checked\": false, \"mixed\": true}, {\"kind\": \"row\", \"key\": [\"row\", \"a\"], \"group\": \"g1\", \"row\": {\"id\": \"a\", \"v\": 1}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"b\"], \"group\": \"g1\", \"row\": {\"id\": \"b\"}, \"stripe\": 1}, {\"kind\": \"group\", \"key\": [\"group\", \"g2\"], \"label\": \"Group\", \"count\": 2, \"checked\": true, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g2\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"d\"], \"group\": \"g2\", \"row\": {\"id\": \"d\"}, \"stripe\": 1}], \"passed\": true}, {\"check\": \"collapsed group\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"Label\", \"count\": 1, \"checked\": true, \"mixed\": false}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"Label\", \"count\": 1, \"checked\": true, \"mixed\": false}], \"passed\": true}, {\"check\": \"hidden members\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 1, \"checked\": false, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 1, \"checked\": false, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}], \"passed\": true}, {\"check\": \"empty shown\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"\", \"count\": 0, \"checked\": false, \"mixed\": false}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"\", \"count\": 0, \"checked\": false, \"mixed\": false}], \"passed\": true}, {\"check\": \"empty removed\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 0, \"checked\": false, \"mixed\": false}], \"expected\": [], \"passed\": false}, {\"check\": \"no groups\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.224,"exit_code":1,"observations":[{"actual":[{"checked":false,"count":2,"key":["group","g1"],"kind":"group","label":"Group","mixed":true},{"group":"g1","key":["row","a"],"kind":"row","row":{"id":"a","v":1},"stripe":0},{"group":"g1","key":["row","b"],"kind":"row","row":{"id":"b"},"stripe":1},{"checked":true,"count":2,"key":["group","g2"],"kind":"group","label":"Group","mixed":false},{"group":"g2","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0},{"group":"g2","key":["row","d"],"kind":"row","row":{"id":"d"},"stripe":1}],"check":"partial selected group","expected":[{"checked":false,"count":2,"key":["group","g1"],"kind":"group","label":"Group","mixed":true},{"group":"g1","key":["row","a"],"kind":"row","row":{"id":"a","v":1},"stripe":0},{"group":"g1","key":["row","b"],"kind":"row","row":{"id":"b"},"stripe":1},{"checked":true,"count":2,"key":["group","g2"],"kind":"group","label":"Group","mixed":false},{"group":"g2","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0},{"group":"g2","key":["row","d"],"kind":"row","row":{"id":"d"},"stripe":1}],"passed":true},{"actual":[{"checked":true,"count":1,"key":["group","g"],"kind":"group","label":"Label","mixed":false}],"check":"collapsed group","expected":[{"checked":true,"count":1,"key":["group","g"],"kind":"group","label":"Label","mixed":false}],"passed":true},{"actual":[{"checked":false,"count":1,"key":["group","g"],"kind":"group","label":"G","mixed":false},{"group":"g","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0}],"check":"hidden members","expected":[{"checked":false,"count":1,"key":["group","g"],"kind":"group","label":"G","mixed":false},{"group":"g","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0}],"passed":true},{"actual":[],"check":"empty shown","expected":[{"checked":false,"count":0,"key":["group","g"],"kind":"group","label":"","mixed":false}],"passed":false},{"actual":[],"check":"empty removed","expected":[],"passed":true},{"actual":[],"check":"no groups","expected":[],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"partial selected group\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g1\"], \"label\": \"Group\", \"count\": 2, \"checked\": false, \"mixed\": true}, {\"kind\": \"row\", \"key\": [\"row\", \"a\"], \"group\": \"g1\", \"row\": {\"id\": \"a\", \"v\": 1}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"b\"], \"group\": \"g1\", \"row\": {\"id\": \"b\"}, \"stripe\": 1}, {\"kind\": \"group\", \"key\": [\"group\", \"g2\"], \"label\": \"Group\", \"count\": 2, \"checked\": true, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g2\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"d\"], \"group\": \"g2\", \"row\": {\"id\": \"d\"}, \"stripe\": 1}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g1\"], \"label\": \"Group\", \"count\": 2, \"checked\": false, \"mixed\": true}, {\"kind\": \"row\", \"key\": [\"row\", \"a\"], \"group\": \"g1\", \"row\": {\"id\": \"a\", \"v\": 1}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"b\"], \"group\": \"g1\", \"row\": {\"id\": \"b\"}, \"stripe\": 1}, {\"kind\": \"group\", \"key\": [\"group\", \"g2\"], \"label\": \"Group\", \"count\": 2, \"checked\": true, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g2\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"d\"], \"group\": \"g2\", \"row\": {\"id\": \"d\"}, \"stripe\": 1}], \"passed\": true}, {\"check\": \"collapsed group\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"Label\", \"count\": 1, \"checked\": true, \"mixed\": false}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"Label\", \"count\": 1, \"checked\": true, \"mixed\": false}], \"passed\": true}, {\"check\": \"hidden members\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 1, \"checked\": false, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 1, \"checked\": false, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}], \"passed\": true}, {\"check\": \"empty shown\", \"actual\": [], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"\", \"count\": 0, \"checked\": false, \"mixed\": false}], \"passed\": false}, {\"check\": \"empty removed\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"no groups\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.861,"exit_code":0,"observations":[{"actual":[{"checked":false,"count":2,"key":["group","g1"],"kind":"group","label":"Group","mixed":true},{"group":"g1","key":["row","a"],"kind":"row","row":{"id":"a","v":1},"stripe":0},{"group":"g1","key":["row","b"],"kind":"row","row":{"id":"b"},"stripe":1},{"checked":true,"count":2,"key":["group","g2"],"kind":"group","label":"Group","mixed":false},{"group":"g2","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0},{"group":"g2","key":["row","d"],"kind":"row","row":{"id":"d"},"stripe":1}],"check":"partial selected group","expected":[{"checked":false,"count":2,"key":["group","g1"],"kind":"group","label":"Group","mixed":true},{"group":"g1","key":["row","a"],"kind":"row","row":{"id":"a","v":1},"stripe":0},{"group":"g1","key":["row","b"],"kind":"row","row":{"id":"b"},"stripe":1},{"checked":true,"count":2,"key":["group","g2"],"kind":"group","label":"Group","mixed":false},{"group":"g2","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0},{"group":"g2","key":["row","d"],"kind":"row","row":{"id":"d"},"stripe":1}],"passed":true},{"actual":[{"checked":true,"count":1,"key":["group","g"],"kind":"group","label":"Label","mixed":false}],"check":"collapsed group","expected":[{"checked":true,"count":1,"key":["group","g"],"kind":"group","label":"Label","mixed":false}],"passed":true},{"actual":[{"checked":false,"count":1,"key":["group","g"],"kind":"group","label":"G","mixed":false},{"group":"g","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0}],"check":"hidden members","expected":[{"checked":false,"count":1,"key":["group","g"],"kind":"group","label":"G","mixed":false},{"group":"g","key":["row","c"],"kind":"row","row":{"id":"c"},"stripe":0}],"passed":true},{"actual":[{"checked":false,"count":0,"key":["group","g"],"kind":"group","label":"","mixed":false}],"check":"empty shown","expected":[{"checked":false,"count":0,"key":["group","g"],"kind":"group","label":"","mixed":false}],"passed":true},{"actual":[],"check":"empty removed","expected":[],"passed":true},{"actual":[],"check":"no groups","expected":[],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"partial selected group\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g1\"], \"label\": \"Group\", \"count\": 2, \"checked\": false, \"mixed\": true}, {\"kind\": \"row\", \"key\": [\"row\", \"a\"], \"group\": \"g1\", \"row\": {\"id\": \"a\", \"v\": 1}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"b\"], \"group\": \"g1\", \"row\": {\"id\": \"b\"}, \"stripe\": 1}, {\"kind\": \"group\", \"key\": [\"group\", \"g2\"], \"label\": \"Group\", \"count\": 2, \"checked\": true, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g2\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"d\"], \"group\": \"g2\", \"row\": {\"id\": \"d\"}, \"stripe\": 1}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g1\"], \"label\": \"Group\", \"count\": 2, \"checked\": false, \"mixed\": true}, {\"kind\": \"row\", \"key\": [\"row\", \"a\"], \"group\": \"g1\", \"row\": {\"id\": \"a\", \"v\": 1}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"b\"], \"group\": \"g1\", \"row\": {\"id\": \"b\"}, \"stripe\": 1}, {\"kind\": \"group\", \"key\": [\"group\", \"g2\"], \"label\": \"Group\", \"count\": 2, \"checked\": true, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g2\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}, {\"kind\": \"row\", \"key\": [\"row\", \"d\"], \"group\": \"g2\", \"row\": {\"id\": \"d\"}, \"stripe\": 1}], \"passed\": true}, {\"check\": \"collapsed group\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"Label\", \"count\": 1, \"checked\": true, \"mixed\": false}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"Label\", \"count\": 1, \"checked\": true, \"mixed\": false}], \"passed\": true}, {\"check\": \"hidden members\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 1, \"checked\": false, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"G\", \"count\": 1, \"checked\": false, \"mixed\": false}, {\"kind\": \"row\", \"key\": [\"row\", \"c\"], \"group\": \"g\", \"row\": {\"id\": \"c\"}, \"stripe\": 0}], \"passed\": true}, {\"check\": \"empty shown\", \"actual\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"\", \"count\": 0, \"checked\": false, \"mixed\": false}], \"expected\": [{\"kind\": \"group\", \"key\": [\"group\", \"g\"], \"label\": \"\", \"count\": 0, \"checked\": false, \"mixed\": false}], \"passed\": true}, {\"check\": \"empty removed\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"no groups\", \"actual\": [], \"expected\": [], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}