# Port progress

Generated from `plan/units/*.toml` and CI's `reports/difftest/*.json` by `harness/plan/progress.py`; do not edit by hand.

**262 / 262 units ported** (262 green, 0 partial), **389,403 / 389,403 upstream lines (100.0%)**. 0 claimed, 0 blocked, 0 todo.

Legend: ✅ green (identical to C++) · 🟡 partial (passes; some cases wait on unported code) · 🔨 claimed · ▶️ ready (all dependencies done) · ⏳ claimable, dependencies still missing · ⛔ blocked.

## Ready to claim now

_None right now; see the next section._

## Claimable now, dependencies still missing

Anything `todo` can be claimed. These need stubs for, or co-porting of, the listed dependencies (AGENTS.md section 4).


## In progress

_None._

## By module

### geom (29/29)

- [x] ✅ `geom.extent3d` (1122 lines) — green, 3086 cases
- [x] ✅ `geom.vector2d` (339 lines) — green, 4060 cases
- [x] ✅ `geom.attribute` (920 lines) — green, 2029 cases
- [x] ✅ `geom.tol` (923 lines) — green, 3456 cases
- [x] ✅ `geom.tree` (1259 lines) — green, 639 cases
- [x] ✅ `geom.assert_array` (373 lines) — green, 3735 cases
- [x] ✅ `geom.context` (355 lines) — green, 2013 cases
- [x] ✅ `geom.extent1d` (974 lines) — green, 3091 cases
- [x] ✅ `geom.matrix` (816 lines) — green, 4044 cases
- [x] ✅ `geom.periodic_extent1d` (406 lines) — green, 4054 cases
- [x] ✅ `geom.vector3d` (1145 lines) — green, 6114 cases
- [x] ✅ `geom.axis2_placement` (479 lines) — green, 4051 cases
- [x] ✅ `geom.extent2d` (766 lines) — green, 3069 cases
- [x] ✅ `geom.geom_utility_p2` (1617 lines) — green, 3282 cases
- [x] ✅ `geom.hash_table` (593 lines) — green, 619 cases
- [x] ✅ `geom.local_solve1d` (1294 lines) — green, 3317 cases
- [x] ✅ `geom.local_solve_nd` (860 lines) — green, 3043 cases
- [x] ✅ `geom.object` (673 lines) — green, 624 cases
- [x] ✅ `geom.polynomial` (386 lines) — green, 6038 cases
- [x] ✅ `geom.geom_utility_p1` (2178 lines) — green, 4185 cases
- [x] ✅ `geom.grid` (876 lines) — green, 621 cases
- [x] ✅ `geom.polar_box` (979 lines) — green, 3033 cases
- [x] ✅ `geom.solution_array` (1319 lines) — green, 810 cases
- [x] ✅ `geom.global_solver` (1775 lines) — green, 620 cases
- [x] ✅ `geom.pseudo_box` (1508 lines) — green, 3012 cases
- [x] ✅ `geom.tools` (326 lines) — green, 915 cases
- [x] ✅ `geom.transform` (681 lines) — green, 3042 cases
- [x] ✅ `geom.a_object` (935 lines) — green, 2040 cases
- [x] ✅ `geom.point_set` (694 lines) — green, 2032 cases

### nurbs (48/48)

