{"abstract":"Predicted edge counts are low and the Euler characteristic drifts after subdivision.","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":"E = 4E only holds for closed meshes where 3F = 2E.","family":"w2-mesh_topology_invariants-subdivision-counts-loop-edge-count","id":"FA-88506","implementations":{"attempt":{"sha256":"340d42c2af5c13645e7280ac3b104d02ce729ea118f4a4b50ced57b636d5ce5f","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,4*E,[3]*(4*F)\n        else:\n            V,E,ar=V+E+F,2*E+S,[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]], ['single quad cc', [[4, 4, [4], 4, 'cc', 2]], [25, 40, 16, 16, 1]]], [['tetra loop 2', [[4, 6, [3, 3, 3, 3], 0, 'loop', 2]], [34, 96, 64, 0, 2]], ['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['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]]], [['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]], ['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'], ['single triangle loop 3', [[3, 3, [3], 3, 'loop', 3]], [45, 108, 64, 24, 1]]], [['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]], ['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]], ['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['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]]]]\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":"1fed656f01da8a17efed67f75d8dfa0a1221c3dec52aec26171e123bd37194ee","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+F,[3]*(4*F)\n        else:\n            V,E,ar=V+E+F,2*E+S,[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]], ['single quad cc', [[4, 4, [4], 4, 'cc', 2]], [25, 40, 16, 16, 1]]], [['tetra loop 2', [[4, 6, [3, 3, 3, 3], 0, 'loop', 2]], [34, 96, 64, 0, 2]], ['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['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]]], [['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]], ['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'], ['single triangle loop 3', [[3, 3, [3], 3, 'loop', 3]], [45, 108, 64, 24, 1]]], [['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]], ['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]], ['disk loop 2', [[6, 10, [3, 3, 3, 3, 3], 5, 'loop', 2]], [51, 130, 80, 20, 1]], ['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]]]]\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-loop-edge-count","generated_at":"2026-09-29T14:51:08.786647+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 contributes three interior edges, but the update adds only one per face.","sha256":"c89a50c2389dd31d20cb923ae92e8c8a1568678fc58bbfd4b8f794de4c6b7683","title":"Loop subdivision edge count adds F instead of 3F · 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":38.936,"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,40,20,10,-4],"check":"disk loop","expected":[16,35,20,10,1],"passed":false},{"actual":[56,160,80,20,-24],"check":"disk loop 2","expected":[51,130,80,20,1],"passed":false},{"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":[25,40,16,16,1],"check":"single quad cc","expected":[25,40,16,16,1],"passed":true}],"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, 40, 20, 10, -4], \"expected\": [16, 35, 20, 10, 1], \"passed\": false}, {\"check\": \"disk loop 2\", \"actual\": [56, 160, 80, 20, -24], \"expected\": [51, 130, 80, 20, 1], \"passed\": false}, {\"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\": \"single quad cc\", \"actual\": [25, 40, 16, 16, 1], \"expected\": [25, 40, 16, 16, 1], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.578,"exit_code":1,"observations":[{"actual":[10,16,16,0,10],"check":"tetra loop 1","expected":[10,24,16,0,2],"passed":false},{"actual":[26,48,64,0,42],"check":"tetra loop 2","expected":[34,96,64,0,2],"passed":false},{"actual":[16,25,20,10,11],"check":"disk loop","expected":[16,35,20,10,1],"passed":false},{"actual":[41,70,80,20,51],"check":"disk loop 2","expected":[51,130,80,20,1],"passed":false},{"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":[25,40,16,16,1],"check":"single quad cc","expected":[25,40,16,16,1],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"tetra loop 1\", \"actual\": [10, 16, 16, 0, 10], \"expected\": [10, 24, 16, 0, 2], \"passed\": false}, {\"check\": \"tetra loop 2\", \"actual\": [26, 48, 64, 0, 42], \"expected\": [34, 96, 64, 0, 2], \"passed\": false}, {\"check\": \"disk loop\", \"actual\": [16, 25, 20, 10, 11], \"expected\": [16, 35, 20, 10, 1], \"passed\": false}, {\"check\": \"disk loop 2\", \"actual\": [41, 70, 80, 20, 51], \"expected\": [51, 130, 80, 20, 1], \"passed\": false}, {\"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\": \"single quad cc\", \"actual\": [25, 40, 16, 16, 1], \"expected\": [25, 40, 16, 16, 1], \"passed\": true}], \"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."}}