{"abstract":"Edge predictions are low for any mesh whose faces are not all triangles or quads.","category":"Mesh topology invariants","checks":7,"contract":"Input [V,E,arities,B,scheme,levels]: counts of a mesh with face sizes \"arities\" and B boundary edges. Loop (triangles only, else \"non-triangle\"): V+=E, E=2E+3F, F=4F. Catmull-Clark: V=V+E+F, E=2E+sum(arities), faces become sum(arities) quads. Boundary edges double per level. Return [V,E,F,B,V-E+F] after the given levels.","contract_signature":"x","evaluation_group":"w2-mesh_topology_invariants-subdivision-counts","failed_approach":"Assuming every input face is a quad breaks for triangles and pentagons.","family":"w2-mesh_topology_invariants-subdivision-counts-catmull-clark-edges","id":"FA-88516","implementations":{"attempt":{"sha256":"9b8856d72809ea817d65e0119482d3624c0f5e12e4a48e18d05dfe5e2b227622","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    V,E,ar,B,scheme,levels=x\n    ar=list(ar)\n    for _ in range(levels):\n        F=len(ar)\n        S=sum(ar)\n        if scheme=='loop':\n            if any(n!=3 for n in ar): return 'non-triangle'\n            V,E,ar=V+E,2*E+3*F,[3]*(4*F)\n        else:\n            V,E,ar=V+E+F,2*E+4*len(ar),[4]*S\n        B=2*B\n    return [V,E,len(ar),B,V-E+len(ar)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['tetra loop 1', [[4, 6, [3, 3, 3, 3], 0, 'loop', 1]], [10, 24, 16, 0, 2]], ['tetra loop 2', [[4, 6, [3, 3, 3, 3], 0, 'loop', 2]], [34, 96, 64, 0, 2]], ['disk loop', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 1]], [16, 35, 20, 10, 1]], ['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['cube cc', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 1]], [26, 48, 24, 0, 2]], ['cube cc 2', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 2]], [98, 192, 96, 0, 2]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]]], [['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['cube cc', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 1]], [26, 48, 24, 0, 2]], ['cube cc 2', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 2]], [98, 192, 96, 0, 2]], ['single quad cc', [[4, 4, [4], 4, 'cc', 2]], [25, 40, 16, 16, 1]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad and triangle cc 2', [[5, 6, [4, 3], 4, 'cc', 2]], [39, 66, 28, 16, 1]], ['pentagon cc', [[5, 5, [5], 5, 'cc', 1]], [11, 15, 5, 10, 1]]], [['single quad cc', [[4, 4, [4], 4, 'cc', 2]], [25, 40, 16, 16, 1]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad and triangle cc 2', [[5, 6, [4, 3], 4, 'cc', 2]], [39, 66, 28, 16, 1]], ['pentagon cc', [[5, 5, [5], 5, 'cc', 1]], [11, 15, 5, 10, 1]], ['quad under loop', [[4, 4, [4], 4, 'loop', 1]], 'non-triangle'], ['triangle then quad under loop', [[5, 6, [3, 4], 4, 'loop', 1]], 'non-triangle'], ['zero levels', [[4, 6, [3, 3, 3, 3], 0, 'loop', 0]], [4, 6, 4, 0, 2]]], [['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad under loop', [[4, 4, [4], 4, 'loop', 1]], 'non-triangle'], ['triangle then quad under loop', [[5, 6, [3, 4], 4, 'loop', 1]], 'non-triangle'], ['zero levels', [[4, 6, [3, 3, 3, 3], 0, 'loop', 0]], [4, 6, 4, 0, 2]], ['torus cc', [[9, 18, [4, 4, 4, 4, 4, 4, 4, 4, 4], 0, 'cc', 1]], [36, 72, 36, 0, 0]], ['triangle tetra cc', [[4, 6, [3, 3, 3, 3], 0, 'cc', 1]], [14, 24, 12, 0, 2]], ['single triangle loop 3', [[3, 3, [3], 3, 'loop', 3]], [45, 108, 64, 24, 1]]], [['tetra loop 1', [[4, 6, [3, 3, 3, 3], 0, 'loop', 1]], [10, 24, 16, 0, 2]], ['tetra loop 2', [[4, 6, [3, 3, 3, 3], 0, 'loop', 2]], [34, 96, 64, 0, 2]], ['disk loop', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 1]], [16, 35, 20, 10, 1]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad and triangle cc 2', [[5, 6, [4, 3], 4, 'cc', 2]], [39, 66, 28, 16, 1]], ['triangle tetra cc', [[4, 6, [3, 3, 3, 3], 0, 'cc', 1]], [14, 24, 12, 0, 2]], ['single triangle loop 3', [[3, 3, [3], 3, 'loop', 3]], [45, 108, 64, 24, 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":"115fbaf750cad3831f9fe6d69b07c51774fc9e559ce947effd6dd7d5a6e0e225","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\nimport math\nN = 1\nobservations = []\ndef solve(x):\n    V,E,ar,B,scheme,levels=x\n    ar=list(ar)\n    for _ in range(levels):\n        F=len(ar)\n        S=sum(ar)\n        if scheme=='loop':\n            if any(n!=3 for n in ar): return 'non-triangle'\n            V,E,ar=V+E,2*E+3*F,[3]*(4*F)\n        else:\n            V,E,ar=V+E+F,2*E+len(ar),[4]*S\n        B=2*B\n    return [V,E,len(ar),B,V-E+len(ar)]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['tetra loop 1', [[4, 6, [3, 3, 3, 3], 0, 'loop', 1]], [10, 24, 16, 0, 2]], ['tetra loop 2', [[4, 6, [3, 3, 3, 3], 0, 'loop', 2]], [34, 96, 64, 0, 2]], ['disk loop', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 1]], [16, 35, 20, 10, 1]], ['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['cube cc', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 1]], [26, 48, 24, 0, 2]], ['cube cc 2', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 2]], [98, 192, 96, 0, 2]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]]], [['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['cube cc', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 1]], [26, 48, 24, 0, 2]], ['cube cc 2', [[8, 12, [4, 4, 4, 4, 4, 4], 0, 'cc', 2]], [98, 192, 96, 0, 2]], ['single quad cc', [[4, 4, [4], 4, 'cc', 2]], [25, 40, 16, 16, 1]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad and triangle cc 2', [[5, 6, [4, 3], 4, 'cc', 2]], [39, 66, 28, 16, 1]], ['pentagon cc', [[5, 5, [5], 5, 'cc', 1]], [11, 15, 5, 10, 1]]], [['single quad cc', [[4, 4, [4], 4, 'cc', 2]], [25, 40, 16, 16, 1]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad and triangle cc 2', [[5, 6, [4, 3], 4, 'cc', 2]], [39, 66, 28, 16, 1]], ['pentagon cc', [[5, 5, [5], 5, 'cc', 1]], [11, 15, 5, 10, 1]], ['quad under loop', [[4, 4, [4], 4, 'loop', 1]], 'non-triangle'], ['triangle then quad under loop', [[5, 6, [3, 4], 4, 'loop', 1]], 'non-triangle'], ['zero levels', [[4, 6, [3, 3, 3, 3], 0, 'loop', 0]], [4, 6, 4, 0, 2]]], [['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad under loop', [[4, 4, [4], 4, 'loop', 1]], 'non-triangle'], ['triangle then quad under loop', [[5, 6, [3, 4], 4, 'loop', 1]], 'non-triangle'], ['zero levels', [[4, 6, [3, 3, 3, 3], 0, 'loop', 0]], [4, 6, 4, 0, 2]], ['torus cc', [[9, 18, [4, 4, 4, 4, 4, 4, 4, 4, 4], 0, 'cc', 1]], [36, 72, 36, 0, 0]], ['triangle tetra cc', [[4, 6, [3, 3, 3, 3], 0, 'cc', 1]], [14, 24, 12, 0, 2]], ['single triangle loop 3', [[3, 3, [3], 3, 'loop', 3]], [45, 108, 64, 24, 1]]], [['tetra loop 1', [[4, 6, [3, 3, 3, 3], 0, 'loop', 1]], [10, 24, 16, 0, 2]], ['tetra loop 2', [[4, 6, [3, 3, 3, 3], 0, 'loop', 2]], [34, 96, 64, 0, 2]], ['disk loop', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 1]], [16, 35, 20, 10, 1]], ['quad and triangle cc', [[5, 6, [4, 3], 4, 'cc', 1]], [13, 19, 7, 8, 1]], ['quad and triangle cc 2', [[5, 6, [4, 3], 4, 'cc', 2]], [39, 66, 28, 16, 1]], ['triangle tetra cc', [[4, 6, [3, 3, 3, 3], 0, 'cc', 1]], [14, 24, 12, 0, 2]], ['single triangle loop 3', [[3, 3, [3], 3, 'loop', 3]], [45, 108, 64, 24, 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-subdivision-counts-catmull-clark-edges","generated_at":"2026-09-29T14:51:08.954642+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.","root_cause":"Each face adds one edge per side, but the update adds F instead of the sum of arities.","sha256":"3bd1ca7d5ed9923864f58ea9f6407f6bd78e10564f0234397b5670fbdc8c3d12","title":"Catmull-Clark edge count uses the face count for face edges · 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":39.208,"exit_code":1,"observations":[{"actual":[10,24,16,0,2],"check":"tetra loop 1","expected":[10,24,16,0,2],"passed":true},{"actual":[34,96,64,0,2],"check":"tetra loop 2","expected":[34,96,64,0,2],"passed":true},{"actual":[16,35,20,10,1],"check":"disk loop","expected":[16,35,20,10,1],"passed":true},{"actual":[51,130,80,20,1],"check":"disk loop 2","expected":[51,130,80,20,1],"passed":true},{"actual":[26,48,24,0,2],"check":"cube cc","expected":[26,48,24,0,2],"passed":true},{"actual":[98,192,96,0,2],"check":"cube cc 2","expected":[98,192,96,0,2],"passed":true},{"actual":[13,20,7,8,0],"check":"quad and triangle cc","expected":[13,19,7,8,1],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tetra loop 1\", \"actual\": [10, 24, 16, 0, 2], \"expected\": [10, 24, 16, 0, 2], \"passed\": true}, {\"check\": \"tetra loop 2\", \"actual\": [34, 96, 64, 0, 2], \"expected\": [34, 96, 64, 0, 2], \"passed\": true}, {\"check\": \"disk loop\", \"actual\": [16, 35, 20, 10, 1], \"expected\": [16, 35, 20, 10, 1], \"passed\": true}, {\"check\": \"disk loop 2\", \"actual\": [51, 130, 80, 20, 1], \"expected\": [51, 130, 80, 20, 1], \"passed\": true}, {\"check\": \"cube cc\", \"actual\": [26, 48, 24, 0, 2], \"expected\": [26, 48, 24, 0, 2], \"passed\": true}, {\"check\": \"cube cc 2\", \"actual\": [98, 192, 96, 0, 2], \"expected\": [98, 192, 96, 0, 2], \"passed\": true}, {\"check\": \"quad and triangle cc\", \"actual\": [13, 20, 7, 8, 0], \"expected\": [13, 19, 7, 8, 1], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.652,"exit_code":1,"observations":[{"actual":[10,24,16,0,2],"check":"tetra loop 1","expected":[10,24,16,0,2],"passed":true},{"actual":[34,96,64,0,2],"check":"tetra loop 2","expected":[34,96,64,0,2],"passed":true},{"actual":[16,35,20,10,1],"check":"disk loop","expected":[16,35,20,10,1],"passed":true},{"actual":[51,130,80,20,1],"check":"disk loop 2","expected":[51,130,80,20,1],"passed":true},{"actual":[26,30,24,0,20],"check":"cube cc","expected":[26,48,24,0,2],"passed":false},{"actual":[80,84,96,0,92],"check":"cube cc 2","expected":[98,192,96,0,2],"passed":false},{"actual":[13,14,7,8,6],"check":"quad and triangle cc","expected":[13,19,7,8,1],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tetra loop 1\", \"actual\": [10, 24, 16, 0, 2], \"expected\": [10, 24, 16, 0, 2], \"passed\": true}, {\"check\": \"tetra loop 2\", \"actual\": [34, 96, 64, 0, 2], \"expected\": [34, 96, 64, 0, 2], \"passed\": true}, {\"check\": \"disk loop\", \"actual\": [16, 35, 20, 10, 1], \"expected\": [16, 35, 20, 10, 1], \"passed\": true}, {\"check\": \"disk loop 2\", \"actual\": [51, 130, 80, 20, 1], \"expected\": [51, 130, 80, 20, 1], \"passed\": true}, {\"check\": \"cube cc\", \"actual\": [26, 30, 24, 0, 20], \"expected\": [26, 48, 24, 0, 2], \"passed\": false}, {\"check\": \"cube cc 2\", \"actual\": [80, 84, 96, 0, 92], \"expected\": [98, 192, 96, 0, 2], \"passed\": false}, {\"check\": \"quad and triangle cc\", \"actual\": [13, 14, 7, 8, 6], \"expected\": [13, 19, 7, 8, 1], \"passed\": false}], \"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."}}