- [x] ✅ `nlib.knots` (768 lines) — green, 2959 cases
- [x] ✅ `nlib.math` (2971 lines) — green, 3086 cases
- [x] ✅ `nlib.geom` (1244 lines) — green, 3176 cases
- [x] ✅ `nlib.basis_basic` (786 lines) — green, 2605 cases
- [x] ✅ `nlib.srf_basic` (1088 lines) — green, 3220 cases
- [x] ✅ `nlib.basis_adv` (361 lines) — green, 1751 cases
- [x] ✅ `nlib.bezier` (1154 lines) — green, 2223 cases
- [x] ✅ `nlib.funcs_basic` (538 lines) — green, 3130 cases
- [x] ✅ `nlib.crv_basic` (1542 lines) — green, 3417 cases
- [x] ✅ `nlib.crv_fit_p1` (1707 lines) — green, 2089 cases
- [x] ✅ `nlib.crv_tool_p1` (1371 lines) — green, 2143 cases
- [x] ✅ `nlib.iges` (1055 lines) — green, 2029 cases
- [x] ✅ `nlib.srf_tool_p1` (1678 lines) — green, 3133 cases
- [x] ✅ `nlib.crv_fit_p2` (1586 lines) — green, 2109 cases
- [x] ✅ `nlib.crv_nurb` (1879 lines) — green, 2886 cases
- [x] ✅ `nlib.funcs_adv` (1676 lines) — green, 2080 cases
- [x] ✅ `nlib.srf_fit` (1359 lines) — green, 1556 cases
- [x] ✅ `nlib.crv_fit_p3` (1234 lines) — green, 2242 cases
- [x] ✅ `nlib.crv_geom` (729 lines) — green, 1725 cases
- [x] ✅ `nlib.crv_tool_p2` (1748 lines) — green, 2126 cases
- [x] ✅ `nurbs.nurbs_crv` (2200 lines) — green, 4113 cases
- [x] ✅ `nlib.crv_adv_p1` (2031 lines) — green, 2670 cases
- [x] ✅ `nlib.crv_common` (803 lines) — green, 2140 cases
- [x] ✅ `nlib.spiral` (392 lines) — green, 2032 cases
- [x] ✅ `nlib.crv_adv_p2` (1722 lines) — green, 2820 cases
- [x] ✅ `nlib.srf_common` (661 lines) — green, 1550 cases
- [x] ✅ `nurbs.b_spline_curve_p1` (1894 lines) — green, 2216 cases
- [x] ✅ `nlib.crv_approx` (908 lines) — green, 1646 cases
- [x] ✅ `nlib.crv_offset` (346 lines) — green, 1555 cases
- [x] ✅ `nlib.srf_nurb` (2560 lines) — green, 2711 cases
- [x] ✅ `nlib.srf_tool_p2` (1455 lines) — green, 3102 cases
- [x] ✅ `nurbs.b_spline_curve_n_lib` (2794 lines) — green, 2338 cases
- [x] ✅ `nurbs.nurbs_srf` (1188 lines) — green, 3092 cases
- [x] ✅ `nlib.srf_adv_p2` (2097 lines) — green, 1695 cases
- [x] ✅ `nlib.srf_adv_p3` (2233 lines) — green, 3275 cases
- [x] ✅ `nlib.srf_tool_p3` (1380 lines) — green, 2524 cases
- [x] ✅ `nurbs.b_spline_curve_p2` (1872 lines) — green, 2334 cases
- [x] ✅ `nurbs.b_spline_surface_p1` (1790 lines) — green, 2122 cases
- [x] ✅ `nlib.srf_tool_p4` (1005 lines) — green, 2681 cases
- [x] ✅ `nurbs.b_spline_curve_p3` (1187 lines) — green, 2195 cases
- [x] ✅ `nlib.srf_adv_p4` (2228 lines) — green, 3164 cases
- [x] ✅ `nlib.srf_adv_p1` (1188 lines) — green, 2886 cases
- [x] ✅ `nlib.srf_adv_p5` (1970 lines) — green, 3086 cases
- [x] ✅ `nlib.srf_adv_p6` (2214 lines) — green, 1020 cases
- [x] ✅ `nlib.srf_offset` (613 lines) — green, 438 cases
- [x] ✅ `nurbs.b_spline_surface_n_lib_p1` (2033 lines) — green, 699 cases
- [x] ✅ `nurbs.b_spline_surface_n_lib_p2` (1932 lines) — green, 774 cases
- [x] ✅ `nurbs.b_spline_surface_p2` (1338 lines) — green, 815 cases

### curve (25/25)

