{"abstract":"Large living groups are penalised by their size.","category":"Go territory scoring","checks":8,"contract":"Input [board, komi_tenths]. Each colour scores stones + empty regions bordered only by it, minus two points per orthogonally connected chain. Return [black, white, margin_tenths] with margin = 10*(black-white) - komi.","evaluation_group":"w2-go-territory-scoring-group-tax","failed_approach":"Exempting single stones from the tax undercharges lone stones.","family":"w2-go-territory-scoring-group-tax-tax-unit","id":"FA-83036","implementations":{"attempt":{"sha256":"fe8b589cc461c0617f2f3f30c64586453a3e629f5674dee133f8ae155065ad4a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    board, komi = x\n    n = len(board)\n    m = len(board[0])\n    score = {'B': 0, 'W': 0}\n    groups = {'B': 0, 'W': 0}\n    seen = set()\n    for r in range(n):\n        for c in range(m):\n            if (r, c) in seen:\n                continue\n            col = board[r][c]\n            seen.add((r, c))\n            stack = [(r, c)]\n            size = 0\n            touch = set()\n            while stack:\n                i, j = stack.pop()\n                size += 1\n                for p, q in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):\n                    if 0 <= p < n and 0 <= q < m:\n                        v = board[p][q]\n                        if v == col and (p, q) not in seen:\n                            seen.add((p, q))\n                            stack.append((p, q))\n                        elif v != col:\n                            touch.add(v)\n            if col == '.':\n                if len(touch) == 1:\n                    score[touch.pop()] += size\n            else:\n                score[col] += size\n                groups[col] += 1 if size > 1 else 0\n    b = score['B'] - 2 * groups['B']\n    w = score['W'] - 2 * groups['W']\n    return [b, w, b * 10 - w * 10 - komi]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['B..W', 'B..W', 'B..W', 'B..W'], 75], [2, 2, -75]], [[['.W.B.', 'W.WB.', '.WB..', 'WB...', 'B....'], 75], [8, -2, 25]], [[['BBBB', 'B..B', 'B..B', 'BBBB'], 20], [14, 0, 120]], [[['WWW', 'W.W', 'WWW'], 0], [0, 7, -70]], [[['B.W', '...', 'W.B'], 5], [-2, -2, -5]], [[['.B...', 'B....', '.....', '....W', '...W.'], 65], [-1, -1, -65]], [[['BW.', 'BW.', 'BW.'], 75], [1, 4, -105]], [[['WB.B', 'B.B.', '.B..', 'B...'], 0], [3, -1, 40]]], [[[['B.B.W', '.B.W.', 'B.BW.', 'BBW.W', '..W..'], 5], [0, 3, -35]], [[['WB.B', 'B.B.', '.B..', 'B...'], 0], [3, -1, 40]], [[['..W', '.W.', 'W..'], 5], [0, 3, -35]], [[['B....B', '......', '..WW..', '..WW..', '......', 'B....B'], 65], [-4, 2, -125]], [[['..WW', '.W..', 'B...'], 75], [-1, -1, -75]], [[['..WW', '.W.B', '.WWW', 'B..B'], 20], [-3, 2, -70]], [[['W..B', 'W...', '.W.W', '.W..', 'W.W.'], 0], [-1, 0, -10]], [[['.W...', 'W....', '.....', '....W', 'W....'], 5], [0, 17, -175]]], [[[['WWW', 'W.W', 'WWW'], 0], [0, 7, -70]], [[['..B', '..B', '...', '...', '..B'], 65], [11, 0, 45]], [[['B..', 'B.W', '.W.'], 75], [0, -1, -65]], [[['W..BW.', '.W....', '......'], 20], [-1, -3, 0]], [[['BBBB', '....', '.W.B', 'BBB.', '.BBB', 'BB.B'], 0], [11, -1, 120]], [[['...', '.BW', '.B.', '...', 'B.B', 'BB.'], 5], [1, -1, 15]], [[['B.B', 'WWB', 'BWB', 'BWB', 'WBB'], 65], [3, 1, -45]], [[['B.WBB', 'W.B..', 'W.WWB', '.WB.B', '.WWWW', '..W.B'], 75], [-4, 7, -185]]], [[[['B....B', '......', '..WW..', '..WW..', '......', 'B....B'], 65], [-4, 2, -125]], [[['.WWB', '.BB.', '.BBB', '..B.'], 20], [5, 0, 30]], [[['B.B...', '......', '..WWB.', '.WB.W.', 'WWB.B.'], 0], [-4, 0, -40]], [[['.WWBBB', 'WBWB.W', 'BBB.W.', 'BB..BB', 'BWB.B.', 'WWW.WW'], 5], [7, 1, 55]], [[['BBBB', 'B..B', 'W..B', '.WBB', 'WB..', '.B..'], 65], [11, -2, 65]], [[['WWWB.W', 'WB....', 'W.WB..', 'W.BB.W', 'BBW...', '.BB.WW'], 75], [2, 0, -55]], [[['BWB', 'W.W', 'WBW', 'BWB', '.W.', 'BWW'], 20], [-6, 1, -90]], [[['.BBW', '.WB.', 'W...', '....', '....'], 0], [1, -3, 40]]], [[[['W..B', 'W...', '.W.W', '.W..', 'W.W.'], 0], [-1, 0, -10]], [[['.BBW', '.WB.', 'W...', '....', '....'], 0], [1, -3, 40]], [[['B..', 'B..', '.B.', '..B', '..B'], 65], [9, 0, 25]], [[['....W.', '...B.B', 'BBBB..', '..B.W.', '.B.B.W'], 75], [5, -3, 5]], [[['..B', '.BW', 'B.B'], 20], [0, -1, -10]], [[['.BB..B', '......', 'B.B.BB', '.BBB..', '.B....'], 0], [20, 0, 200]], [[['W..', '.B.', '.W.', '...'], 5], [-1, -2, 5]], [[['..WW', 'B.WW', 'WBBW', '.WBW', 'WWBW', 'B..W'], 65], [0, 7, -135]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"group tax case %d\" % i, solve(args), expected)\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":"d8f69254e1d6b9aa8cfb730633ecdcb2d962d441d172b2e8a3ab292acb1636cd","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    board, komi = x\n    n = len(board)\n    m = len(board[0])\n    score = {'B': 0, 'W': 0}\n    groups = {'B': 0, 'W': 0}\n    seen = set()\n    for r in range(n):\n        for c in range(m):\n            if (r, c) in seen:\n                continue\n            col = board[r][c]\n            seen.add((r, c))\n            stack = [(r, c)]\n            size = 0\n            touch = set()\n            while stack:\n                i, j = stack.pop()\n                size += 1\n                for p, q in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):\n                    if 0 <= p < n and 0 <= q < m:\n                        v = board[p][q]\n                        if v == col and (p, q) not in seen:\n                            seen.add((p, q))\n                            stack.append((p, q))\n                        elif v != col:\n                            touch.add(v)\n            if col == '.':\n                if len(touch) == 1:\n                    score[touch.pop()] += size\n            else:\n                score[col] += size\n                groups[col] += size\n    b = score['B'] - 2 * groups['B']\n    w = score['W'] - 2 * groups['W']\n    return [b, w, b * 10 - w * 10 - komi]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['B..W', 'B..W', 'B..W', 'B..W'], 75], [2, 2, -75]], [[['.W.B.', 'W.WB.', '.WB..', 'WB...', 'B....'], 75], [8, -2, 25]], [[['BBBB', 'B..B', 'B..B', 'BBBB'], 20], [14, 0, 120]], [[['WWW', 'W.W', 'WWW'], 0], [0, 7, -70]], [[['B.W', '...', 'W.B'], 5], [-2, -2, -5]], [[['.B...', 'B....', '.....', '....W', '...W.'], 65], [-1, -1, -65]], [[['BW.', 'BW.', 'BW.'], 75], [1, 4, -105]], [[['WB.B', 'B.B.', '.B..', 'B...'], 0], [3, -1, 40]]], [[[['B.B.W', '.B.W.', 'B.BW.', 'BBW.W', '..W..'], 5], [0, 3, -35]], [[['WB.B', 'B.B.', '.B..', 'B...'], 0], [3, -1, 40]], [[['..W', '.W.', 'W..'], 5], [0, 3, -35]], [[['B....B', '......', '..WW..', '..WW..', '......', 'B....B'], 65], [-4, 2, -125]], [[['..WW', '.W..', 'B...'], 75], [-1, -1, -75]], [[['..WW', '.W.B', '.WWW', 'B..B'], 20], [-3, 2, -70]], [[['W..B', 'W...', '.W.W', '.W..', 'W.W.'], 0], [-1, 0, -10]], [[['.W...', 'W....', '.....', '....W', 'W....'], 5], [0, 17, -175]]], [[[['WWW', 'W.W', 'WWW'], 0], [0, 7, -70]], [[['..B', '..B', '...', '...', '..B'], 65], [11, 0, 45]], [[['B..', 'B.W', '.W.'], 75], [0, -1, -65]], [[['W..BW.', '.W....', '......'], 20], [-1, -3, 0]], [[['BBBB', '....', '.W.B', 'BBB.', '.BBB', 'BB.B'], 0], [11, -1, 120]], [[['...', '.BW', '.B.', '...', 'B.B', 'BB.'], 5], [1, -1, 15]], [[['B.B', 'WWB', 'BWB', 'BWB', 'WBB'], 65], [3, 1, -45]], [[['B.WBB', 'W.B..', 'W.WWB', '.WB.B', '.WWWW', '..W.B'], 75], [-4, 7, -185]]], [[[['B....B', '......', '..WW..', '..WW..', '......', 'B....B'], 65], [-4, 2, -125]], [[['.WWB', '.BB.', '.BBB', '..B.'], 20], [5, 0, 30]], [[['B.B...', '......', '..WWB.', '.WB.W.', 'WWB.B.'], 0], [-4, 0, -40]], [[['.WWBBB', 'WBWB.W', 'BBB.W.', 'BB..BB', 'BWB.B.', 'WWW.WW'], 5], [7, 1, 55]], [[['BBBB', 'B..B', 'W..B', '.WBB', 'WB..', '.B..'], 65], [11, -2, 65]], [[['WWWB.W', 'WB....', 'W.WB..', 'W.BB.W', 'BBW...', '.BB.WW'], 75], [2, 0, -55]], [[['BWB', 'W.W', 'WBW', 'BWB', '.W.', 'BWW'], 20], [-6, 1, -90]], [[['.BBW', '.WB.', 'W...', '....', '....'], 0], [1, -3, 40]]], [[[['W..B', 'W...', '.W.W', '.W..', 'W.W.'], 0], [-1, 0, -10]], [[['.BBW', '.WB.', 'W...', '....', '....'], 0], [1, -3, 40]], [[['B..', 'B..', '.B.', '..B', '..B'], 65], [9, 0, 25]], [[['....W.', '...B.B', 'BBBB..', '..B.W.', '.B.B.W'], 75], [5, -3, 5]], [[['..B', '.BW', 'B.B'], 20], [0, -1, -10]], [[['.BB..B', '......', 'B.B.BB', '.BBB..', '.B....'], 0], [20, 0, 200]], [[['W..', '.B.', '.W.', '...'], 5], [-1, -2, 5]], [[['..WW', 'B.WW', 'WBBW', '.WBW', 'WWBW', 'B..W'], 65], [0, 7, -135]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"group tax case %d\" % i, solve(args), expected)\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":"c37636e82d1081047ff24d92ca1cd05d259883f037bc0f44a21ec47022635c79","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    board, komi = x\n    n = len(board)\n    m = len(board[0])\n    score = {'B': 0, 'W': 0}\n    groups = {'B': 0, 'W': 0}\n    seen = set()\n    for r in range(n):\n        for c in range(m):\n            if (r, c) in seen:\n                continue\n            col = board[r][c]\n            seen.add((r, c))\n            stack = [(r, c)]\n            size = 0\n            touch = set()\n            while stack:\n                i, j = stack.pop()\n                size += 1\n                for p, q in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):\n                    if 0 <= p < n and 0 <= q < m:\n                        v = board[p][q]\n                        if v == col and (p, q) not in seen:\n                            seen.add((p, q))\n                            stack.append((p, q))\n                        elif v != col:\n                            touch.add(v)\n            if col == '.':\n                if len(touch) == 1:\n                    score[touch.pop()] += size\n            else:\n                score[col] += size\n                groups[col] += 1\n    b = score['B'] - 2 * groups['B']\n    w = score['W'] - 2 * groups['W']\n    return [b, w, b * 10 - w * 10 - komi]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[[[['B..W', 'B..W', 'B..W', 'B..W'], 75], [2, 2, -75]], [[['.W.B.', 'W.WB.', '.WB..', 'WB...', 'B....'], 75], [8, -2, 25]], [[['BBBB', 'B..B', 'B..B', 'BBBB'], 20], [14, 0, 120]], [[['WWW', 'W.W', 'WWW'], 0], [0, 7, -70]], [[['B.W', '...', 'W.B'], 5], [-2, -2, -5]], [[['.B...', 'B....', '.....', '....W', '...W.'], 65], [-1, -1, -65]], [[['BW.', 'BW.', 'BW.'], 75], [1, 4, -105]], [[['WB.B', 'B.B.', '.B..', 'B...'], 0], [3, -1, 40]]], [[[['B.B.W', '.B.W.', 'B.BW.', 'BBW.W', '..W..'], 5], [0, 3, -35]], [[['WB.B', 'B.B.', '.B..', 'B...'], 0], [3, -1, 40]], [[['..W', '.W.', 'W..'], 5], [0, 3, -35]], [[['B....B', '......', '..WW..', '..WW..', '......', 'B....B'], 65], [-4, 2, -125]], [[['..WW', '.W..', 'B...'], 75], [-1, -1, -75]], [[['..WW', '.W.B', '.WWW', 'B..B'], 20], [-3, 2, -70]], [[['W..B', 'W...', '.W.W', '.W..', 'W.W.'], 0], [-1, 0, -10]], [[['.W...', 'W....', '.....', '....W', 'W....'], 5], [0, 17, -175]]], [[[['WWW', 'W.W', 'WWW'], 0], [0, 7, -70]], [[['..B', '..B', '...', '...', '..B'], 65], [11, 0, 45]], [[['B..', 'B.W', '.W.'], 75], [0, -1, -65]], [[['W..BW.', '.W....', '......'], 20], [-1, -3, 0]], [[['BBBB', '....', '.W.B', 'BBB.', '.BBB', 'BB.B'], 0], [11, -1, 120]], [[['...', '.BW', '.B.', '...', 'B.B', 'BB.'], 5], [1, -1, 15]], [[['B.B', 'WWB', 'BWB', 'BWB', 'WBB'], 65], [3, 1, -45]], [[['B.WBB', 'W.B..', 'W.WWB', '.WB.B', '.WWWW', '..W.B'], 75], [-4, 7, -185]]], [[[['B....B', '......', '..WW..', '..WW..', '......', 'B....B'], 65], [-4, 2, -125]], [[['.WWB', '.BB.', '.BBB', '..B.'], 20], [5, 0, 30]], [[['B.B...', '......', '..WWB.', '.WB.W.', 'WWB.B.'], 0], [-4, 0, -40]], [[['.WWBBB', 'WBWB.W', 'BBB.W.', 'BB..BB', 'BWB.B.', 'WWW.WW'], 5], [7, 1, 55]], [[['BBBB', 'B..B', 'W..B', '.WBB', 'WB..', '.B..'], 65], [11, -2, 65]], [[['WWWB.W', 'WB....', 'W.WB..', 'W.BB.W', 'BBW...', '.BB.WW'], 75], [2, 0, -55]], [[['BWB', 'W.W', 'WBW', 'BWB', '.W.', 'BWW'], 20], [-6, 1, -90]], [[['.BBW', '.WB.', 'W...', '....', '....'], 0], [1, -3, 40]]], [[[['W..B', 'W...', '.W.W', '.W..', 'W.W.'], 0], [-1, 0, -10]], [[['.BBW', '.WB.', 'W...', '....', '....'], 0], [1, -3, 40]], [[['B..', 'B..', '.B.', '..B', '..B'], 65], [9, 0, 25]], [[['....W.', '...B.B', 'BBBB..', '..B.W.', '.B.B.W'], 75], [5, -3, 5]], [[['..B', '.BW', 'B.B'], 20], [0, -1, -10]], [[['.BB..B', '......', 'B.B.BB', '.BBB..', '.B....'], 0], [20, 0, 200]], [[['W..', '.B.', '.W.', '...'], 5], [-1, -2, 5]], [[['..WW', 'B.WW', 'WBBW', '.WBW', 'WWBW', 'B..W'], 65], [0, 7, -135]]]]\nfor i, (args, expected) in enumerate(fixtures[N-1]):\n    check(\"group tax case %d\" % i, solve(args), expected)\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":"Small rectangular toy boards given as strings of B, W and dot; a bounded teaching model of one scoring or bookkeeping rule, not a complete rules engine or server implementation. 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":"w2-go-territory-scoring-group-tax-tax-unit","generated_at":"2026-09-29T14:50:17.902694+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Go servers and scoring tools compute this value automatically; a wrong answer changes a game result.","repair":"Increment the chain count by one per chain.","root_cause":"The chain counter adds the chain size.","sha256":"e48890eb74639bed4eb40957db590a0fcc3575bcf8670d980b0e0310a6cfee0b","title":"Group tax is charged per stone instead of per chain · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":53.962,"exit_code":1,"observations":[{"actual":[2,2,-75],"check":"group tax case 0","expected":[2,2,-75],"passed":true},{"actual":[14,8,-15],"check":"group tax case 1","expected":[8,-2,25],"passed":false},{"actual":[14,0,120],"check":"group tax case 2","expected":[14,0,120],"passed":true},{"actual":[0,7,-70],"check":"group tax case 3","expected":[0,7,-70],"passed":true},{"actual":[2,2,-5],"check":"group tax case 4","expected":[-2,-2,-5],"passed":false},{"actual":[3,3,-65],"check":"group tax case 5","expected":[-1,-1,-65],"passed":false},{"actual":[1,4,-105],"check":"group tax case 6","expected":[1,4,-105],"passed":true},{"actual":[15,1,140],"check":"group tax case 7","expected":[3,-1,40],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"group tax case 0\", \"actual\": [2, 2, -75], \"expected\": [2, 2, -75], \"passed\": true}, {\"check\": \"group tax case 1\", \"actual\": [14, 8, -15], \"expected\": [8, -2, 25], \"passed\": false}, {\"check\": \"group tax case 2\", \"actual\": [14, 0, 120], \"expected\": [14, 0, 120], \"passed\": true}, {\"check\": \"group tax case 3\", \"actual\": [0, 7, -70], \"expected\": [0, 7, -70], \"passed\": true}, {\"check\": \"group tax case 4\", \"actual\": [2, 2, -5], \"expected\": [-2, -2, -5], \"passed\": false}, {\"check\": \"group tax case 5\", \"actual\": [3, 3, -65], \"expected\": [-1, -1, -65], \"passed\": false}, {\"check\": \"group tax case 6\", \"actual\": [1, 4, -105], \"expected\": [1, 4, -105], \"passed\": true}, {\"check\": \"group tax case 7\", \"actual\": [15, 1, 140], \"expected\": [3, -1, 40], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":80.703,"exit_code":1,"observations":[{"actual":[-4,-4,-75],"check":"group tax case 0","expected":[2,2,-75],"passed":false},{"actual":[6,-2,5],"check":"group tax case 1","expected":[8,-2,25],"passed":false},{"actual":[-8,0,-100],"check":"group tax case 2","expected":[14,0,120],"passed":false},{"actual":[0,-7,70],"check":"group tax case 3","expected":[0,7,-70],"passed":false},{"actual":[-2,-2,-5],"check":"group tax case 4","expected":[-2,-2,-5],"passed":true},{"actual":[-1,-1,-65],"check":"group tax case 5","expected":[-1,-1,-65],"passed":true},{"actual":[-3,0,-105],"check":"group tax case 6","expected":[1,4,-105],"passed":false},{"actual":[3,-1,40],"check":"group tax case 7","expected":[3,-1,40],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"group tax case 0\", \"actual\": [-4, -4, -75], \"expected\": [2, 2, -75], \"passed\": false}, {\"check\": \"group tax case 1\", \"actual\": [6, -2, 5], \"expected\": [8, -2, 25], \"passed\": false}, {\"check\": \"group tax case 2\", \"actual\": [-8, 0, -100], \"expected\": [14, 0, 120], \"passed\": false}, {\"check\": \"group tax case 3\", \"actual\": [0, -7, 70], \"expected\": [0, 7, -70], \"passed\": false}, {\"check\": \"group tax case 4\", \"actual\": [-2, -2, -5], \"expected\": [-2, -2, -5], \"passed\": true}, {\"check\": \"group tax case 5\", \"actual\": [-1, -1, -65], \"expected\": [-1, -1, -65], \"passed\": true}, {\"check\": \"group tax case 6\", \"actual\": [-3, 0, -105], \"expected\": [1, 4, -105], \"passed\": false}, {\"check\": \"group tax case 7\", \"actual\": [3, -1, 40], \"expected\": [3, -1, 40], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":42.287,"exit_code":0,"observations":[{"actual":[2,2,-75],"check":"group tax case 0","expected":[2,2,-75],"passed":true},{"actual":[8,-2,25],"check":"group tax case 1","expected":[8,-2,25],"passed":true},{"actual":[14,0,120],"check":"group tax case 2","expected":[14,0,120],"passed":true},{"actual":[0,7,-70],"check":"group tax case 3","expected":[0,7,-70],"passed":true},{"actual":[-2,-2,-5],"check":"group tax case 4","expected":[-2,-2,-5],"passed":true},{"actual":[-1,-1,-65],"check":"group tax case 5","expected":[-1,-1,-65],"passed":true},{"actual":[1,4,-105],"check":"group tax case 6","expected":[1,4,-105],"passed":true},{"actual":[3,-1,40],"check":"group tax case 7","expected":[3,-1,40],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"group tax case 0\", \"actual\": [2, 2, -75], \"expected\": [2, 2, -75], \"passed\": true}, {\"check\": \"group tax case 1\", \"actual\": [8, -2, 25], \"expected\": [8, -2, 25], \"passed\": true}, {\"check\": \"group tax case 2\", \"actual\": [14, 0, 120], \"expected\": [14, 0, 120], \"passed\": true}, {\"check\": \"group tax case 3\", \"actual\": [0, 7, -70], \"expected\": [0, 7, -70], \"passed\": true}, {\"check\": \"group tax case 4\", \"actual\": [-2, -2, -5], \"expected\": [-2, -2, -5], \"passed\": true}, {\"check\": \"group tax case 5\", \"actual\": [-1, -1, -65], \"expected\": [-1, -1, -65], \"passed\": true}, {\"check\": \"group tax case 6\", \"actual\": [1, 4, -105], \"expected\": [1, 4, -105], \"passed\": true}, {\"check\": \"group tax case 7\", \"actual\": [3, -1, 40], \"expected\": [3, -1, 40], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}