{"abstract":"Every loop comes back in reversed vertex order.","category":"Mesh topology invariants","checks":7,"contract":"Input: consistently oriented polygon faces. A half-edge (a,b) is boundary when (b,a) is not a half-edge. If any vertex starts two boundary half-edges return \"ambiguous\". Otherwise walk loops along the half-edge direction, each starting at its smallest vertex, and return them sorted by descending length then first vertex.","evaluation_group":"w2-mesh_topology_invariants-boundary-loops","failed_approach":"Reversing the finished loop keeps the wrong order and no longer starts at the smallest vertex.","family":"w2-mesh_topology_invariants-boundary-loops-walk-direction","id":"FA-88396","implementations":{"attempt":{"sha256":"69a45d311f4177a88e280462dfc4a12668a4bb6f0010f49bbc8e8def425466b4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces=x\n    he=[]\n    for f in faces:\n        n=len(f)\n        for i in range(n):\n            he.append((f[i],f[(i+1)%n]))\n    hs=set(he)\n    nxt={}\n    for a,b in he:\n        if (b,a) not in hs:\n            if a in nxt: return 'ambiguous'\n            nxt[a]=b\n    loops=[]\n    seen=set()\n    for s in sorted(nxt):\n        if s in seen: continue\n        loop=[]\n        v=s\n        while v not in seen:\n            seen.add(v)\n            loop.append(v)\n            v=nxt[v]\n        loops.append(loop[::-1])\n    return sorted(loops,key=lambda l:(-len(l),l[0]))\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous']], [['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous'], ['two disks', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [10, 11, 12], [10, 12, 13], [10, 13, 14]]], [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14]]], ['open cylinder', [[[0, 1, 5], [0, 5, 4], [1, 2, 6], [1, 6, 5], [2, 3, 7], [2, 7, 6], [3, 0, 4], [3, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['single triangle', [[[4, 2, 7]]], [[2, 7, 4]]]], [['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['two disks', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [10, 11, 12], [10, 12, 13], [10, 13, 14]]], [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14]]], ['open cylinder', [[[0, 1, 5], [0, 5, 4], [1, 2, 6], [1, 6, 5], [2, 3, 7], [2, 7, 6], [3, 0, 4], [3, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['single triangle', [[[4, 2, 7]]], [[2, 7, 4]]], ['single quad', [[[3, 1, 0, 2]]], [[0, 2, 3, 1]]], ['triangle grid', [[[0, 1, 4], [0, 4, 3], [1, 2, 5], [1, 5, 4]]], [[0, 1, 2, 5, 4, 3]]], ['disk with small far island', [[[5, 6, 7], [5, 7, 8], [5, 8, 9], [5, 9, 10], [5, 10, 6], [0, 1, 2]]], [[6, 7, 8, 9, 10], [0, 1, 2]]]], [['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['single quad', [[[3, 1, 0, 2]]], [[0, 2, 3, 1]]], ['triangle grid', [[[0, 1, 4], [0, 4, 3], [1, 2, 5], [1, 5, 4]]], [[0, 1, 2, 5, 4, 3]]], ['disk with small far island', [[[5, 6, 7], [5, 7, 8], [5, 8, 9], [5, 9, 10], [5, 10, 6], [0, 1, 2]]], [[6, 7, 8, 9, 10], [0, 1, 2]]]], [['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous']]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, 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":"0592c797d29a9227ca5432988ea49f398e86cf8669d98948d7c6f6fb1cd84e84","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces=x\n    he=[]\n    for f in faces:\n        n=len(f)\n        for i in range(n):\n            he.append((f[i],f[(i+1)%n]))\n    hs=set(he)\n    nxt={}\n    for a,b in he:\n        if (b,a) not in hs:\n            if a in nxt: return 'ambiguous'\n            nxt[b]=a\n    loops=[]\n    seen=set()\n    for s in sorted(nxt):\n        if s in seen: continue\n        loop=[]\n        v=s\n        while v not in seen:\n            seen.add(v)\n            loop.append(v)\n            v=nxt[v]\n        loops.append(loop)\n    return sorted(loops,key=lambda l:(-len(l),l[0]))\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous']], [['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous'], ['two disks', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [10, 11, 12], [10, 12, 13], [10, 13, 14]]], [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14]]], ['open cylinder', [[[0, 1, 5], [0, 5, 4], [1, 2, 6], [1, 6, 5], [2, 3, 7], [2, 7, 6], [3, 0, 4], [3, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['single triangle', [[[4, 2, 7]]], [[2, 7, 4]]]], [['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['two disks', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [10, 11, 12], [10, 12, 13], [10, 13, 14]]], [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14]]], ['open cylinder', [[[0, 1, 5], [0, 5, 4], [1, 2, 6], [1, 6, 5], [2, 3, 7], [2, 7, 6], [3, 0, 4], [3, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['single triangle', [[[4, 2, 7]]], [[2, 7, 4]]], ['single quad', [[[3, 1, 0, 2]]], [[0, 2, 3, 1]]], ['triangle grid', [[[0, 1, 4], [0, 4, 3], [1, 2, 5], [1, 5, 4]]], [[0, 1, 2, 5, 4, 3]]], ['disk with small far island', [[[5, 6, 7], [5, 7, 8], [5, 8, 9], [5, 9, 10], [5, 10, 6], [0, 1, 2]]], [[6, 7, 8, 9, 10], [0, 1, 2]]]], [['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['single quad', [[[3, 1, 0, 2]]], [[0, 2, 3, 1]]], ['triangle grid', [[[0, 1, 4], [0, 4, 3], [1, 2, 5], [1, 5, 4]]], [[0, 1, 2, 5, 4, 3]]], ['disk with small far island', [[[5, 6, 7], [5, 7, 8], [5, 8, 9], [5, 9, 10], [5, 10, 6], [0, 1, 2]]], [[6, 7, 8, 9, 10], [0, 1, 2]]]], [['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous']]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, 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":"6ffc8e4c311028403e2a998ab4916a1d31e7ad4d100d70ce3df5f27964750995","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces=x\n    he=[]\n    for f in faces:\n        n=len(f)\n        for i in range(n):\n            he.append((f[i],f[(i+1)%n]))\n    hs=set(he)\n    nxt={}\n    for a,b in he:\n        if (b,a) not in hs:\n            if a in nxt: return 'ambiguous'\n            nxt[a]=b\n    loops=[]\n    seen=set()\n    for s in sorted(nxt):\n        if s in seen: continue\n        loop=[]\n        v=s\n        while v not in seen:\n            seen.add(v)\n            loop.append(v)\n            v=nxt[v]\n        loops.append(loop)\n    return sorted(loops,key=lambda l:(-len(l),l[0]))\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous']], [['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous'], ['two disks', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [10, 11, 12], [10, 12, 13], [10, 13, 14]]], [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14]]], ['open cylinder', [[[0, 1, 5], [0, 5, 4], [1, 2, 6], [1, 6, 5], [2, 3, 7], [2, 7, 6], [3, 0, 4], [3, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['single triangle', [[[4, 2, 7]]], [[2, 7, 4]]]], [['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['two disks', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [10, 11, 12], [10, 12, 13], [10, 13, 14]]], [[1, 2, 3, 4, 5], [10, 11, 12, 13, 14]]], ['open cylinder', [[[0, 1, 5], [0, 5, 4], [1, 2, 6], [1, 6, 5], [2, 3, 7], [2, 7, 6], [3, 0, 4], [3, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['single triangle', [[[4, 2, 7]]], [[2, 7, 4]]], ['single quad', [[[3, 1, 0, 2]]], [[0, 2, 3, 1]]], ['triangle grid', [[[0, 1, 4], [0, 4, 3], [1, 2, 5], [1, 5, 4]]], [[0, 1, 2, 5, 4, 3]]], ['disk with small far island', [[[5, 6, 7], [5, 7, 8], [5, 8, 9], [5, 9, 10], [5, 10, 6], [0, 1, 2]]], [[6, 7, 8, 9, 10], [0, 1, 2]]]], [['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['single quad', [[[3, 1, 0, 2]]], [[0, 2, 3, 1]]], ['triangle grid', [[[0, 1, 4], [0, 4, 3], [1, 2, 5], [1, 5, 4]]], [[0, 1, 2, 5, 4, 3]]], ['disk with small far island', [[[5, 6, 7], [5, 7, 8], [5, 8, 9], [5, 9, 10], [5, 10, 6], [0, 1, 2]]], [[6, 7, 8, 9, 10], [0, 1, 2]]]], [['disk', [[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]]], [[1, 2, 3, 4, 5]]], ['fan', [[[0, 1, 2], [0, 2, 3], [0, 3, 4]]], [[0, 1, 2, 3, 4]]], ['annulus', [[[0, 3, 4, 1], [1, 4, 5, 2], [2, 5, 3, 0]]], [[0, 2, 1], [3, 4, 5]]], ['quad grid', [[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]]], [[0, 1, 2, 5, 8, 7, 6, 3]]], ['square with hole', [[[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]]], [[0, 1, 2, 3], [4, 7, 6, 5]]], ['closed tetrahedron', [[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]]], []], ['bowtie', [[[0, 1, 2], [0, 3, 4]]], 'ambiguous']]]\nfor label, args, expected in fixtures[N-1]:\n    check(label, 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":"Pure combinatorial teaching model over integer face lists with a stipulated contract; no geometry kernel or file format is implied. 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-mesh_topology_invariants-boundary-loops-walk-direction","generated_at":"2026-09-29T14:51:07.732432+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Mesh processing pipelines (remeshing, export, simulation, printing) trust these topological counts and adjacency answers; a wrong invariant silently accepts broken meshes or rejects valid ones.","repair":"Map each boundary half-edge start to its end.","root_cause":"The successor map stores b -> a for a boundary half-edge a -> b.","sha256":"2116d007abedd5d941e537411043e91bb0639499d0a5f7d58f46f328032b9216","title":"Boundary loops are walked against the face orientation · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.448,"exit_code":1,"observations":[{"actual":[[5,4,3,2,1]],"check":"disk","expected":[[1,2,3,4,5]],"passed":false},{"actual":[[4,3,2,1,0]],"check":"fan","expected":[[0,1,2,3,4]],"passed":false},{"actual":[[1,2,0],[5,4,3]],"check":"annulus","expected":[[0,2,1],[3,4,5]],"passed":false},{"actual":[[3,6,7,8,5,2,1,0]],"check":"quad grid","expected":[[0,1,2,5,8,7,6,3]],"passed":false},{"actual":[[3,2,1,0],[5,6,7,4]],"check":"square with hole","expected":[[0,1,2,3],[4,7,6,5]],"passed":false},{"actual":[],"check":"closed tetrahedron","expected":[],"passed":true},{"actual":"ambiguous","check":"bowtie","expected":"ambiguous","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disk\", \"actual\": [[5, 4, 3, 2, 1]], \"expected\": [[1, 2, 3, 4, 5]], \"passed\": false}, {\"check\": \"fan\", \"actual\": [[4, 3, 2, 1, 0]], \"expected\": [[0, 1, 2, 3, 4]], \"passed\": false}, {\"check\": \"annulus\", \"actual\": [[1, 2, 0], [5, 4, 3]], \"expected\": [[0, 2, 1], [3, 4, 5]], \"passed\": false}, {\"check\": \"quad grid\", \"actual\": [[3, 6, 7, 8, 5, 2, 1, 0]], \"expected\": [[0, 1, 2, 5, 8, 7, 6, 3]], \"passed\": false}, {\"check\": \"square with hole\", \"actual\": [[3, 2, 1, 0], [5, 6, 7, 4]], \"expected\": [[0, 1, 2, 3], [4, 7, 6, 5]], \"passed\": false}, {\"check\": \"closed tetrahedron\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"bowtie\", \"actual\": \"ambiguous\", \"expected\": \"ambiguous\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.64,"exit_code":1,"observations":[{"actual":"ambiguous","check":"disk","expected":[[1,2,3,4,5]],"passed":false},{"actual":"ambiguous","check":"fan","expected":[[0,1,2,3,4]],"passed":false},{"actual":"ambiguous","check":"annulus","expected":[[0,2,1],[3,4,5]],"passed":false},{"actual":"ambiguous","check":"quad grid","expected":[[0,1,2,5,8,7,6,3]],"passed":false},{"actual":"ambiguous","check":"square with hole","expected":[[0,1,2,3],[4,7,6,5]],"passed":false},{"actual":[],"check":"closed tetrahedron","expected":[],"passed":true},{"actual":"ambiguous","check":"bowtie","expected":"ambiguous","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disk\", \"actual\": \"ambiguous\", \"expected\": [[1, 2, 3, 4, 5]], \"passed\": false}, {\"check\": \"fan\", \"actual\": \"ambiguous\", \"expected\": [[0, 1, 2, 3, 4]], \"passed\": false}, {\"check\": \"annulus\", \"actual\": \"ambiguous\", \"expected\": [[0, 2, 1], [3, 4, 5]], \"passed\": false}, {\"check\": \"quad grid\", \"actual\": \"ambiguous\", \"expected\": [[0, 1, 2, 5, 8, 7, 6, 3]], \"passed\": false}, {\"check\": \"square with hole\", \"actual\": \"ambiguous\", \"expected\": [[0, 1, 2, 3], [4, 7, 6, 5]], \"passed\": false}, {\"check\": \"closed tetrahedron\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"bowtie\", \"actual\": \"ambiguous\", \"expected\": \"ambiguous\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.561,"exit_code":0,"observations":[{"actual":[[1,2,3,4,5]],"check":"disk","expected":[[1,2,3,4,5]],"passed":true},{"actual":[[0,1,2,3,4]],"check":"fan","expected":[[0,1,2,3,4]],"passed":true},{"actual":[[0,2,1],[3,4,5]],"check":"annulus","expected":[[0,2,1],[3,4,5]],"passed":true},{"actual":[[0,1,2,5,8,7,6,3]],"check":"quad grid","expected":[[0,1,2,5,8,7,6,3]],"passed":true},{"actual":[[0,1,2,3],[4,7,6,5]],"check":"square with hole","expected":[[0,1,2,3],[4,7,6,5]],"passed":true},{"actual":[],"check":"closed tetrahedron","expected":[],"passed":true},{"actual":"ambiguous","check":"bowtie","expected":"ambiguous","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disk\", \"actual\": [[1, 2, 3, 4, 5]], \"expected\": [[1, 2, 3, 4, 5]], \"passed\": true}, {\"check\": \"fan\", \"actual\": [[0, 1, 2, 3, 4]], \"expected\": [[0, 1, 2, 3, 4]], \"passed\": true}, {\"check\": \"annulus\", \"actual\": [[0, 2, 1], [3, 4, 5]], \"expected\": [[0, 2, 1], [3, 4, 5]], \"passed\": true}, {\"check\": \"quad grid\", \"actual\": [[0, 1, 2, 5, 8, 7, 6, 3]], \"expected\": [[0, 1, 2, 5, 8, 7, 6, 3]], \"passed\": true}, {\"check\": \"square with hole\", \"actual\": [[0, 1, 2, 3], [4, 7, 6, 5]], \"expected\": [[0, 1, 2, 3], [4, 7, 6, 5]], \"passed\": true}, {\"check\": \"closed tetrahedron\", \"actual\": [], \"expected\": [], \"passed\": true}, {\"check\": \"bowtie\", \"actual\": \"ambiguous\", \"expected\": \"ambiguous\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}