- [x] ✅ `curve.hermite_curve` (383 lines) — green, 2131 cases
- [x] ✅ `curve.curve_p2` (2302 lines) — green, 3029 cases
- [x] ✅ `curve.conic` (859 lines) — green, 3240 cases
- [x] ✅ `curve.crv_in_volume` (949 lines) — green, 2030 cases
- [x] ✅ `curve.curve_cache` (1474 lines) — green, 642 cases
- [x] ✅ `curve.hyperbola` (468 lines) — green, 2062 cases
- [x] ✅ `curve.iso_curve` (310 lines) — green, 2874 cases
- [x] ✅ `curve.line` (1884 lines) — green, 2103 cases
- [x] ✅ `curve.offset_curve` (492 lines) — green, 2808 cases
- [x] ✅ `curve.parabola` (441 lines) — green, 3044 cases
- [x] ✅ `curve.projected_curve` (569 lines) — green, 2727 cases
- [x] ✅ `curve.tangent_field` (319 lines) — green, 655 cases
- [x] ✅ `curve.ellipse_p2` (1916 lines) — green, 2107 cases
- [x] ✅ `curve.curve_p4` (2377 lines) — green, 3260 cases
- [x] ✅ `curve.curve_p3` (2072 lines) — green, 3081 cases
- [x] ✅ `curve.curve_p1` (2097 lines) — green, 3091 cases
- [x] ✅ `curve.curve_p6` (2376 lines) — green, 3138 cases
- [x] ✅ `curve.crv_on_surf` (1728 lines) — green, 2107 cases
- [x] ✅ `curve.curve_p7` (1666 lines) — green, 3067 cases
- [x] ✅ `curve.ellipse_p1` (1930 lines) — green, 2031 cases
- [x] ✅ `curve.curve_p8` (1670 lines) — green, 3068 cases
- [x] ✅ `curve.composite_curve_p1` (1700 lines) — green, 3096 cases
- [x] ✅ `curve.composite_curve_p2` (1345 lines) — green, 676 cases
- [x] ✅ `curve.curve_p5` (2299 lines) — green, 3097 cases
- [x] ✅ `curve.curve_p9` (1783 lines) — green, 3126 cases

### surface (40/40)

- [x] ✅ `surface.volume_p1` (2014 lines) — green, 2886 cases
- [x] ✅ `surface.b_spline_volume` (1226 lines) — green, 2333 cases
- [x] ✅ `surface.twist_volume` (649 lines) — green, 1572 cases
- [x] ✅ `surface.surface_p2` (2398 lines) — green, 16688 cases
- [x] ✅ `surface.curve_bounded_surface` (324 lines) — green, 537 cases
- [x] ✅ `surface.surface_cache_p1` (1944 lines) — green, 872 cases
- [x] ✅ `surface.plane_p1` (1934 lines) — green, 2705 cases
- [x] ✅ `surface.surf_of_revolution_p1` (1522 lines) — green, 894 cases
- [x] ✅ `surface.surface_p9` (1252 lines) — green, 833 cases
- [x] ✅ `surface.trim_srf_cache` (966 lines) — green, 762 cases
- [x] ✅ `surface.b_spline_volume_n_lib` (310 lines) — green, 2420 cases
- [x] ✅ `surface.bend_volume` (945 lines) — green, 2347 cases
- [x] ✅ `surface.cone_p1` (1835 lines) — green, 20702 cases
- [x] ✅ `surface.surf_of_extrusion_p1` (1865 lines) — green, 2071 cases
- [x] ✅ `surface.surf_of_revolution_p3` (1620 lines) — green, 26731 cases
- [x] ✅ `surface.surface_cache_p2` (1245 lines) — green, 905 cases
- [x] ✅ `surface.torus` (1180 lines) — green, 596 cases
- [x] ✅ `surface.unbend_volume` (920 lines) — green, 1874 cases
- [x] ✅ `surface.cone_p2` (1656 lines) — green, 1570 cases
- [x] ✅ `surface.surf_of_revolution_p2` (1369 lines) — green, 1167 cases
- [x] ✅ `surface.surface_cache_p3` (1703 lines) — green, 600 cases
- [x] ✅ `surface.volume_p2` (1490 lines) — green, 11220 cases
- [x] ✅ `surface.surface_p7` (2406 lines) — green, 3728 cases
- [x] ✅ `surface.plane_p2` (1627 lines) — green, 2228 cases
- [x] ✅ `surface.surface_p4` (2270 lines) — green, 3015 cases
- [x] ✅ `surface.sphere` (2861 lines) — green, 816 cases
- [x] ✅ `surface.surf_of_extrusion_p2` (1420 lines) — green, 1548 cases
- [x] ✅ `surface.surface_p5` (2321 lines) — green, 3058 cases
- [x] ✅ `surface.cone_p3` (1939 lines) — green, 1442 cases
- [x] ✅ `surface.surface_p1` (2458 lines) — green, 1000 cases
- [x] ✅ `surface.surface_p6` (2150 lines) — green, 2104 cases
- [x] ✅ `surface.srf_in_volume` (779 lines) — green, 2112 cases
- [x] ✅ `surface.surface_p10` (2172 lines) — green, 867 cases
- [x] ✅ `surface.surface_p3` (1794 lines) — green, 2500 cases
- [x] ✅ `surface.offset_surface` (1787 lines) — green, 3082 cases
- [x] ✅ `surface.surface_p11` (1789 lines) — green, 808 cases
- [x] ✅ `surface.surface_p8` (2374 lines) — green, 2108 cases
- [x] ✅ `surface.surface_point_solve_p1` (1771 lines) — green, 1035 cases
- [x] ✅ `surface.surface_point_solve_p2` (1882 lines) — green, 1353 cases
- [x] ✅ `surface.surface_point_solve_p3` (1282 lines) — green, 1365 cases

