{"abstract":"The table busy per target 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 'k in pending[:1]' still loses a required part of the table contract.","family":"s3-table-interactions-row-actions-busy-per-target","id":"FA-38211","implementations":{"attempt":{"sha256":"844e7485a9bf712bad2ac071f12ae695d3667d901efb7cf97d59d5b10aa9cd55","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[:1]]\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"},"broken":{"sha256":"bf25a6ca50633f944bce66b8afbc154fbfc6985293adc7a550a3503252b9e9fe","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 clicked 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"},"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-busy-per-target","generated_at":"2026-09-29T14:43:08.887788+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 busy per target rule: k in pending.","root_cause":"The busy per target decision uses 'clicked in pending' instead of 'k in pending'.","sha256":"40973319e3a3c0ab48b5e21863986c2c2dac43092c4f081e5b91ba5a7affce4f","title":"Table row action targeting: busy per target · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":45.43,"exit_code":1,"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":{"action":"delete","status":"ready","targets":[{"id":"a","payload":{},"revision":null},{"id":"b","payload":{},"revision":null}]},"check":"one busy member","expected":{"blocked":["b"],"status":"busy","targets":[]},"passed":false},{"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\": 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\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}, {\"id\": \"b\", \"revision\": null, \"payload\": {}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": false}, {\"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":41.198,"exit_code":1,"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":{"action":"delete","status":"ready","targets":[{"id":"a","payload":{},"revision":null},{"id":"b","payload":{},"revision":null}]},"check":"one busy member","expected":{"blocked":["b"],"status":"busy","targets":[]},"passed":false},{"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\": 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\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}, {\"id\": \"b\", \"revision\": null, \"payload\": {}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"busy\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": false}, {\"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":44.653,"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"}