This stuff is dumb. The answer is dumb. I can be pretty dumb.
Answer: Doesn’t matter. All meshes have holes. If they don’t, they will once you slice through them since the new surface must have a hole between it and the old surface or it’ll be smooth-shaded and I don’t think that’s ever wanted. So stop trying to cheat and just deal with the holes.
class PolyPoint {
var edgeIndex : int; // the vix of the newedge vertex i represent
var surfaceIndex : int; // the vix of the newsurface vertex i am in the same place as
var end1 : int; // my clockwise-next vix
var end2 : int; // my counter-c-previous vix
}
For each cut triangle, create two polypoints and assign their edge index. Each of them has one of its ends assigned, and the other is left pointing to nothing for now (because we don’t know). You need to know the triangle’s wind order to pick which ends are assigned. Ughmath.
For each newedge vertex, if there exists a newsurface vertex at this vertex’s position, set this vertex’s polypoint.surfaceIndex to that vertex. Otherwise, create a newsurface vertex at this position and give it a new polypoint entry with no data set except for surfaceIndex.
Now that the surface loop(s) vertices are created, add the connections in. For each newedge vertex… y’know what, copypaste:
for ( vix = firstNewEdgeVix; vix < firstNewSurfaceVix; vix++ ) {
polypoint = pointDict[vix];
if ( polypoint.end1 > 0 ) {
pointDict[ polypoint.surfaceIndex ].end1 = pointDict[ polypoint.end1 ].surfaceIndex;
}
if ( polypoint.end2 > 0 ) {
pointDict[ polypoint.surfaceIndex ].end2 = pointDict[ polypoint.end2 ].surfaceIndex;
}
}
Tell each edgepoint that its ends are the surfacepoints of its ends. (translate from edge index to surface index)
From there you just locate loop ends, if any (“end1==0 || end2==0”), start anywhere, and follow the end1 or end2 around to create your loops, occasionally skipping from endpoint to endpoint or swapping from end1 to end2 traversal if an unmatched endpoint is encountered
This stuff must be documented somewhere already. But I can’t find it. Is this really not a documented thing? Has everyone had to rebuild this particular wheel? 
Oh well. At least I’ve almost got it, just have to find the winding order of a triangle relative to… This is complex nightmare math abominations. I need to go shoot some robutts.