### topology (32/32)

- [x] ✅ `topology.database_io` (363 lines) — green, 2066 cases
- [x] ✅ `topology.topology` (389 lines) — green, 658 cases
- [x] ✅ `topology.brep_data` (1466 lines) — green, 2379 cases
- [x] ✅ `topology.proto_topology_p1` (2746 lines) — green, 1922 cases
- [x] ✅ `topology.edgeuse_p1` (1157 lines) — green, 5554 cases
- [x] ✅ `topology.brep_validation` (1500 lines) — green, 112 cases
- [x] ✅ `topology.face_p2` (1827 lines) — green, 2692 cases
- [x] ✅ `topology.edgeuse_p2` (600 lines) — green, 4583 cases
- [x] ✅ `topology.shell` (750 lines) — green, 911 cases
- [x] ✅ `topology.vertexuse` (1429 lines) — green, 2686 cases
- [x] ✅ `topology.vertex` (824 lines) — green, 5598 cases
- [x] ✅ `topology.loopuse` (892 lines) — green, 8854 cases
- [x] ✅ `topology.brep_p8` (1768 lines) — green, 339 cases
- [x] ✅ `topology.edge` (2213 lines) — green, 1915 cases
- [x] ✅ `topology.edgeuse_p3` (2273 lines) — green, 4805 cases
- [x] ✅ `topology.trimming_tools` (2878 lines) — green, 3305 cases
- [x] ✅ `topology.face_p4` (1812 lines) — green, 5506 cases
- [x] ✅ `topology.brep_p10` (1890 lines) — green, 1404 cases
- [x] ✅ `topology.face_p3` (1881 lines) — green, 1781 cases
- [x] ✅ `topology.topology_traverser` (784 lines) — green, 909 cases
- [x] ✅ `topology.brep_p7` (2503 lines) — green, 348 cases
- [x] ✅ `topology.face_p1` (2171 lines) — green, 2315 cases
- [x] ✅ `topology.brep_p1` (2454 lines) — green, 2636 cases
- [x] ✅ `topology.brep_p6` (1479 lines) — green, 595 cases
- [x] ✅ `topology.brep_cache` (389 lines) — green, 663 cases
- [x] ✅ `topology.brep_p4` (2113 lines) — green, 327 cases
- [x] ✅ `topology.brep_p9` (2443 lines) — green, 684 cases
- [x] ✅ `topology.brep_p2` (2443 lines) — green, 1720 cases
- [x] ✅ `topology.brep_p5` (2193 lines) — green, 797 cases
- [x] ✅ `topology.brep_p3` (2503 lines) — green, 906 cases
- [x] ✅ `topology.proto_topology_p2` (2091 lines) — green, 1767 cases
- [x] ✅ `topology.proto_topology_p3` (1577 lines) — green, 3013 cases

### intersect (25/25)

