Program: 175863
Project: 175863
Buggy source:
private void mergeOnProfiles(HalfMesh2 mesh,List<Line> footprint){
  System.out.println("String_Node_Str");
  TreeSet<HalfFace> togo=new TreeSet<>((  HalfFace o1,  HalfFace o2) -> Double.compare(o1.area(),o2.area()));
  togo.addAll(mesh.faces);
  int count=0;
  while (!togo.isEmpty()) {
    HalfFace f=togo.pollFirst();
    Cache<HalfEdge,MutableDouble> crossedBy=new Cach<>(e -> new MutableDouble(0));
    for (    HalfEdge e : f) {
      SuperEdge se=(SuperEdge)e;
      if (se.profLine != null) {
        MegaFacade mf=((SuperLine)se.profLine).mega;
        if (mf != null)         for (        Prof p : mf.getTween(se.start,se.end,0)) {
          Line proj=new Line(Pointz.to2(p.to3d(p.get(0))),Pointz.to2(p.to3d(p.get(p.size() - 1))));
          for (          HalfEdge e2 : f) {
            SuperEdge se2=(SuperEdge)e2;
            if (se2.profLine == null && (se2.over == null || ((SuperEdge)se2.over).profLine == null) && e2.over != null && e2.line().intersects(proj) != null && Mathz.inRange(e2.line().absAngle(proj),0.25 * Math.PI,0.75 * Math.PI)) {
              crossedBy.get(e2).d+=TweedSettings.settings.profileHSampleDist;
            }
          }
        }
      }
    }
    count+=crossedBy.cache.size();
    Optional<Map.Entry<HalfEdge,MutableDouble>> longestO=crossedBy.cache.entrySet().stream().filter(e1 -> ((SuperEdge)e1.getKey()).profLine == null && e1.getValue().d > 0).max((e1,e2) -> Double.compare(e1.getValue().d,e2.getValue().d));
    if (longestO.isPresent()) {
      Map.Entry<HalfEdge,MutableDouble> longest=longestO.get();
      if (longest.getValue().d > 0.6 * longest.getKey().length()) {
        HalfFace tgf=longest.getKey().over.face;
        togo.remove(tgf);
        longest.getKey().face.merge(mesh,tgf);
        ((SuperFace)longest.getKey().face).mergeFrom((SuperFace)tgf);
        togo.add(f);
      }
    }
  }
  System.out.println("String_Node_Str" + count);
  killDoubleEdges(mesh);
}

Fixed version (ground truth):
private void mergeOnProfiles(HalfMesh2 mesh,List<Line> footprint){
  System.out.println("String_Node_Str");
  TreeSet<HalfFace> togo=new TreeSet<>((  HalfFace o1,  HalfFace o2) -> Double.compare(o1.area(),o2.area()));
  togo.addAll(mesh.faces);
  int count=0;
  while (!togo.isEmpty()) {
    HalfFace f=togo.pollFirst();
    Cache<HalfEdge,MutableDouble> crossedBy=new Cach<>(e -> new MutableDouble(0));
    for (    HalfEdge e : f) {
      SuperEdge se=(SuperEdge)e;
      if (se.profLine != null) {
        MegaFacade mf=((SuperLine)se.profLine).mega;
        if (mf != null)         for (        Prof p : mf.getTween(se.start,se.end,0)) {
          Line proj=new Line(Pointz.to2(p.to3d(p.get(0))),Pointz.to2(p.to3d(p.get(p.size() - 1))));
          for (          HalfEdge e2 : f) {
            SuperEdge se2=(SuperEdge)e2;
            if (se2.profLine == null && (se2.over == null || ((SuperEdge)se2.over).profLine == null) && e2.over != null && e2.line().intersects(proj) != null && Mathz.inRange(e2.line().absAngle(proj),0.25 * Math.PI,0.75 * Math.PI)) {
              crossedBy.get(e2).d+=TweedSettings.settings.profileHSampleDist;
            }
          }
        }
      }
    }
    count+=crossedBy.cache.size();
    Optional<Map.Entry<HalfEdge,MutableDouble>> longestO=crossedBy.cache.entrySet().stream().filter(e1 -> ((SuperEdge)e1.getKey()).profLine == null && e1.getValue().d > 0).max((e1,e2) -> Double.compare(e1.getValue().d,e2.getValue().d));
    if (longestO.isPresent()) {
      Map.Entry<HalfEdge,MutableDouble> longest=longestO.get();
      if (longest.getValue().d > 0.6 * longest.getKey().length()) {
        HalfFace tgf=longest.getKey().over.face;
        togo.remove(tgf);
        longest.getKey().face.merge(mesh,tgf);
        ((SuperFace)longest.getKey().face).mergeFrom((SuperFace)tgf);
        togo.add(f);
      }
    }
  }
  killDoubleEdges(mesh);
}