{"abstract":"The table atomic permission block 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.","contract_signature":"rows, clicked, selected, action, permissions, pending, include_hidden, visible, revision","evaluation_group":"s3-table-interactions-row-actions","failed_approach":"The attempted repair 'if len(blocked)==len(ids):' still loses a required part of the table contract.","family":"s3-table-interactions-row-actions-atomic-permission-block","id":"FA-38216","implementations":{"attempt":{"sha256":"ac57fd4bf2739cd2248e2773cd67a3e26681c8b64cc7590ef90c2efcff6a8667","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 len(blocked)==len(ids): 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":"554b00f6244fa75f45b012414815e90b48d8f18b9bc1d0e888f3ec73499c460c","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 False: 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-atomic-permission-block","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.","root_cause":"The atomic permission block decision uses 'if False:' instead of 'if blocked:'.","sha256":"902f67632f8d4d9424a93bf026908f5b0c267e4b4b03c58c06b5b1a550c3fd6b","title":"Table row action targeting: atomic permission block · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.179,"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":{"action":"delete","status":"ready","targets":[{"id":"a","payload":{},"revision":null},{"id":"b","payload":{},"revision":null}]},"check":"one forbidden member","expected":{"blocked":["b"],"status":"forbidden","targets":[]},"passed":false},{"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":{"blocked":[],"status":"forbidden","targets":[]},"check":"empty visible scope","expected":{"status":"empty","targets":[]},"passed":false},{"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\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}, {\"id\": \"b\", \"revision\": null, \"payload\": {}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": false}, {\"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\": \"forbidden\", \"targets\": [], \"blocked\": []}, \"expected\": {\"status\": \"empty\", \"targets\": []}, \"passed\": false}, {\"check\": \"missing row\", \"actual\": {\"status\": \"missing\", \"targets\": []}, \"expected\": {\"status\": \"missing\", \"targets\": []}, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.035,"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":{"action":"delete","status":"ready","targets":[{"id":"a","payload":{},"revision":null},{"id":"b","payload":{},"revision":null}]},"check":"one forbidden member","expected":{"blocked":["b"],"status":"forbidden","targets":[]},"passed":false},{"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\": 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\": \"ready\", \"targets\": [{\"id\": \"a\", \"revision\": null, \"payload\": {}}, {\"id\": \"b\", \"revision\": null, \"payload\": {}}], \"action\": \"delete\"}, \"expected\": {\"status\": \"forbidden\", \"targets\": [], \"blocked\": [\"b\"]}, \"passed\": false}, {\"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"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}