{"abstract":"The table target specific revision result violates the stipulated table row action targeting contract.","category":"Table interactions","checks":8,"contract":"A row action uses current row order, bulk selection only when the clicked row belongs to it and the action permits bulk, optional visible scope, default-deny per-action permissions, atomic busy/permission rejection, explicit empty scope, confirmation policy, and per-row revision snapshots.","evaluation_group":"s3-table-interactions-row-actions","failed_approach":"The attempted repair 'None' still loses a required part of the table contract.","family":"s3-table-interactions-row-actions-target-specific-revision","id":"FA-38236","implementations":{"attempt":{"sha256":"b52d10fb6e7210eeff647315ad7932ec30338da3bfe51120cbd0fddceca04b4a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rows, clicked, selected, action, permissions, pending, include_hidden, visible, revision):\n    by={r['id']:r for r in rows}\n    if clicked not in by: return {'status':'missing','targets':[]}\n    ids=[r['id'] for r in rows if r['id'] in selected] if clicked in selected and action['bulk'] else [clicked]\n    if not include_hidden: ids=[k for k in ids if k in visible]\n    blocked=[k for k in ids if not permissions.get(k,{}).get(action['id'],False)]\n    busy=[k for k in ids if k in pending]\n    if blocked: return {'status':'forbidden','targets':[],'blocked':blocked}\n    if busy: return {'status':'busy','targets':[],'blocked':busy}\n    if not ids: return {'status':'empty','targets':[]}\n    return {'status':'confirm' if action.get('confirm') else 'ready','targets':[{'id':k,'revision':None,'payload':{f:by[k].get(f) for f in action.get('fields',[])}} for k in ids],'action':action['id']}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('ordered bulk selection', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 1}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 2:\n    check('ordered bulk selection', solve([{'id':'a','v':2},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 2}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 3:\n    check('ordered bulk selection', solve([{'id':'a','v':3},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 3}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 4:\n    check('ordered bulk selection', solve([{'id':'a','v':4},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 4}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 5:\n    check('ordered bulk selection', solve([{'id':'a','v':5},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 5}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\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":"aa9d75739ae521541c573b438c1a793dd0d01551fb1053241164221df242a0ce","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rows, clicked, selected, action, permissions, pending, include_hidden, visible, revision):\n    by={r['id']:r for r in rows}\n    if clicked not in by: return {'status':'missing','targets':[]}\n    ids=[r['id'] for r in rows if r['id'] in selected] if clicked in selected and action['bulk'] else [clicked]\n    if not include_hidden: ids=[k for k in ids if k in visible]\n    blocked=[k for k in ids if not permissions.get(k,{}).get(action['id'],False)]\n    busy=[k for k in ids if k in pending]\n    if blocked: return {'status':'forbidden','targets':[],'blocked':blocked}\n    if busy: return {'status':'busy','targets':[],'blocked':busy}\n    if not ids: return {'status':'empty','targets':[]}\n    return {'status':'confirm' if action.get('confirm') else 'ready','targets':[{'id':k,'revision':revision.get(clicked),'payload':{f:by[k].get(f) for f in action.get('fields',[])}} for k in ids],'action':action['id']}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('ordered bulk selection', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 1}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 2:\n    check('ordered bulk selection', solve([{'id':'a','v':2},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 2}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 3:\n    check('ordered bulk selection', solve([{'id':'a','v':3},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 3}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 4:\n    check('ordered bulk selection', solve([{'id':'a','v':4},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 4}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 5:\n    check('ordered bulk selection', solve([{'id':'a','v':5},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 5}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\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":"1fd041e3b20282a80cff41fe1641de6952a9b31714e3826153bead4ef663ce81","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(rows, clicked, selected, action, permissions, pending, include_hidden, visible, revision):\n    by={r['id']:r for r in rows}\n    if clicked not in by: return {'status':'missing','targets':[]}\n    ids=[r['id'] for r in rows if r['id'] in selected] if clicked in selected and action['bulk'] else [clicked]\n    if not include_hidden: ids=[k for k in ids if k in visible]\n    blocked=[k for k in ids if not permissions.get(k,{}).get(action['id'],False)]\n    busy=[k for k in ids if k in pending]\n    if blocked: return {'status':'forbidden','targets':[],'blocked':blocked}\n    if busy: return {'status':'busy','targets':[],'blocked':busy}\n    if not ids: return {'status':'empty','targets':[]}\n    return {'status':'confirm' if action.get('confirm') else 'ready','targets':[{'id':k,'revision':revision.get(k),'payload':{f:by[k].get(f) for f in action.get('fields',[])}} for k in ids],'action':action['id']}\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nif N == 1:\n    check('ordered bulk selection', solve([{'id':'a','v':1},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 1}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 2:\n    check('ordered bulk selection', solve([{'id':'a','v':2},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 2}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 3:\n    check('ordered bulk selection', solve([{'id':'a','v':3},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 3}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 4:\n    check('ordered bulk selection', solve([{'id':'a','v':4},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 4}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\n\nif N == 5:\n    check('ordered bulk selection', solve([{'id':'a','v':5},{'id':'b','v':2},{'id':'c','v':3}], 'a', ['c','a'], {'id':'delete','bulk':True,'confirm':True,'fields':['v']}, {'a':{'delete':True},'c':{'delete':True}}, [], True, ['a','b'], {'a':1,'b':2,'c':3}), {'status': 'confirm', 'targets': [{'id': 'a', 'revision': 1, 'payload': {'v': 5}}, {'id': 'c', 'revision': 3, 'payload': {'v': 3}}], 'action': 'delete'})\n    check('clicked outside selection', solve([{'id':'a'},{'id':'b'}], 'b', ['a'], {'id':'open','bulk':True,'confirm':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {'a':1,'b':2}), {'status': 'ready', 'targets': [{'id': 'b', 'revision': 2, 'payload': {}}], 'action': 'open'})\n    check('single action selected', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':False}, {'a':{'open':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('one forbidden member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'open':True}}, [], True, ['a','b'], {}), {'status': 'forbidden', 'targets': [], 'blocked': ['b']})\n    check('one busy member', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'delete','bulk':True}, {'a':{'delete':True},'b':{'delete':True}}, ['unrelated','b'], True, ['a','b'], {}), {'status': 'busy', 'targets': [], 'blocked': ['b']})\n    check('hidden targets excluded', solve([{'id':'a'},{'id':'b'}], 'a', ['a','b'], {'id':'open','bulk':True}, {'a':{'open':True},'b':{'open':True}}, [], False, ['a'], {}), {'status': 'ready', 'targets': [{'id': 'a', 'revision': None, 'payload': {}}], 'action': 'open'})\n    check('empty visible scope', solve([{'id':'a'}], 'a', [], {'id':'open','bulk':False}, {'a':{'open':True}}, [], False, [], {}), {'status': 'empty', 'targets': []})\n    check('missing row', solve([], 'a', [], {'id':'open','bulk':False}, {}, [], True, [], {}), {'status': 'missing', 'targets': []})\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":"Source row IDs are unique; permission maps hold per-action booleans and revision snapshots are explicit. 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-row-actions-target-specific-revision","generated_at":"2026-09-29T14:43:09.209364+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"An offline table UI model isolates table row action targeting, including adversarial row/column relationships.","repair":"Apply the complete target specific revision rule: revision.get(k).","root_cause":"The target specific revision decision uses 'revision.get(clicked)' instead of 'revision.get(k)'.","sha256":"7591885ec6d1d64d64ea45f19992fde927fdb0e5f861dff2ab341294606b24a5","title":"Table row action targeting: target specific revision · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":43.296,"exit_code":1,"observations":[{"actual":{"action":"delete","status":"confirm","targets":[{"id":"a","payload":{"v":1},"revision":null},{"id":"c","payload":{"v":3},"revision":null}]},"check":"ordered bulk selection","expected":{"action":"delete","status":"confirm","targets":[{"id":"a","payload":{"v":1},"revision":1},{"id":"c","payload":{"v":3},"revision":3}]},"passed":false},{"actual":{"action":"open","status":"ready","targets":[{"id":"b","payload":{},"revision":null}]},"check":"clicked outside selection","expected":{"action":"open","status":"ready","targets":[{"id":"b","payload":{},"revision":2}]},"passed":false},{"actual":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"check":"single action selected","expected":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"passed":true},{"actual":{"blocked":["b"],"status":"forbidden","targets":[]},"check":"one forbidden member","expected":{"blocked":["b"],"status":"forbidden","targets":[]},"passed":true},{"actual":{"blocked":["b"],"status":"busy","targets":[]},"check":"one busy member","expected":{"blocked":["b"],"status":"busy","targets":[]},"passed":true},{"actual":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"check":"hidden targets excluded","expected":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"passed":true},{"actual":{"status":"empty","targets":[]},"check":"empty visible scope","expected":{"status":"empty","targets":[]},"passed":true},{"actual":{"status":"missing","targets":[]},"check":"missing row","expected":{"status":"missing","targets":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ordered bulk selection\", \"actual\": {\"status\": \"confirm\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {\"v\": 1}}, {\"id\": \"c\", \"revision\": null, \"payload\": {\"v\": 3}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"confirm\", \"targets\": [{\"id\": \"a\", \"revision\": 1, \"payload\": {\"v\": 1}}, {\"id\": \"c\", \"revision\": 3, \"payload\": {\"v\": 3}}], \"action\": \"delete\"}, \"passed\": false}, {\"check\": \"clicked outside selection\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"b\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"b\", \"revision\": 2, \"payload\": {}}], \"action\": \"open\"}, \"passed\": false}, {\"check\": \"single action selected\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"one forbidden member\", \"actual\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"expected\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": true}, {\"check\": \"one busy member\", \"actual\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"expected\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": true}, {\"check\": \"hidden targets excluded\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"empty visible scope\", \"actual\": {\"status\": \"empty\", \"targets\": []}, \"expected\": {\"status\": \"empty\", \"targets\": []}, \"passed\": true}, {\"check\": \"missing row\", \"actual\": {\"status\": \"missing\", \"targets\": []}, \"expected\": {\"status\": \"missing\", \"targets\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":47.452,"exit_code":1,"observations":[{"actual":{"action":"delete","status":"confirm","targets":[{"id":"a","payload":{"v":1},"revision":1},{"id":"c","payload":{"v":3},"revision":1}]},"check":"ordered bulk selection","expected":{"action":"delete","status":"confirm","targets":[{"id":"a","payload":{"v":1},"revision":1},{"id":"c","payload":{"v":3},"revision":3}]},"passed":false},{"actual":{"action":"open","status":"ready","targets":[{"id":"b","payload":{},"revision":2}]},"check":"clicked outside selection","expected":{"action":"open","status":"ready","targets":[{"id":"b","payload":{},"revision":2}]},"passed":true},{"actual":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"check":"single action selected","expected":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"passed":true},{"actual":{"blocked":["b"],"status":"forbidden","targets":[]},"check":"one forbidden member","expected":{"blocked":["b"],"status":"forbidden","targets":[]},"passed":true},{"actual":{"blocked":["b"],"status":"busy","targets":[]},"check":"one busy member","expected":{"blocked":["b"],"status":"busy","targets":[]},"passed":true},{"actual":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"check":"hidden targets excluded","expected":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"passed":true},{"actual":{"status":"empty","targets":[]},"check":"empty visible scope","expected":{"status":"empty","targets":[]},"passed":true},{"actual":{"status":"missing","targets":[]},"check":"missing row","expected":{"status":"missing","targets":[]},"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ordered bulk selection\", \"actual\": {\"status\": \"confirm\", \"targets\": [{\"id\": \"a\", \"revision\": 1, \"payload\": {\"v\": 1}}, {\"id\": \"c\", \"revision\": 1, \"payload\": {\"v\": 3}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"confirm\", \"targets\": [{\"id\": \"a\", \"revision\": 1, \"payload\": {\"v\": 1}}, {\"id\": \"c\", \"revision\": 3, \"payload\": {\"v\": 3}}], \"action\": \"delete\"}, \"passed\": false}, {\"check\": \"clicked outside selection\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"b\", \"revision\": 2, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"b\", \"revision\": 2, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"single action selected\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"one forbidden member\", \"actual\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"expected\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": true}, {\"check\": \"one busy member\", \"actual\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"expected\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": true}, {\"check\": \"hidden targets excluded\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"empty visible scope\", \"actual\": {\"status\": \"empty\", \"targets\": []}, \"expected\": {\"status\": \"empty\", \"targets\": []}, \"passed\": true}, {\"check\": \"missing row\", \"actual\": {\"status\": \"missing\", \"targets\": []}, \"expected\": {\"status\": \"missing\", \"targets\": []}, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":48.519,"exit_code":0,"observations":[{"actual":{"action":"delete","status":"confirm","targets":[{"id":"a","payload":{"v":1},"revision":1},{"id":"c","payload":{"v":3},"revision":3}]},"check":"ordered bulk selection","expected":{"action":"delete","status":"confirm","targets":[{"id":"a","payload":{"v":1},"revision":1},{"id":"c","payload":{"v":3},"revision":3}]},"passed":true},{"actual":{"action":"open","status":"ready","targets":[{"id":"b","payload":{},"revision":2}]},"check":"clicked outside selection","expected":{"action":"open","status":"ready","targets":[{"id":"b","payload":{},"revision":2}]},"passed":true},{"actual":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"check":"single action selected","expected":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"passed":true},{"actual":{"blocked":["b"],"status":"forbidden","targets":[]},"check":"one forbidden member","expected":{"blocked":["b"],"status":"forbidden","targets":[]},"passed":true},{"actual":{"blocked":["b"],"status":"busy","targets":[]},"check":"one busy member","expected":{"blocked":["b"],"status":"busy","targets":[]},"passed":true},{"actual":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"check":"hidden targets excluded","expected":{"action":"open","status":"ready","targets":[{"id":"a","payload":{},"revision":null}]},"passed":true},{"actual":{"status":"empty","targets":[]},"check":"empty visible scope","expected":{"status":"empty","targets":[]},"passed":true},{"actual":{"status":"missing","targets":[]},"check":"missing row","expected":{"status":"missing","targets":[]},"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ordered bulk selection\", \"actual\": {\"status\": \"confirm\", \"targets\": [{\"id\": \"a\", \"revision\": 1, \"payload\": {\"v\": 1}}, {\"id\": \"c\", \"revision\": 3, \"payload\": {\"v\": 3}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"confirm\", \"targets\": [{\"id\": \"a\", \"revision\": 1, \"payload\": {\"v\": 1}}, {\"id\": \"c\", \"revision\": 3, \"payload\": {\"v\": 3}}], \"action\": \"delete\"}, \"passed\": true}, {\"check\": \"clicked outside selection\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"b\", \"revision\": 2, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"b\", \"revision\": 2, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"single action selected\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"one forbidden member\", \"actual\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"expected\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": true}, {\"check\": \"one busy member\", \"actual\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"expected\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": true}, {\"check\": \"hidden targets excluded\", \"actual\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"expected\": {\"status\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}], \"action\": \"open\"}, \"passed\": true}, {\"check\": \"empty visible scope\", \"actual\": {\"status\": \"empty\", \"targets\": []}, \"expected\": {\"status\": \"empty\", \"targets\": []}, \"passed\": true}, {\"check\": \"missing row\", \"actual\": {\"status\": \"missing\", \"targets\": []}, \"expected\": {\"status\": \"missing\", \"targets\": []}, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}