{"abstract":"Neighbour rings come out in reverse angular order.","category":"Mesh topology invariants","checks":7,"contract":"Input [faces, v] with consistently oriented polygons. Each face containing v maps its next corner p to its previous corner q (counter-clockwise order around v). A repeated p is \"nonmanifold\"; no incident face is \"isolated\". If exactly one p has no predecessor the ring is a boundary fan starting there; more than one is \"nonmanifold\"; otherwise start at the smallest neighbour. Walk successors; a walk that does not visit every neighbour is \"nonmanifold\". Return [ring, \"boundary\"|\"interior\"].","evaluation_group":"w2-mesh_topology_invariants-one-ring-order","failed_approach":"Reversing the finished ring changes its start vertex and still breaks the fan start rule.","family":"w2-mesh_topology_invariants-one-ring-order-ring-orientation","id":"FA-88661","implementations":{"attempt":{"sha256":"064d259b7e308f5fcfb2f64ca76d4d4dcabf9d336c9f8d1361adddfeeda8949d","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces,v=x\n    succ={}\n    for f in faces:\n        n=len(f)\n        for j in range(n):\n            if f[j]==v:\n                p,q=f[(j+1)%n],f[(j-1)%n]\n                if p in succ: return 'nonmanifold'\n                succ[p]=q\n    if not succ: return 'isolated'\n    starts=[p for p in succ if p not in succ.values()]\n    if len(starts)>1: return 'nonmanifold'\n    s=starts[0] if starts else min(succ)\n    ring=[s]\n    u=s\n    while u in succ and succ[u]!=s:\n        u=succ[u]\n        ring.append(u)\n    if len(ring)!=len(set(succ)|set(succ.values())): return 'nonmanifold'\n    return [ring[::-1],'boundary' if starts else 'interior']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['disk centre', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0]], [[1, 2, 3, 4, 5], 'interior']], ['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['fan middle rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3]], [[4, 0, 2], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['octahedron equator', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 2]], [[0, 1, 5, 3], 'interior']], ['bowtie pinch', [[[[0, 1, 2], [0, 3, 4]], 0]], 'nonmanifold']], [['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['octahedron equator', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 2]], [[0, 1, 5, 3], 'interior']], ['bowtie pinch', [[[[0, 1, 2], [0, 3, 4]], 0]], 'nonmanifold'], ['double disk pinch', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [0, 6, 7], [0, 7, 8], [0, 8, 6]], 0]], 'nonmanifold'], ['quad grid centre', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 4]], [[1, 5, 7, 3], 'interior']], ['quad grid edge', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 1]], [[2, 4, 0], 'boundary']]], [['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['double disk pinch', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [0, 6, 7], [0, 7, 8], [0, 8, 6]], 0]], 'nonmanifold'], ['quad grid centre', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 4]], [[1, 5, 7, 3], 'interior']], ['quad grid edge', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 1]], [[2, 4, 0], 'boundary']], ['isolated vertex', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 9]], 'isolated'], ['flipped neighbour', [[[[0, 1, 2], [0, 3, 2]], 0]], 'nonmanifold'], ['same spoke twice', [[[[0, 1, 2], [0, 1, 3]], 0]], 'nonmanifold']], [['fan middle rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3]], [[4, 0, 2], 'boundary']], ['isolated vertex', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 9]], 'isolated'], ['flipped neighbour', [[[[0, 1, 2], [0, 3, 2]], 0]], 'nonmanifold'], ['same spoke twice', [[[[0, 1, 2], [0, 1, 3]], 0]], 'nonmanifold'], ['duplicated face', [[[[0, 1, 2], [0, 1, 2], [0, 2, 3]], 0]], 'nonmanifold'], ['cube corner', [[[[0, 3, 2, 1], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]], 6]], [[2, 7, 5], 'interior']], ['torus vertex', [[[[0, 3, 4], [0, 4, 1], [1, 4, 5], [1, 5, 2], [2, 5, 3], [2, 3, 0], [3, 6, 7], [3, 7, 4], [4, 7, 8], [4, 8, 5], [5, 8, 6], [5, 6, 3], [6, 0, 1], [6, 1, 7], [7, 1, 2], [7, 2, 8], [8, 2, 0], [8, 0, 6]], 4]], [[0, 3, 7, 8, 5, 1], 'interior']]], [['disk centre', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0]], [[1, 2, 3, 4, 5], 'interior']], ['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['duplicated face', [[[[0, 1, 2], [0, 1, 2], [0, 2, 3]], 0]], 'nonmanifold'], ['cube corner', [[[[0, 3, 2, 1], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]], 6]], [[2, 7, 5], 'interior']], ['torus vertex', [[[[0, 3, 4], [0, 4, 1], [1, 4, 5], [1, 5, 2], [2, 5, 3], [2, 3, 0], [3, 6, 7], [3, 7, 4], [4, 7, 8], [4, 8, 5], [5, 8, 6], [5, 6, 3], [6, 0, 1], [6, 1, 7], [7, 1, 2], [7, 2, 8], [8, 2, 0], [8, 0, 6]], 4]], [[0, 3, 7, 8, 5, 1], 'interior']]]]\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":"56a71173179f42c2f2b0c180e448b073394cc88da3c1e5e498006c31decde791","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces,v=x\n    succ={}\n    for f in faces:\n        n=len(f)\n        for j in range(n):\n            if f[j]==v:\n                p,q=f[(j-1)%n],f[(j+1)%n]\n                if p in succ: return 'nonmanifold'\n                succ[p]=q\n    if not succ: return 'isolated'\n    starts=[p for p in succ if p not in succ.values()]\n    if len(starts)>1: return 'nonmanifold'\n    s=starts[0] if starts else min(succ)\n    ring=[s]\n    u=s\n    while u in succ and succ[u]!=s:\n        u=succ[u]\n        ring.append(u)\n    if len(ring)!=len(set(succ)|set(succ.values())): return 'nonmanifold'\n    return [ring,'boundary' if starts else 'interior']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['disk centre', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0]], [[1, 2, 3, 4, 5], 'interior']], ['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['fan middle rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3]], [[4, 0, 2], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['octahedron equator', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 2]], [[0, 1, 5, 3], 'interior']], ['bowtie pinch', [[[[0, 1, 2], [0, 3, 4]], 0]], 'nonmanifold']], [['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['octahedron equator', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 2]], [[0, 1, 5, 3], 'interior']], ['bowtie pinch', [[[[0, 1, 2], [0, 3, 4]], 0]], 'nonmanifold'], ['double disk pinch', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [0, 6, 7], [0, 7, 8], [0, 8, 6]], 0]], 'nonmanifold'], ['quad grid centre', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 4]], [[1, 5, 7, 3], 'interior']], ['quad grid edge', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 1]], [[2, 4, 0], 'boundary']]], [['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['double disk pinch', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [0, 6, 7], [0, 7, 8], [0, 8, 6]], 0]], 'nonmanifold'], ['quad grid centre', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 4]], [[1, 5, 7, 3], 'interior']], ['quad grid edge', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 1]], [[2, 4, 0], 'boundary']], ['isolated vertex', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 9]], 'isolated'], ['flipped neighbour', [[[[0, 1, 2], [0, 3, 2]], 0]], 'nonmanifold'], ['same spoke twice', [[[[0, 1, 2], [0, 1, 3]], 0]], 'nonmanifold']], [['fan middle rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3]], [[4, 0, 2], 'boundary']], ['isolated vertex', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 9]], 'isolated'], ['flipped neighbour', [[[[0, 1, 2], [0, 3, 2]], 0]], 'nonmanifold'], ['same spoke twice', [[[[0, 1, 2], [0, 1, 3]], 0]], 'nonmanifold'], ['duplicated face', [[[[0, 1, 2], [0, 1, 2], [0, 2, 3]], 0]], 'nonmanifold'], ['cube corner', [[[[0, 3, 2, 1], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]], 6]], [[2, 7, 5], 'interior']], ['torus vertex', [[[[0, 3, 4], [0, 4, 1], [1, 4, 5], [1, 5, 2], [2, 5, 3], [2, 3, 0], [3, 6, 7], [3, 7, 4], [4, 7, 8], [4, 8, 5], [5, 8, 6], [5, 6, 3], [6, 0, 1], [6, 1, 7], [7, 1, 2], [7, 2, 8], [8, 2, 0], [8, 0, 6]], 4]], [[0, 3, 7, 8, 5, 1], 'interior']]], [['disk centre', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0]], [[1, 2, 3, 4, 5], 'interior']], ['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['duplicated face', [[[[0, 1, 2], [0, 1, 2], [0, 2, 3]], 0]], 'nonmanifold'], ['cube corner', [[[[0, 3, 2, 1], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]], 6]], [[2, 7, 5], 'interior']], ['torus vertex', [[[[0, 3, 4], [0, 4, 1], [1, 4, 5], [1, 5, 2], [2, 5, 3], [2, 3, 0], [3, 6, 7], [3, 7, 4], [4, 7, 8], [4, 8, 5], [5, 8, 6], [5, 6, 3], [6, 0, 1], [6, 1, 7], [7, 1, 2], [7, 2, 8], [8, 2, 0], [8, 0, 6]], 4]], [[0, 3, 7, 8, 5, 1], 'interior']]]]\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":"ac8b96d9bcbbdc4c2a9e54a70ffa30e4108e93e76de1b0ff40e56edaec94d937","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    faces,v=x\n    succ={}\n    for f in faces:\n        n=len(f)\n        for j in range(n):\n            if f[j]==v:\n                p,q=f[(j+1)%n],f[(j-1)%n]\n                if p in succ: return 'nonmanifold'\n                succ[p]=q\n    if not succ: return 'isolated'\n    starts=[p for p in succ if p not in succ.values()]\n    if len(starts)>1: return 'nonmanifold'\n    s=starts[0] if starts else min(succ)\n    ring=[s]\n    u=s\n    while u in succ and succ[u]!=s:\n        u=succ[u]\n        ring.append(u)\n    if len(ring)!=len(set(succ)|set(succ.values())): return 'nonmanifold'\n    return [ring,'boundary' if starts else 'interior']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['disk centre', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0]], [[1, 2, 3, 4, 5], 'interior']], ['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['fan middle rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3]], [[4, 0, 2], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['octahedron equator', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 2]], [[0, 1, 5, 3], 'interior']], ['bowtie pinch', [[[[0, 1, 2], [0, 3, 4]], 0]], 'nonmanifold']], [['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['octahedron equator', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 2]], [[0, 1, 5, 3], 'interior']], ['bowtie pinch', [[[[0, 1, 2], [0, 3, 4]], 0]], 'nonmanifold'], ['double disk pinch', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [0, 6, 7], [0, 7, 8], [0, 8, 6]], 0]], 'nonmanifold'], ['quad grid centre', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 4]], [[1, 5, 7, 3], 'interior']], ['quad grid edge', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 1]], [[2, 4, 0], 'boundary']]], [['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['double disk pinch', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1], [0, 6, 7], [0, 7, 8], [0, 8, 6]], 0]], 'nonmanifold'], ['quad grid centre', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 4]], [[1, 5, 7, 3], 'interior']], ['quad grid edge', [[[[0, 1, 4, 3], [1, 2, 5, 4], [3, 4, 7, 6], [4, 5, 8, 7]], 1]], [[2, 4, 0], 'boundary']], ['isolated vertex', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 9]], 'isolated'], ['flipped neighbour', [[[[0, 1, 2], [0, 3, 2]], 0]], 'nonmanifold'], ['same spoke twice', [[[[0, 1, 2], [0, 1, 3]], 0]], 'nonmanifold']], [['fan middle rim', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 3]], [[4, 0, 2], 'boundary']], ['isolated vertex', [[[[0, 2, 1], [0, 1, 3], [1, 2, 3], [0, 3, 2]], 9]], 'isolated'], ['flipped neighbour', [[[[0, 1, 2], [0, 3, 2]], 0]], 'nonmanifold'], ['same spoke twice', [[[[0, 1, 2], [0, 1, 3]], 0]], 'nonmanifold'], ['duplicated face', [[[[0, 1, 2], [0, 1, 2], [0, 2, 3]], 0]], 'nonmanifold'], ['cube corner', [[[[0, 3, 2, 1], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]], 6]], [[2, 7, 5], 'interior']], ['torus vertex', [[[[0, 3, 4], [0, 4, 1], [1, 4, 5], [1, 5, 2], [2, 5, 3], [2, 3, 0], [3, 6, 7], [3, 7, 4], [4, 7, 8], [4, 8, 5], [5, 8, 6], [5, 6, 3], [6, 0, 1], [6, 1, 7], [7, 1, 2], [7, 2, 8], [8, 2, 0], [8, 0, 6]], 4]], [[0, 3, 7, 8, 5, 1], 'interior']]], [['disk centre', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 0]], [[1, 2, 3, 4, 5], 'interior']], ['disk rim vertex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 5], [0, 5, 1]], 2]], [[3, 0, 1], 'boundary']], ['fan apex', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4]], 0]], [[1, 2, 3, 4], 'boundary']], ['octahedron top', [[[[0, 1, 2], [0, 2, 3], [0, 3, 4], [0, 4, 1], [5, 2, 1], [5, 3, 2], [5, 4, 3], [5, 1, 4]], 0]], [[1, 2, 3, 4], 'interior']], ['duplicated face', [[[[0, 1, 2], [0, 1, 2], [0, 2, 3]], 0]], 'nonmanifold'], ['cube corner', [[[[0, 3, 2, 1], [4, 5, 6, 7], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]], 6]], [[2, 7, 5], 'interior']], ['torus vertex', [[[[0, 3, 4], [0, 4, 1], [1, 4, 5], [1, 5, 2], [2, 5, 3], [2, 3, 0], [3, 6, 7], [3, 7, 4], [4, 7, 8], [4, 8, 5], [5, 8, 6], [5, 6, 3], [6, 0, 1], [6, 1, 7], [7, 1, 2], [7, 2, 8], [8, 2, 0], [8, 0, 6]], 4]], [[0, 3, 7, 8, 5, 1], 'interior']]]]\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-one-ring-order-ring-orientation","generated_at":"2026-09-29T14:51:10.258523+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 the next corner p to the previous corner q.","root_cause":"The successor map is built from previous corner to next corner.","sha256":"18344be5a07ab5466135cf4feb20a21bea7c977148ba55f0ed1998a5444cfa36","title":"One-ring is walked clockwise · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.178,"exit_code":1,"observations":[{"actual":[[5,4,3,2,1],"interior"],"check":"disk centre","expected":[[1,2,3,4,5],"interior"],"passed":false},{"actual":[[1,0,3],"boundary"],"check":"disk rim vertex","expected":[[3,0,1],"boundary"],"passed":false},{"actual":[[4,3,2,1],"boundary"],"check":"fan apex","expected":[[1,2,3,4],"boundary"],"passed":false},{"actual":[[2,0,4],"boundary"],"check":"fan middle rim","expected":[[4,0,2],"boundary"],"passed":false},{"actual":[[4,3,2,1],"interior"],"check":"octahedron top","expected":[[1,2,3,4],"interior"],"passed":false},{"actual":[[3,5,1,0],"interior"],"check":"octahedron equator","expected":[[0,1,5,3],"interior"],"passed":false},{"actual":"nonmanifold","check":"bowtie pinch","expected":"nonmanifold","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disk centre\", \"actual\": [[5, 4, 3, 2, 1], \"interior\"], \"expected\": [[1, 2, 3, 4, 5], \"interior\"], \"passed\": false}, {\"check\": \"disk rim vertex\", \"actual\": [[1, 0, 3], \"boundary\"], \"expected\": [[3, 0, 1], \"boundary\"], \"passed\": false}, {\"check\": \"fan apex\", \"actual\": [[4, 3, 2, 1], \"boundary\"], \"expected\": [[1, 2, 3, 4], \"boundary\"], \"passed\": false}, {\"check\": \"fan middle rim\", \"actual\": [[2, 0, 4], \"boundary\"], \"expected\": [[4, 0, 2], \"boundary\"], \"passed\": false}, {\"check\": \"octahedron top\", \"actual\": [[4, 3, 2, 1], \"interior\"], \"expected\": [[1, 2, 3, 4], \"interior\"], \"passed\": false}, {\"check\": \"octahedron equator\", \"actual\": [[3, 5, 1, 0], \"interior\"], \"expected\": [[0, 1, 5, 3], \"interior\"], \"passed\": false}, {\"check\": \"bowtie pinch\", \"actual\": \"nonmanifold\", \"expected\": \"nonmanifold\", \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":44.16,"exit_code":1,"observations":[{"actual":[[1,5,4,3,2],"interior"],"check":"disk centre","expected":[[1,2,3,4,5],"interior"],"passed":false},{"actual":[[1,0,3],"boundary"],"check":"disk rim vertex","expected":[[3,0,1],"boundary"],"passed":false},{"actual":[[4,3,2,1],"boundary"],"check":"fan apex","expected":[[1,2,3,4],"boundary"],"passed":false},{"actual":[[2,0,4],"boundary"],"check":"fan middle rim","expected":[[4,0,2],"boundary"],"passed":false},{"actual":[[1,4,3,2],"interior"],"check":"octahedron top","expected":[[1,2,3,4],"interior"],"passed":false},{"actual":[[0,3,5,1],"interior"],"check":"octahedron equator","expected":[[0,1,5,3],"interior"],"passed":false},{"actual":"nonmanifold","check":"bowtie pinch","expected":"nonmanifold","passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disk centre\", \"actual\": [[1, 5, 4, 3, 2], \"interior\"], \"expected\": [[1, 2, 3, 4, 5], \"interior\"], \"passed\": false}, {\"check\": \"disk rim vertex\", \"actual\": [[1, 0, 3], \"boundary\"], \"expected\": [[3, 0, 1], \"boundary\"], \"passed\": false}, {\"check\": \"fan apex\", \"actual\": [[4, 3, 2, 1], \"boundary\"], \"expected\": [[1, 2, 3, 4], \"boundary\"], \"passed\": false}, {\"check\": \"fan middle rim\", \"actual\": [[2, 0, 4], \"boundary\"], \"expected\": [[4, 0, 2], \"boundary\"], \"passed\": false}, {\"check\": \"octahedron top\", \"actual\": [[1, 4, 3, 2], \"interior\"], \"expected\": [[1, 2, 3, 4], \"interior\"], \"passed\": false}, {\"check\": \"octahedron equator\", \"actual\": [[0, 3, 5, 1], \"interior\"], \"expected\": [[0, 1, 5, 3], \"interior\"], \"passed\": false}, {\"check\": \"bowtie pinch\", \"actual\": \"nonmanifold\", \"expected\": \"nonmanifold\", \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.458,"exit_code":0,"observations":[{"actual":[[1,2,3,4,5],"interior"],"check":"disk centre","expected":[[1,2,3,4,5],"interior"],"passed":true},{"actual":[[3,0,1],"boundary"],"check":"disk rim vertex","expected":[[3,0,1],"boundary"],"passed":true},{"actual":[[1,2,3,4],"boundary"],"check":"fan apex","expected":[[1,2,3,4],"boundary"],"passed":true},{"actual":[[4,0,2],"boundary"],"check":"fan middle rim","expected":[[4,0,2],"boundary"],"passed":true},{"actual":[[1,2,3,4],"interior"],"check":"octahedron top","expected":[[1,2,3,4],"interior"],"passed":true},{"actual":[[0,1,5,3],"interior"],"check":"octahedron equator","expected":[[0,1,5,3],"interior"],"passed":true},{"actual":"nonmanifold","check":"bowtie pinch","expected":"nonmanifold","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"disk centre\", \"actual\": [[1, 2, 3, 4, 5], \"interior\"], \"expected\": [[1, 2, 3, 4, 5], \"interior\"], \"passed\": true}, {\"check\": \"disk rim vertex\", \"actual\": [[3, 0, 1], \"boundary\"], \"expected\": [[3, 0, 1], \"boundary\"], \"passed\": true}, {\"check\": \"fan apex\", \"actual\": [[1, 2, 3, 4], \"boundary\"], \"expected\": [[1, 2, 3, 4], \"boundary\"], \"passed\": true}, {\"check\": \"fan middle rim\", \"actual\": [[4, 0, 2], \"boundary\"], \"expected\": [[4, 0, 2], \"boundary\"], \"passed\": true}, {\"check\": \"octahedron top\", \"actual\": [[1, 2, 3, 4], \"interior\"], \"expected\": [[1, 2, 3, 4], \"interior\"], \"passed\": true}, {\"check\": \"octahedron equator\", \"actual\": [[0, 1, 5, 3], \"interior\"], \"expected\": [[0, 1, 5, 3], \"interior\"], \"passed\": true}, {\"check\": \"bowtie pinch\", \"actual\": \"nonmanifold\", \"expected\": \"nonmanifold\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}