{
  "schemaVersion": 1,
  "kind": "original-lumacta-triangular-hole-topology-example",
  "createdFor": "2026-10-01",
  "originalGeometry": true,
  "syntheticGeometry": true,
  "instructMeshExecuted": false,
  "trellisExecuted": false,
  "externalCodeUsed": false,
  "modelWeightsDownloaded": false,
  "fabricationPerformed": false,
  "slicingPerformed": false,
  "physicalSafetyValidated": false,
  "printabilityValidated": false,
  "method": "Count undirected edge incidences, check each vertex link is one path or cycle, check opposite directions on shared edges; reverse the single boundary loop to append one cap triangle.",
  "coordinateUnits": "OBJ is unitless. Nominal millimetres are an explicit interpretation of this original fixture only.",
  "fixture": {
    "vertexIndexBase": 1,
    "vertices": [
      [
        10,
        10,
        10
      ],
      [
        30,
        10,
        10
      ],
      [
        10,
        30,
        10
      ],
      [
        10,
        10,
        30
      ]
    ],
    "labels": [
      "A",
      "B",
      "C",
      "D"
    ],
    "beforeFaces": [
      [
        1,
        3,
        2
      ],
      [
        1,
        2,
        4
      ],
      [
        1,
        4,
        3
      ]
    ],
    "appendedFace": [
      2,
      3,
      4
    ],
    "edgeAxisLength": 20
  },
  "before": {
    "vertexCount": 4,
    "referencedVertexCount": 4,
    "unusedVertexCount": 0,
    "triangleCount": 3,
    "uniqueEdgeCount": 6,
    "interiorEdgeCount": 3,
    "boundaryEdgeCount": 3,
    "boundaryVertexCount": 3,
    "boundaryLoopCount": 1,
    "boundaryTopologyValid": true,
    "boundaryLoops": [
      [
        2,
        4,
        3,
        2
      ]
    ],
    "nonManifoldEdgeCount": 0,
    "nonManifoldVertexCount": 0,
    "nonManifoldVertices": [],
    "orientationConflictEdgeCount": 0,
    "connectedComponentCount": 1,
    "eulerCharacteristic": 1,
    "manifoldWithBoundary": true,
    "closedOrientedManifold": false,
    "signedVolumeSum": -2000,
    "closedSurfaceSignedVolume": null,
    "volumeInterpretation": "Open surface: this sum is origin-dependent and is not an enclosed volume.",
    "selfIntersectionsChecked": false,
    "vertexIndexBase": 1,
    "edgeIncidence": [
      {
        "vertices": [
          1,
          2
        ],
        "faceIndices": [
          1,
          2
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            2,
            1
          ],
          [
            1,
            2
          ]
        ]
      },
      {
        "vertices": [
          1,
          3
        ],
        "faceIndices": [
          1,
          3
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            1,
            3
          ],
          [
            3,
            1
          ]
        ]
      },
      {
        "vertices": [
          1,
          4
        ],
        "faceIndices": [
          2,
          3
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            4,
            1
          ],
          [
            1,
            4
          ]
        ]
      },
      {
        "vertices": [
          2,
          3
        ],
        "faceIndices": [
          1
        ],
        "incidentFaceCount": 1,
        "directedUses": [
          [
            3,
            2
          ]
        ]
      },
      {
        "vertices": [
          2,
          4
        ],
        "faceIndices": [
          2
        ],
        "incidentFaceCount": 1,
        "directedUses": [
          [
            2,
            4
          ]
        ]
      },
      {
        "vertices": [
          3,
          4
        ],
        "faceIndices": [
          3
        ],
        "incidentFaceCount": 1,
        "directedUses": [
          [
            4,
            3
          ]
        ]
      }
    ]
  },
  "after": {
    "vertexCount": 4,
    "referencedVertexCount": 4,
    "unusedVertexCount": 0,
    "triangleCount": 4,
    "uniqueEdgeCount": 6,
    "interiorEdgeCount": 6,
    "boundaryEdgeCount": 0,
    "boundaryVertexCount": 0,
    "boundaryLoopCount": 0,
    "boundaryTopologyValid": true,
    "boundaryLoops": [],
    "nonManifoldEdgeCount": 0,
    "nonManifoldVertexCount": 0,
    "nonManifoldVertices": [],
    "orientationConflictEdgeCount": 0,
    "connectedComponentCount": 1,
    "eulerCharacteristic": 2,
    "manifoldWithBoundary": true,
    "closedOrientedManifold": true,
    "signedVolumeSum": 1333.3333333333335,
    "closedSurfaceSignedVolume": 1333.3333333333335,
    "volumeInterpretation": "Algebraic closed-surface volume; no physical validation.",
    "selfIntersectionsChecked": false,
    "vertexIndexBase": 1,
    "edgeIncidence": [
      {
        "vertices": [
          1,
          2
        ],
        "faceIndices": [
          1,
          2
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            2,
            1
          ],
          [
            1,
            2
          ]
        ]
      },
      {
        "vertices": [
          1,
          3
        ],
        "faceIndices": [
          1,
          3
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            1,
            3
          ],
          [
            3,
            1
          ]
        ]
      },
      {
        "vertices": [
          1,
          4
        ],
        "faceIndices": [
          2,
          3
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            4,
            1
          ],
          [
            1,
            4
          ]
        ]
      },
      {
        "vertices": [
          2,
          3
        ],
        "faceIndices": [
          1,
          4
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            3,
            2
          ],
          [
            2,
            3
          ]
        ]
      },
      {
        "vertices": [
          2,
          4
        ],
        "faceIndices": [
          2,
          4
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            2,
            4
          ],
          [
            4,
            2
          ]
        ]
      },
      {
        "vertices": [
          3,
          4
        ],
        "faceIndices": [
          3,
          4
        ],
        "incidentFaceCount": 2,
        "directedUses": [
          [
            4,
            3
          ],
          [
            3,
            4
          ]
        ]
      }
    ]
  },
  "translationCheck": {
    "translation": [
      -10,
      -10,
      -10
    ],
    "beforeSignedVolumeSum": 0,
    "afterSignedVolumeSum": 1333.3333333333333,
    "interpretation": "The open sum changes with the origin; the closed sum remains 8000/6 within floating-point precision."
  },
  "formulas": {
    "edgeIncidence": "For each triangle (i,j,k), increment sorted pairs (i,j), (j,k), (k,i). Count 1 = boundary; count 2 = interior; count >2 = non-manifold edge.",
    "vertexLinks": "At vertex v, replace each incident triangle (v,a,b) by link edge (a,b). A connected path is a boundary vertex; a connected cycle is an interior vertex. Branches or disconnected fans fail.",
    "signedVolume": "Sum dot(a, cross(b,c))/6 over the oriented triangles. This is not an enclosed volume for an open surface.",
    "expectedClosedVolume": "20 × 20 × 20 / 6 = 4000/3 nominal mm³."
  },
  "limitations": [
    "This fixture is a convex tetrahedron with one missing face, not a generated model.",
    "The repair function is limited to one triangular boundary and rejects other hole shapes.",
    "No general self-intersection detection, thickness analysis, material, slicer, strength, tolerances or physical checks are included.",
    "Closed topology and signed volume do not establish printability, strength, accuracy or safety."
  ]
}