- [x] ✅ `intersect.surface_tracer` (1900 lines) — green, 427 cases
- [x] ✅ `intersect.point_class` (909 lines) — green, 2520 cases
- [x] ✅ `intersect.curve_class_p1` (2087 lines) — green, 2125 cases
- [x] ✅ `intersect.surface_drop_lib_p1` (1478 lines) — green, 2926 cases
- [x] ✅ `intersect.surface_silhouette` (979 lines) — green, 709 cases
- [x] ✅ `intersect.curve_class_p7` (2248 lines) — green, 1516 cases
- [x] ✅ `intersect.ray_tracer` (1246 lines) — green, 421 cases
- [x] ✅ `intersect.surface_drop_curve` (2014 lines) — green, 547 cases
- [x] ✅ `intersect.surface_drop_lib_p2` (1080 lines) — green, 1531 cases
- [x] ✅ `intersect.surface_intersector_p1` (1816 lines) — green, 1510 cases
- [x] ✅ `intersect.topology_solver_p1` (1838 lines) — green, 3532 cases
- [x] ✅ `intersect.adv_surface_intersector` (1646 lines) — green, 1931 cases
- [x] ✅ `intersect.curve_class_p2` (1928 lines) — green, 1671 cases
- [x] ✅ `intersect.surface_drop_lib_p3` (2062 lines) — green, 1529 cases
- [x] ✅ `intersect.surface_intersector_p2` (1677 lines) — green, 1660 cases
- [x] ✅ `intersect.curve_class_p3` (1986 lines) — green, 3708 cases
- [x] ✅ `intersect.curve_class_p4` (2022 lines) — green, 3201 cases
- [x] ✅ `intersect.surface_intersector_p3` (1932 lines) — green, 1527 cases
- [x] ✅ `intersect.curve_class_p6` (2213 lines) — green, 4470 cases
- [x] ✅ `intersect.surface_intersector_p4` (1570 lines) — green, 1542 cases
- [x] ✅ `intersect.topology_solver_p2` (1391 lines) — green, 2429 cases
- [x] ✅ `intersect.curve_class_p5` (2017 lines) — green, 1411 cases
- [x] ✅ `intersect.surface_intersector_p5` (622 lines) — green, 1731 cases
- [x] ✅ `intersect.curve_class_p8` (1900 lines) — green, 1127 cases
- [x] ✅ `intersect.curve_class_p9` (1220 lines) — green, 438 cases

### primitive (5/5)

- [x] ✅ `primitive.api_curves` (649 lines) — green, 1629 cases
- [x] ✅ `primitive.primitive_creation_p1` (2322 lines) — green, 773 cases
- [x] ✅ `primitive.primitive_creation_p3` (1842 lines) — green, 296 cases
- [x] ✅ `primitive.primitive_creation_p2` (2258 lines) — green, 374 cases
- [x] ✅ `primitive.api_primitives` (885 lines) — green, 2035 cases

### query (10/10)

- [x] ✅ `query.edge` (1025 lines) — green, 1368 cases
- [x] ✅ `query.loop` (830 lines) — green, 3040 cases
- [x] ✅ `query.face_p2` (1161 lines) — green, 1401 cases
- [x] ✅ `query.face_p3` (1620 lines) — green, 1199 cases
- [x] ✅ `query.poly` (2119 lines) — green, 955 cases
- [x] ✅ `query.face_p1` (465 lines) — green, 2266 cases
- [x] ✅ `query.face_p4` (1432 lines) — green, 503 cases
- [x] ✅ `query.tess` (838 lines) — green, 676 cases
- [x] ✅ `query.brep` (517 lines) — green, 1172 cases
- [x] ✅ `query.api_queries` (809 lines) — green, 1203 cases

### mass (1/1)

- [x] ✅ `mass.integrator` (1031 lines) — green, 1528 cases

### sweep (5/5)

- [x] ✅ `sweep.topology_sweep` (2456 lines) — green, 568 cases
- [x] ✅ `sweep.rotational_sweep_geometry` (1542 lines) — green, 761 cases
- [x] ✅ `sweep.trans_sweep_geometry` (817 lines) — green, 788 cases
- [x] ✅ `sweep.api_brep` (529 lines) — green, 575 cases
- [x] ✅ `sweep.api_surfaces` (381 lines) — green, 882 cases

