{"abstract":"Quads are split along a false diagonal and lose a corner.","category":"Mesh topology invariants","checks":7,"contract":"Input [faces, a, b] for a triangle mesh (any non-triangle returns \"non-triangle\"). Insert vertex m = max index + 1 on edge {a,b}: each triangle (u,w,c) with {u,w}={a,b} along its boundary becomes [u,m,c] then [m,w,c] at its original position. No such triangle returns \"no-edge\". Return [m, faces, number of split triangles].","evaluation_group":"w2-mesh_topology_invariants-edge-split","failed_approach":"Rejecting only faces larger than quads lets quads through.","family":"w2-mesh_topology_invariants-edge-split-triangle-precondition","id":"FA-88786","implementations":{"attempt":{"sha256":"434bf9461da3651c4c4990d02d558c2ab96c78d49f76d8f46ede2868af5be7c1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces,a,b=x\n    m=1+max(v for f in faces for v in f)\n    out=[]\n    hit=0\n    for f in faces:\n        n=len(f)\n        if n>4: return 'non-triangle'\n        done=False\n        for j in range(3):\n            u,w=f[j],f[(j+1)%3]\n            if {u,w}=={a,b}:\n                c=f[(j+2)%3]\n                out.append([u,m,c])\n                out.append([m,w,c])\n                hit+=1\n                done=True\n                break\n        if not done: out.append(list(f))\n    if hit==0: return 'no-edge'\n    return [m,out,hit]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]]], [['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle']], [['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle'], ['book spine', [[[[0, 1, 2], [1, 0, 3], [0, 1, 4]], 0, 1]], [5, [[0, 5, 2], [5, 1, 2], [1, 5, 3], [5, 0, 3], [0, 5, 4], [5, 1, 4]], 3]]], [['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle'], ['book spine', [[[[0, 1, 2], [1, 0, 3], [0, 1, 4]], 0, 1]], [5, [[0, 5, 2], [5, 1, 2], [1, 5, 3], [5, 0, 3], [0, 5, 4], [5, 1, 4]], 3]]], [['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]]]]\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":"12e04e19f11d216d6ef2b67404f7a3732c4516e5f859b5fa8b314fa92e7a4873","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces,a,b=x\n    m=1+max(v for f in faces for v in f)\n    out=[]\n    hit=0\n    for f in faces:\n        n=len(f)\n        done=False\n        for j in range(3):\n            u,w=f[j],f[(j+1)%3]\n            if {u,w}=={a,b}:\n                c=f[(j+2)%3]\n                out.append([u,m,c])\n                out.append([m,w,c])\n                hit+=1\n                done=True\n                break\n        if not done: out.append(list(f))\n    if hit==0: return 'no-edge'\n    return [m,out,hit]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]]], [['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle']], [['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle'], ['book spine', [[[[0, 1, 2], [1, 0, 3], [0, 1, 4]], 0, 1]], [5, [[0, 5, 2], [5, 1, 2], [1, 5, 3], [5, 0, 3], [0, 5, 4], [5, 1, 4]], 3]]], [['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle'], ['book spine', [[[[0, 1, 2], [1, 0, 3], [0, 1, 4]], 0, 1]], [5, [[0, 5, 2], [5, 1, 2], [1, 5, 3], [5, 0, 3], [0, 5, 4], [5, 1, 4]], 3]]], [['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]]]]\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":"65c8b4af0c3e94d2fcb9fd4ebfd73ed962397ce648067c52514ba18d00c2b6b1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces,a,b=x\n    m=1+max(v for f in faces for v in f)\n    out=[]\n    hit=0\n    for f in faces:\n        n=len(f)\n        if n!=3: return 'non-triangle'\n        done=False\n        for j in range(3):\n            u,w=f[j],f[(j+1)%3]\n            if {u,w}=={a,b}:\n                c=f[(j+2)%3]\n                out.append([u,m,c])\n                out.append([m,w,c])\n                hit+=1\n                done=True\n                break\n        if not done: out.append(list(f))\n    if hit==0: return 'no-edge'\n    return [m,out,hit]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]]], [['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle']], [['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle'], ['book spine', [[[[0, 1, 2], [1, 0, 3], [0, 1, 4]], 0, 1]], [5, [[0, 5, 2], [5, 1, 2], [1, 5, 3], [5, 0, 3], [0, 5, 4], [5, 1, 4]], 3]]], [['shared diagonal', [[[[0, 1, 2], [2, 1, 3]], 1, 2]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['rim edge', [[[[0, 1, 2], [2, 1, 3]], 0, 1]], [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1]], ['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['triangle then quad', [[[[0, 1, 2], [2, 1, 3, 4]], 0, 1]], 'non-triangle'], ['book spine', [[[[0, 1, 2], [1, 0, 3], [0, 1, 4]], 0, 1]], [5, [[0, 5, 2], [5, 1, 2], [1, 5, 3], [5, 0, 3], [0, 5, 4], [5, 1, 4]], 3]]], [['missing edge', [[[[0, 1, 2], [2, 1, 3]], 0, 3]], 'no-edge'], ['gapped indices', [[[[0, 1, 5], [1, 7, 5]], 1, 5]], [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2]], ['tetrahedron edge', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 2, 3]], [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2]], ['quad input', [[[[0, 1, 2, 3]], 0, 1]], 'non-triangle'], ['disk spoke', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0, 3]], [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], ['reversed request', [[[[0, 1, 2], [2, 1, 3]], 2, 1]], [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2]], ['fan rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3, 4]], [5, [[0, 1, 2], [0, 2, 3], [3, 5, 0], [5, 4, 0]], 1]]]]\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-edge-split-triangle-precondition","generated_at":"2026-09-29T14:51:11.377740+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":"Return \"non-triangle\" when any face is not a triangle.","root_cause":"The non-triangle guard is missing.","sha256":"80394a2df9048fe0eb5b177e5460d2b42c2bbbb1dbb5b1ef0c37b143027815e2","title":"Edge split processes polygons as triangles · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.123,"exit_code":1,"observations":[{"actual":[4,[[1,4,0],[4,2,0],[2,4,3],[4,1,3]],2],"check":"shared diagonal","expected":[4,[[1,4,0],[4,2,0],[2,4,3],[4,1,3]],2],"passed":true},{"actual":[4,[[0,4,2],[4,1,2],[2,1,3]],1],"check":"rim edge","expected":[4,[[0,4,2],[4,1,2],[2,1,3]],1],"passed":true},{"actual":"no-edge","check":"missing edge","expected":"no-edge","passed":true},{"actual":[8,[[1,8,0],[8,5,0],[5,8,7],[8,1,7]],2],"check":"gapped indices","expected":[8,[[1,8,0],[8,5,0],[5,8,7],[8,1,7]],2],"passed":true},{"actual":[4,[[0,2,1],[0,1,3],[2,4,1],[4,3,1],[3,4,0],[4,2,0]],2],"check":"tetrahedron edge","expected":[4,[[0,2,1],[0,1,3],[2,4,1],[4,3,1],[3,4,0],[4,2,0]],2],"passed":true},{"actual":[4,[[0,4,2],[4,1,2]],1],"check":"quad input","expected":"non-triangle","passed":false},{"actual":[6,[[0,1,2],[3,6,2],[6,0,2],[0,6,4],[6,3,4],[0,4,5],[0,5,1]],2],"check":"disk spoke","expected":[6,[[0,1,2],[3,6,2],[6,0,2],[0,6,4],[6,3,4],[0,4,5],[0,5,1]],2],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"shared diagonal\", \"actual\": [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2], \"expected\": [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2], \"passed\": true}, {\"check\": \"rim edge\", \"actual\": [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1], \"expected\": [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1], \"passed\": true}, {\"check\": \"missing edge\", \"actual\": \"no-edge\", \"expected\": \"no-edge\", \"passed\": true}, {\"check\": \"gapped indices\", \"actual\": [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2], \"expected\": [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2], \"passed\": true}, {\"check\": \"tetrahedron edge\", \"actual\": [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2], \"expected\": [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2], \"passed\": true}, {\"check\": \"quad input\", \"actual\": [4, [[0, 4, 2], [4, 1, 2]], 1], \"expected\": \"non-triangle\", \"passed\": false}, {\"check\": \"disk spoke\", \"actual\": [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2], \"expected\": [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.994,"exit_code":1,"observations":[{"actual":[4,[[1,4,0],[4,2,0],[2,4,3],[4,1,3]],2],"check":"shared diagonal","expected":[4,[[1,4,0],[4,2,0],[2,4,3],[4,1,3]],2],"passed":true},{"actual":[4,[[0,4,2],[4,1,2],[2,1,3]],1],"check":"rim edge","expected":[4,[[0,4,2],[4,1,2],[2,1,3]],1],"passed":true},{"actual":"no-edge","check":"missing edge","expected":"no-edge","passed":true},{"actual":[8,[[1,8,0],[8,5,0],[5,8,7],[8,1,7]],2],"check":"gapped indices","expected":[8,[[1,8,0],[8,5,0],[5,8,7],[8,1,7]],2],"passed":true},{"actual":[4,[[0,2,1],[0,1,3],[2,4,1],[4,3,1],[3,4,0],[4,2,0]],2],"check":"tetrahedron edge","expected":[4,[[0,2,1],[0,1,3],[2,4,1],[4,3,1],[3,4,0],[4,2,0]],2],"passed":true},{"actual":[4,[[0,4,2],[4,1,2]],1],"check":"quad input","expected":"non-triangle","passed":false},{"actual":[6,[[0,1,2],[3,6,2],[6,0,2],[0,6,4],[6,3,4],[0,4,5],[0,5,1]],2],"check":"disk spoke","expected":[6,[[0,1,2],[3,6,2],[6,0,2],[0,6,4],[6,3,4],[0,4,5],[0,5,1]],2],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"shared diagonal\", \"actual\": [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2], \"expected\": [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2], \"passed\": true}, {\"check\": \"rim edge\", \"actual\": [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1], \"expected\": [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1], \"passed\": true}, {\"check\": \"missing edge\", \"actual\": \"no-edge\", \"expected\": \"no-edge\", \"passed\": true}, {\"check\": \"gapped indices\", \"actual\": [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2], \"expected\": [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2], \"passed\": true}, {\"check\": \"tetrahedron edge\", \"actual\": [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2], \"expected\": [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2], \"passed\": true}, {\"check\": \"quad input\", \"actual\": [4, [[0, 4, 2], [4, 1, 2]], 1], \"expected\": \"non-triangle\", \"passed\": false}, {\"check\": \"disk spoke\", \"actual\": [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2], \"expected\": [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.695,"exit_code":0,"observations":[{"actual":[4,[[1,4,0],[4,2,0],[2,4,3],[4,1,3]],2],"check":"shared diagonal","expected":[4,[[1,4,0],[4,2,0],[2,4,3],[4,1,3]],2],"passed":true},{"actual":[4,[[0,4,2],[4,1,2],[2,1,3]],1],"check":"rim edge","expected":[4,[[0,4,2],[4,1,2],[2,1,3]],1],"passed":true},{"actual":"no-edge","check":"missing edge","expected":"no-edge","passed":true},{"actual":[8,[[1,8,0],[8,5,0],[5,8,7],[8,1,7]],2],"check":"gapped indices","expected":[8,[[1,8,0],[8,5,0],[5,8,7],[8,1,7]],2],"passed":true},{"actual":[4,[[0,2,1],[0,1,3],[2,4,1],[4,3,1],[3,4,0],[4,2,0]],2],"check":"tetrahedron edge","expected":[4,[[0,2,1],[0,1,3],[2,4,1],[4,3,1],[3,4,0],[4,2,0]],2],"passed":true},{"actual":"non-triangle","check":"quad input","expected":"non-triangle","passed":true},{"actual":[6,[[0,1,2],[3,6,2],[6,0,2],[0,6,4],[6,3,4],[0,4,5],[0,5,1]],2],"check":"disk spoke","expected":[6,[[0,1,2],[3,6,2],[6,0,2],[0,6,4],[6,3,4],[0,4,5],[0,5,1]],2],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"shared diagonal\", \"actual\": [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2], \"expected\": [4, [[1, 4, 0], [4, 2, 0], [2, 4, 3], [4, 1, 3]], 2], \"passed\": true}, {\"check\": \"rim edge\", \"actual\": [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1], \"expected\": [4, [[0, 4, 2], [4, 1, 2], [2, 1, 3]], 1], \"passed\": true}, {\"check\": \"missing edge\", \"actual\": \"no-edge\", \"expected\": \"no-edge\", \"passed\": true}, {\"check\": \"gapped indices\", \"actual\": [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2], \"expected\": [8, [[1, 8, 0], [8, 5, 0], [5, 8, 7], [8, 1, 7]], 2], \"passed\": true}, {\"check\": \"tetrahedron edge\", \"actual\": [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2], \"expected\": [4, [[0, 2, 1], [0, 1, 3], [2, 4, 1], [4, 3, 1], [3, 4, 0], [4, 2, 0]], 2], \"passed\": true}, {\"check\": \"quad input\", \"actual\": \"non-triangle\", \"expected\": \"non-triangle\", \"passed\": true}, {\"check\": \"disk spoke\", \"actual\": [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2], \"expected\": [6, [[0, 1, 2], [3, 6, 2], [6, 0, 2], [0, 6, 4], [6, 3, 4], [0, 4, 5], [0, 5, 1]], 2], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}