{"abstract":"Face counts do not grow and later levels use stale arities.","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":"Creating four quads per face is only right for quad input.","family":"w2-mesh_topology_invariants-subdivision-counts-catmull-clark-face-arities","id":"FA-88521","implementations":{"attempt":{"sha256":"208f6ce502e67156be5be4289575f579b5f5b28f4182aa75dc348312bb44959e","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+S,[4]*(4*len(ar))\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":"79e0f08f686b7c3c869b6b6a099daeb4db2f9752845b73c8d2ad8641e9be6ce6","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+S,ar\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-face-arities","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":"The arity list is not replaced by the sum(arities) new quads.","sha256":"17925216e24999c35afd003387282f41b8e62a2f1d94a05ec2aeb5a193cde8ca","title":"Catmull-Clark keeps the input face list after a level · 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":40.429,"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,19,8,8,2],"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, 19, 8, 8, 2], \"expected\": [13, 19, 7, 8, 1], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.268,"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,6,0,-16],"check":"cube cc","expected":[26,48,24,0,2],"passed":false},{"actual":[80,120,6,0,-34],"check":"cube cc 2","expected":[98,192,96,0,2],"passed":false},{"actual":[13,19,2,8,-4],"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, 6, 0, -16], \"expected\": [26, 48, 24, 0, 2], \"passed\": false}, {\"check\": \"cube cc 2\", \"actual\": [80, 120, 6, 0, -34], \"expected\": [98, 192, 96, 0, 2], \"passed\": false}, {\"check\": \"quad and triangle cc\", \"actual\": [13, 19, 2, 8, -4], \"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."}}