### heal (7/7)

- [x] ✅ `heal.gap` (1475 lines) — green, 721 cases
- [x] ✅ `heal.face_props` (1410 lines) — green, 1528 cases
- [x] ✅ `heal.heal_data_p2` (2160 lines) — green, 741 cases
- [x] ✅ `heal.heal_data_p1` (922 lines) — green, 495 cases
- [x] ✅ `heal.stitch_p1` (2037 lines) — green, 300 cases
- [x] ✅ `heal.heal_data_p3` (1967 lines) — green, 480 cases
- [x] ✅ `heal.stitch_p2` (1906 lines) — green, 556 cases

### offset (3/3)

- [x] ✅ `offset.offset_geometry_creation` (2652 lines) — green, 915 cases
- [x] ✅ `offset.offset_executive_p1` (2107 lines) — green, 1048 cases
- [x] ✅ `offset.offset_executive_p2` (1846 lines) — green, 322 cases

### boolean (9/9)

- [x] ✅ `boolean.topology_intersector_p1` (2491 lines) — green, 845 cases
- [x] ✅ `boolean.topology_intersector_p2` (2195 lines) — green, 910 cases
- [x] ✅ `boolean.topology_intersector_p3` (1849 lines) — green, 271 cases
- [x] ✅ `boolean.merge_p1` (993 lines) — green, 248 cases
- [x] ✅ `boolean.merge_p2` (1967 lines) — green, 45 cases
- [x] ✅ `boolean.merge_p5` (475 lines) — green, 140 cases
- [x] ✅ `boolean.merge_p4` (2590 lines) — green, 311 cases
- [x] ✅ `boolean.merge_p3` (1152 lines) — green, 423 cases
- [x] ✅ `boolean.api_brep` (410 lines) — green, 325 cases

### blend (22/22)

- [x] ✅ `blend.fillet_custom_solver` (1236 lines) — green, 451 cases
- [x] ✅ `blend.fillet_geom_p1` (2113 lines) — green, 490 cases
- [x] ✅ `blend.fillet_solver_p1` (1861 lines) — green, 351 cases
- [x] ✅ `blend.hcr` (1875 lines) — green, 434 cases
- [x] ✅ `blend.fillet_intersector` (1708 lines) — green, 1292 cases
- [x] ✅ `blend.fillet_solver_p5` (848 lines) — green, 100 cases
- [x] ✅ `blend.fillet_standard_solver_p1` (2336 lines) — green, 3839 cases
- [x] ✅ `blend.fillet_solver_p4` (1404 lines) — green, 651 cases
- [x] ✅ `blend.fillet_executive_p3` (1608 lines) — green, 580 cases
- [x] ✅ `blend.fillet_executive_p1` (2063 lines) — green, 155 cases
- [x] ✅ `blend.fillet_corner_p1` (1971 lines) — green, 308 cases
- [x] ✅ `blend.fillet_solver_p2` (1939 lines) — green, 311 cases
- [x] ✅ `blend.fillet_solver_p3` (1112 lines) — green, 400 cases
- [x] ✅ `blend.fillet_geom_p3` (1032 lines) — green, 325 cases
- [x] ✅ `blend.fillet_geom_p4` (2074 lines) — green, 400 cases
- [x] ✅ `blend.fillet_geom_p6` (1813 lines) — green, 400 cases
- [x] ✅ `blend.fillet_standard_solver_p2` (1989 lines) — green, 405 cases
- [x] ✅ `blend.fillet_corner_p3` (1697 lines) — green, 1013 cases
- [x] ✅ `blend.fillet_executive_p2` (1152 lines) — green, 278 cases
- [x] ✅ `blend.fillet_geom_p2` (2077 lines) — green, 351 cases
- [x] ✅ `blend.fillet_geom_p5` (1952 lines) — green, 300 cases
- [x] ✅ `blend.fillet_corner_p2` (1892 lines) — green, 630 cases

### (crate-wide) (1/1)

- [x] ✅ `audit.recursion` (0 lines) — green
