kernel-cases: the rig runs SMLib only and keeps each run's SMLib dumps

SMLib is the only kernel now. cargo xtask kernel-cases ran every case once
per kernel asked for (--kernel default|smlib|both), setting
SOLIDCRAFT_KERNEL per run, and wrote a column per kernel; solidcraft-cli no
longer reads that variable.

The rig and the ladder run each case once, through solidcraft-cli built with
--features smlib (cargo run passes it), and report one result per case:
--kernel and the env var are gone. Each run has an output folder (--out,
default target/kernel-cases, target/kernel-ladder for the ladder) holding
results.json (every case's full result, which --results used to write on
request) and dumps/<area>-<case>/: every case runs with
solidcraft-cli kernel-cases --dumps=<out>/dumps, so a failed SMLib call
leaves its inputs for replay.

The ladder's golden holds one entry per case: golden.json is the last
recording's smlib entries, which predate SMLib running every case (its
reason says so); record it again after the first SMLib-only run.

docs/kernel-cases.md (until the next run regenerates it),
tests/kernel-cases/README.md, docs/kernel-smlib-sweeps-shell.md (its truck
column and comparisons dropped), xtask's and solidcraft-cli's usage text:
one kernel. Nothing was run.

clippy -p xtask --all-targets: clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017itGh5fpMEousnZ91cYcVt
This commit is contained in:
jyviko
2026-10-22 07:31:00 -04:00
parent 46c53b3e97
commit 66ab6b7f9f
8 changed files with 842 additions and 2473 deletions
+1 -1
View File
@@ -75,7 +75,7 @@ const USAGE: &str = "usage:
solidcraft-cli recipe <recipe.json>
solidcraft-cli oracle <case-dir>... [--json]
solidcraft-cli kernel-cases <case-dir>... [--json] [--dumps=DIR]
(the kernel regression rig, tests/kernel-cases; SOLIDCRAFT_KERNEL picks the kernel; --dumps: each case's
(the kernel regression rig, tests/kernel-cases, on SMLib; --dumps: each case's
failing SMLib calls leave their inputs for replay in DIR/<area>-<case>)
solidcraft-cli fuzz [--from N] [--count N] [--jobs J] [--timeout S] [--steps N] [--minimise] [--out DIR] [--report FILE]
solidcraft-cli mcp [--in design.solidcraft|script.json] [--connect 127.0.0.1:PORT [--token T]] [--allow-path DIR]... [--allow-any-path]
+387 -387
View File
@@ -1,401 +1,401 @@
# Kernel regression rig
Generated by `cargo xtask kernel-cases`. Every geometry case the old kernel (truck) got wrong, as an issue, a PR or a crash report recorded it, is a use case in [`tests/kernel-cases/`](../tests/kernel-cases/) with its own right answer: numbers from analysis or a hand calculation (**analytic**) where the geometry has them, and otherwise the invariants (**invariants**): the operation succeeds, or refuses cleanly where that is the right answer; each body is one closed shell that passes the record's structure and geometry checks and, in builds with SMLib, SMLib's own check; the expected face, edge and vertex counts. Never a kernel's output, and never a commercial kernel's.
Generated by `cargo xtask kernel-cases`. Every geometry case the old kernel (truck) got wrong, as an issue, a PR or a crash report recorded it, is a use case in [`tests/kernel-cases/`](../tests/kernel-cases/) with its own right answer: numbers from analysis or a hand calculation (**analytic**) where the geometry has them, and otherwise the invariants (**invariants**): the operation succeeds, or refuses cleanly where that is the right answer; each body is one closed shell that passes the record's structure and geometry checks and SMLib's own check; the expected face, edge and vertex counts. Never a kernel's output, and never a commercial kernel's.
Each kernel is graded against the case, never against the other kernel. **default** is the kernel SolidCraft ships today; **smlib** runs with `SOLIDCRAFT_KERNEL=smlib`. A failing case stays failing until its kernel is fixed; there is no workaround on SolidCraft's side. See [`tests/kernel-cases/README.md`](../tests/kernel-cases/README.md) for the format.
The cases run on SMLib, SolidCraft's kernel. A failing case stays failing until the kernel is fixed; there is no workaround on SolidCraft's side. A failed SMLib call leaves its inputs for replay in the run's output folder (`target/kernel-cases/dumps/<area>-<case>/`). See [`tests/kernel-cases/README.md`](../tests/kernel-cases/README.md) for the format.
## Coverage
| Area | Cases | default | smlib |
|---|---|---|---|
| booleans | 89 | 32 fail, 2 hang, 50 pass, 5 unsupported | 18 fail, 2 hang, 66 pass, 3 unsupported |
| crashes | 10 | 3 fail, 2 hang, 5 pass | 2 fail, 2 hang, 6 pass |
| fillets | 50 | 9 fail, 32 pass, 9 unsupported | 8 fail, 41 pass, 1 unsupported |
| import | 23 | 1 crash, 9 fail, 13 pass | 4 fail, 17 pass, 2 unsupported |
| sheet-metal | 57 | 2 fail, 55 pass | 3 fail, 54 pass |
| shell | 18 | 13 fail, 5 pass | 6 fail, 11 pass, 1 unsupported |
| sweeps | 83 | 1 crash, 22 fail, 6 hang, 54 pass | 1 crash, 15 fail, 1 hang, 51 pass, 15 unsupported |
| tessellation | 14 | 3 fail, 11 pass | 1 fail, 13 pass |
| threads | 28 | 14 fail, 4 hang, 10 pass | 17 fail, 1 hang, 10 pass |
| Area | Cases | Results |
|---|---|---|
| booleans | 89 | 18 fail, 2 hang, 66 pass, 3 unsupported |
| crashes | 10 | 2 fail, 2 hang, 6 pass |
| fillets | 50 | 8 fail, 41 pass, 1 unsupported |
| import | 23 | 4 fail, 17 pass, 2 unsupported |
| sheet-metal | 57 | 3 fail, 54 pass |
| shell | 18 | 6 fail, 11 pass, 1 unsupported |
| sweeps | 83 | 1 crash, 15 fail, 1 hang, 51 pass, 15 unsupported |
| tessellation | 14 | 1 fail, 13 pass |
| threads | 28 | 17 fail, 1 hang, 10 pass |
372 cases from 473 sources; answers: 324 analytic, 48 invariants.
## Results
| Case | Sources | What went wrong | Answer | default | smlib |
|---|---|---|---|---|---|
| booleans/1107-join-hollow-hub-with-nine-blades | [tangency-labs/solidcraft#1107](https://github.com/tangency-labs/solidcraft/issues/1107) | a hollow hub (tube r 21.5..23) joined with nine disjoint blades whose roots lie wholly in the wall: one valid solid, the cavity stays the hub's. Blades here are r1 round bars (the report's are lofted fan blades) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 4 use 0 (Some([17.082163710380097, -15.401288354283027, 9.42459 (want ok); smlib_check the operation failed: pcurve of loop 4 use 0 (Some([17.082163710380094, -15.401288354283022, 9.42459 (want ok) | pass |
| booleans/114-extrude-join-on-curved-body-coincident-wall | [tangency-labs/solidcraft#114](https://github.com/tangency-labs/solidcraft/issues/114) | extruding a profile onto a cylinder with zero taper: the new wall is the old wall continued (coincident cylindrical faces), join failed | analytic | pass | pass |
| booleans/1140-hollow-lofted-tube-cut-in-half-and-joined | [tangency-labs/solidcraft#1140](https://github.com/tangency-labs/solidcraft/issues/1140) | a spiral round tube (radius growing 76 to 210 mm over one turn, 12 mm wall) built as 8 lofted bands, each minus a lofted bore, cut in half through the axis plane z=0 and the halves joined: must give one body | invariants | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 1 (Some([95.80000016013133, -3.428471146999651e-8, 75.786 (want ok) | pass |
| booleans/1195-text-cut-into-plate | [tangency-labs/solidcraft#1195](https://github.com/tangency-labs/solidcraft/issues/1195) | text cut into a plate: a boundary curve's end meeting a point whatever its parameter (glyph outlines through a text cut) | invariants | pass | pass |
| booleans/1279-cut-with-tool-cylinder-coaxial-with-hole | [tangency-labs/solidcraft#1279](https://github.com/tangency-labs/solidcraft/issues/1279) | a corner piece (square column minus a quarter disc r1.5, 0.0003 off the axis) cut out of a part with a blind r1.6 hole on the same axis: the tool's r1.5 face sits 0.1 mm inside the hole wall; 'no result' | analytic | pass | **FAIL**: step 4 (solid.cylinder): SMLib boolean: SMLib's check refuses the result: 6 failed tests: SmFace::Test #33 Face has Coincident Edges: Face has Coincident Edges. |
| booleans/13-split-body-by-a-plane | [tangency-labs/solidcraft#13](https://github.com/tangency-labs/solidcraft/issues/13) | split a body by a plane (the split-by-a-face path tripped a debug assertion, 'Two same vertices cannot construct an edge') | analytic | pass | pass |
| booleans/1355-concentric-hole-through-drilled-recess | [tangency-labs/solidcraft#1355](https://github.com/tangency-labs/solidcraft/issues/1355) [tangency-labs/solidcraft#1736](https://github.com/tangency-labs/solidcraft/issues/1736) | a drilled O8.5 recess (118 deg drill point) in a plate, then a O4 hole through its centre: the second cut 'does not work' | analytic | pass | pass |
| booleans/1647-box-cylinder-general-intersect | [tangency-labs/solidcraft#1647](https://github.com/tangency-labs/solidcraft/issues/1647) | a box and a cylinder in general position (nothing coincident or tangent): Intersect refused as an implausible volume | analytic | pass | pass |
| booleans/1649-crossing-cylinders-union-far-from-origin | [tangency-labs/solidcraft#1649](https://github.com/tangency-labs/solidcraft/issues/1649) | union of two crossing cylinders, both moved (1000,-700,300) mm: volume lost with position | analytic | **FAIL**: record_valid geometry: portable B-rep: edge 8: curve end misses its end vertex by 0.0023531882294339375 mm (toler (want ok) | pass |
| booleans/168-rim-touching-coin-along-a-circle-only | [tangency-labs/solidcraft#168](https://github.com/tangency-labs/solidcraft/issues/168) | a rim on a coin's top face that meets the coin along one circle only (no shared area, no shared volume): it must not be joined into it | analytic | **FAIL**: smlib_check SMLib check: 3 failed tests: SmEdgeuse::Test #11 Bad UVTrimCurve: Edgeuse->UVTrimCurve has zero leng (want ok); body_count 1 (want 2) | **FAIL**: shells Coin: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); body_count 1 (want 2) |
| booleans/1717-two-overlapping-sphere-cuts | [tangency-labs/solidcraft#1717](https://github.com/tangency-labs/solidcraft/issues/1717) [tangency-labs/solidcraft#2158](https://github.com/tangency-labs/solidcraft/issues/2158) | a second sphere cut overlapping an earlier sphere cut on a box edge: 'no result' | analytic | **FAIL**: step 3 (solid.sphere): boolean Cut: the operation failed: no result | pass |
| booleans/1730-cut-short-of-far-face-keeps-skin | [tangency-labs/solidcraft#1730](https://github.com/tangency-labs/solidcraft/issues/1730) | an extrude cut whose profile stops 0.25 mm short of a wall's far face must leave that skin (it was grown through) | analytic | pass | pass |
| booleans/1858-shallow-cuts-after-earlier-pocket | [tangency-labs/solidcraft#1765](https://github.com/tangency-labs/solidcraft/issues/1765) [tangency-labs/solidcraft#1858](https://github.com/tangency-labs/solidcraft/issues/1858) | two 1.5 mm circular cuts overlapping an earlier 0.75 mm pocket (timeline roll-back, insert, redefine): the cut came out empty | analytic | pass | pass |
| booleans/1865-tube-and-sector-meeting-along-cylinder-walls | [tangency-labs/solidcraft#1865](https://github.com/tangency-labs/solidcraft/issues/1865) [tangency-labs/solidcraft#1910](https://github.com/tangency-labs/solidcraft/issues/1910) [tangency-labs/solidcraft#1983](https://github.com/tangency-labs/solidcraft/issues/1983) [tangency-labs/solidcraft#2034](https://github.com/tangency-labs/solidcraft/issues/2034) | a union of two solids that meet along cylindrical faces: a tube (r10..12, z 0..20) and a 90 deg ring sector (same radii, z 10..30) whose curved faces are the tube's own, overlapping it axially; refused ('planar faces only') or, by the faceted fallback, left 1710 faceted faces | analytic | pass | pass |
| booleans/1910-coaxial-cylinders-intersect | [tangency-labs/solidcraft#1910](https://github.com/tangency-labs/solidcraft/issues/1910) [tangency-labs/solidcraft#1865](https://github.com/tangency-labs/solidcraft/issues/1865) | intersection of two cylinders of one radius on one axis (z 0..30 and 22..46) whose round sides lie in each other over the shared 8 mm | analytic | not supported yet: step 3 (solid.combine): boolean Intersect: the operation failed: no result; the operation failed: not supported yet: the exact fallback for where the bodies mee | pass |
| booleans/1927-delete-pocket-face-restores-plate | [tangency-labs/solidcraft#1927](https://github.com/tangency-labs/solidcraft/issues/1927) | Delete Face on the 0.5 mm deep O15 recess of a plate: the face around the gap must keep its surface | analytic | pass | pass |
| booleans/1949-extrude-side-drawn-in-collinear-pieces | [tangency-labs/solidcraft#1949](https://github.com/tangency-labs/solidcraft/issues/1949) | a profile side drawn as two collinear lines extrudes into one flat face, not two with an edge between them | analytic | pass | pass |
| booleans/1949-tapered-extrude-side-in-collinear-pieces | [tangency-labs/solidcraft#1949](https://github.com/tangency-labs/solidcraft/issues/1949) | with a taper too, a side drawn in two collinear pieces is one face | analytic | pass | pass |
| booleans/1984-near-coaxial-pin-overlaps-bore-wall | [tangency-labs/solidcraft#1984](https://github.com/tangency-labs/solidcraft/issues/1984) | the overlap of a pin 0.00056 mm off the axis of a bore of its own radius (r=3, 9.65 long): a thin crescent. The report's STEP round trip is left out; this is the geometry | analytic | pass | pass |
| booleans/1984-rivet-with-flush-heads-a-hair-off-its-hole | [tangency-labs/solidcraft#1984](https://github.com/tangency-labs/solidcraft/issues/1984) | a rivet (shank r=2, heads r=4 flat on both faces of a 1.5 mm sheet) 0.004 mm off the axis of its hole: overlap with the sheet is the shank's crescent; the heads touch the sheet faces over an area but add no volume | analytic | **FAIL**: body_count 0 (want 1); volume_mm3 0 (want 0.024) | pass |
| booleans/2003-mirror-feature-join-flush-with-mirror-plane | [tangency-labs/solidcraft#2003](https://github.com/tangency-labs/solidcraft/issues/2003) | mirror a feature with Join: the image meets its original along the mirror plane and the join was refused for its volume | analytic | pass | pass |
| booleans/2008-coaxial-cylinders-join-one-wall | [tangency-labs/solidcraft#2008](https://github.com/tangency-labs/solidcraft/issues/2008) [tangency-labs/solidcraft#1986](https://github.com/tangency-labs/solidcraft/issues/1986) | a join of coaxial cylinders of one radius whose walls overlap leaves one cylindrical wall in one face (it came out as a stack of faces, so a later chamfer on its top edge refused) | analytic | pass | pass |
| booleans/2055-countersink-holes-from-several-sketch-points | [tangency-labs/solidcraft#2055](https://github.com/tangency-labs/solidcraft/issues/2055) | a countersunk hole at two sketch points at once, in a design with several bodies: 'there is no body to cut or intersect' (one point works) | analytic | pass | pass |
| booleans/2076-rectangular-pattern-of-cylinder-join | [tangency-labs/solidcraft#2076](https://github.com/tangency-labs/solidcraft/issues/2076) | a rectangular pattern of a cylinder join (pin-fin plate) scales quadratically in time | analytic | pass | pass |
| booleans/2464-extrude-join-leaves-hidden-body-alone | [tangency-labs/solidcraft#2464](https://github.com/tangency-labs/solidcraft/issues/2464) [tangency-labs/solidcraft#2465](https://github.com/tangency-labs/solidcraft/issues/2465) | an Extrude Join onto a plate with a hidden coincident copy: the hidden body must not be joined in | analytic | **FAIL**: body_count 1 (want 2); volume_mm3 8816 (want 16816) | **FAIL**: body_count 1 (want 2); volume_mm3 8816 (want 16816) |
| booleans/2524-circular-pattern-of-bore-cut | [tangency-labs/solidcraft#2524](https://github.com/tangency-labs/solidcraft/issues/2524) | a circular pattern (count 2, 360 deg, about Y) of a cut made off-axis: 'boolean Cut: no result' | analytic | pass | pass |
| booleans/2564-joined-side-run-wrapping-past-loop-start | [tangency-labs/solidcraft#2564](https://github.com/tangency-labs/solidcraft/issues/2564) [tangency-labs/solidcraft#1949](https://github.com/tangency-labs/solidcraft/issues/1949) | an extrude of an outline whose bottom side is drawn as two collinear pieces that wrap past the loop's first segment ((10,0)->(20,0) ... (0,0)->(10,0)): the bottom is one face | analytic | pass | pass |
| booleans/2580-clip-round-small-hole-of-long-plate | [tangency-labs/solidcraft#2580](https://github.com/tangency-labs/solidcraft/issues/2580) [tangency-labs/solidcraft#2579](https://github.com/tangency-labs/solidcraft/issues/2579) | a 16 mm box cut out round a small (r 1.8) hole of a 3 m long, 2 mm plate keeps the hole in both faces | analytic | pass | pass |
| booleans/2583-taper-side-drawn-in-collinear-pieces | [tangency-labs/solidcraft#2583](https://github.com/tangency-labs/solidcraft/issues/2583) | a tapered extrude of a 20x10 rectangle whose bottom side is drawn as two collinear pieces: the sloped side is one face | analytic | pass | pass |
| booleans/2601-taper-with-start-offset | [tangency-labs/solidcraft#2601](https://github.com/tangency-labs/solidcraft/issues/2601) | a tapered extrude whose start is offset along the sketch normal (the app says: not supported yet: taper with two-sided, symmetric or offset extents) | analytic | pass | pass |
| booleans/2754-taper-extrude-line-arc-corner | [tangency-labs/solidcraft#2754](https://github.com/tangency-labs/solidcraft/issues/2754) | a tapered extrude of a profile in which an arc meets a line at a corner (a half disc) | analytic | not supported yet: step 5 (solid.extrude): not supported yet: tapered profiles where an arc meets another edge at a corner | **FAIL**: step 5 (solid.extrude): SMLib extrude: SMLib's result is not a closed solid |
| booleans/2755-mirror-copy-keeps-seed-targets | [tangency-labs/solidcraft#2755](https://github.com/tangency-labs/solidcraft/issues/2755) | the mirror copy of a primitive cut changes only the seed's targets, not a body the seed was told to leave alone | analytic | pass | pass |
| booleans/2755-pattern-copies-keep-seed-targets | [tangency-labs/solidcraft#2755](https://github.com/tangency-labs/solidcraft/issues/2755) | copies of a primitive cut made with a rectangular pattern change only the seed's targets, not a body the seed was told to leave alone | analytic | pass | pass |
| booleans/2801-prism-edge-in-round-cornered-slab-end-face | [tangency-labs/solidcraft#2801](https://github.com/tangency-labs/solidcraft/issues/2801) | a join of a triangular prism and a thin slab with rounded corners (r 4.9) that share their bottom plane, the prism's edge in that plane lying in the slab's end face | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 3 (Some([5.099999999999999, -67.0, 2.220446049250313e-16] (want ok); smlib_check the operation failed: pcurve of loop 0 use 3 (Some([5.099999999999999, -67.0, 2.220446049250313e-16] (want ok) | **FAIL**: step 11 (solid.combine): SMLib boolean: SMLib's check refuses the result: 2 failed tests: SmTrimmingTools::Test #0 Edge/Edge Gap: Gap between edge endPoints exc |
| booleans/2810-taper-extrude-arcs-meeting-at-corners | [tangency-labs/solidcraft#2810](https://github.com/tangency-labs/solidcraft/issues/2810) [tangency-labs/solidcraft#2813](https://github.com/tangency-labs/solidcraft/issues/2813) | a tapered extrude of a loop of arcs on three circles meeting at sharp corners (a circle with a lobe on each side); the walls must meet at the corners | analytic | pass | **FAIL**: faces 14 (want 6) |
| booleans/2826-cut-up-to-face-leaves-no-skin | [tangency-labs/solidcraft#2826](https://github.com/tangency-labs/solidcraft/issues/2826) [tangency-labs/solidcraft#2827](https://github.com/tangency-labs/solidcraft/issues/2827) | a cut that ends exactly in a face of its target (the plate's top face) must open the hole, not leave a zero-thickness skin over it | analytic | pass | pass |
| booleans/2896-join-arm-end-into-ring-wall | [tangency-labs/solidcraft#2896](https://github.com/tangency-labs/solidcraft/issues/2896) | a join of a ring (R30/R24, 6 tall) and an arm with a convex R5 end whose tip runs 0.1 mm into the ring's outer wall (curved faces that nearly graze) | analytic | pass | pass |
| booleans/2896-join-arm-end-near-ring-wall-gap | [tangency-labs/solidcraft#2896](https://github.com/tangency-labs/solidcraft/issues/2896) | a join of a ring and an arm whose R5 convex tip stops 0.01 mm short of the ring's outer wall: nothing overlaps, so nothing fuses | analytic | **FAIL**: shells Ring: 2 (want 1); body_count 1 (want 2) | **FAIL**: shells Ring: 2 (want 1); body_count 1 (want 2) |
| booleans/2904-countersunk-hole-with-distant-body | [tangency-labs/solidcraft#2904](https://github.com/tangency-labs/solidcraft/issues/2904) | a countersunk hole in a small plate, near a rounded corner, while an unrelated body sits 120 mm away: only the plate may change, and the countersink must be complete | analytic | pass | pass |
| booleans/2928-join-cap-touching-lips-with-offset-walls | [tangency-labs/solidcraft#2928](https://github.com/tangency-labs/solidcraft/issues/2928) | two half-annulus lips (r 4..5, from z=2 to 20) joined onto a stadium-ring base (z 0..2, r 3..5 arcs, centres 20 apart) with their cylinder walls 0.0001 mm off the base's: the lip cap touches the base top, leaving a 0.0001 mm crescent overhang. Layout is a hand-built variant of the PR's public reproduction | analytic | **HANG**: no result after 180 s | **FAIL**: volume_mm3 1066.017651 (want 769.468975) |
| booleans/3027-pin-seated-line-to-line-in-bore | [tangency-labs/solidcraft#3027](https://github.com/tangency-labs/solidcraft/issues/3027) | a pin (r4) seated line to line in a bore (r4, exactly coaxial) of a bush: the two cylinder walls coincide | analytic | pass | pass |
| booleans/307-tangent-hole-contacts-ring-against-grid | [tangency-labs/solidcraft#307](https://github.com/tangency-labs/solidcraft/issues/307) | four pairs of through holes whose circles touch at exactly one point (ring holes at (+-25,0),(0,+-25) against grid holes at (+-15,0),(0,+-15)); the symmetric contacts must be treated alike and split no cylinder face | analytic | **FAIL**: smlib_check SMLib check: 4 failed tests: SmFace::Test #32 Face has Coincident Vertices: Face has Coincient Verti (want ok) | not supported yet: step 6 (solid.cylinder): SMLib boolean: export: SMLib export: not supported yet: a solid touching itself along an edge |
| booleans/308-blind-cut-ending-inside-a-cylinder | [tangency-labs/solidcraft#308](https://github.com/tangency-labs/solidcraft/issues/308) | a hinge leaf (40x30x3) with a joined r4 knuckle cylinder along X and a O4 pin hole, then a 3.3 mm blind cut of x 12..28, y 29..40 ending inside the cylinder: the result grew a sphere and a freeform face | analytic | pass | pass |
| booleans/3092-ring-on-perforated-plate | [tangency-labs/solidcraft#3092](https://github.com/tangency-labs/solidcraft/issues/3092) [tangency-labs/solidcraft#2844](https://github.com/tangency-labs/solidcraft/issues/2844) | a ring (r 19.6/20.8, 20 tall) joined onto the top of an 80x80x1.2 plate with a 9x9 grid of 6.4 mm square holes: the ring's foot crosses many hole edges | analytic | **FAIL**: smlib_check SMLib check: 1 failed tests: SmFace::Test #38 Intersecting Face Loops: Face Loops must be disjoint i (want ok) | pass |
| booleans/3175-cut-beside-sealed-void | [tangency-labs/solidcraft#3175](https://github.com/tangency-labs/solidcraft/issues/3175) | a cut over the bottom edge of a revolved cylinder that holds a sealed spherical void on its axis: the body must not come out empty or refused | analytic | pass | pass |
| booleans/3243-rim-and-rounded-tooth-join | [tangency-labs/solidcraft#3243](https://github.com/tangency-labs/solidcraft/issues/3243) | a join of a cylindrical rim (r 15.27..16.65, to z=5) and a rounded tooth trimmed to the same two cylinders that overlaps it by 0.01 mm in Z | invariants | **FAIL**: step 10 (solid.combine): boolean Union: the operation failed: no result | pass |
| booleans/3303-inward-cut-of-frustum-top-face | [tangency-labs/solidcraft#3303](https://github.com/tangency-labs/solidcraft/issues/3303) [tangency-labs/solidcraft#3309](https://github.com/tangency-labs/solidcraft/issues/3309) | cutting the complete circular top face of a widening conical frustum inward: the cylindrical tool touches the cone only at its rim | analytic | not supported yet: step 8 (solid.extrude): boolean Cut: the operation failed: no result; the operation failed: coincident faces were left in place: pushing them apart would change | pass |
| booleans/3327-cut-ending-flush-with-side-wall | [tangency-labs/solidcraft#3327](https://github.com/tangency-labs/solidcraft/issues/3327) [tangency-labs/solidcraft#2963](https://github.com/tangency-labs/solidcraft/issues/2963) | a cut whose end face lies exactly in a side wall of its target (a window notch): the cut must open the wall, with no skin left in it | analytic | pass | pass |
| booleans/3378-circular-pattern-of-join-that-merged-targets | [tangency-labs/solidcraft#3378](https://github.com/tangency-labs/solidcraft/issues/3378) | a circular pattern of a join whose two targets (rim and hub) were merged into one body by that join | analytic | pass | pass |
| booleans/3379-circular-pattern-of-thin-spoke-on-ring | [tangency-labs/solidcraft#3379](https://github.com/tangency-labs/solidcraft/issues/3379) | a circular pattern (count 5) of a spoke thinner than the ring it joins (faces 0.5 mm inside the rim and hub faces) | analytic | pass | pass |
| booleans/3383-combine-tool-into-rotated-occurrence | [tangency-labs/solidcraft#3383](https://github.com/tangency-labs/solidcraft/issues/3383) | a root body joined into a body inside a component whose occurrence is turned a quarter turn: the tool must stay where it is in the world | analytic | **FAIL**: shells Plate: 2 (want 1); volume_mm3 17000 (want 16750); bbox.min [-20, -10, -20] (want [-20, -10, -25]); bbox.max [20, 25, 20] (want [20, 5, 20]) | **FAIL**: shells Plate: 2 (want 1); volume_mm3 17000 (want 16750); bbox.min [-20, -10, -20] (want [-20, -10, -25]); bbox.max [20, 25, 20] (want [20, 5, 20]) |
| booleans/3447-split-along-plane-of-a-face | [tangency-labs/solidcraft#3447](https://github.com/tangency-labs/solidcraft/issues/3447) [tangency-labs/solidcraft#2979](https://github.com/tangency-labs/solidcraft/issues/2979) | split body where the splitting plane contains an end face (with a boss on it and an R1 fillet on the face's edge) | analytic | **FAIL**: step 4 (solid.split_body): the section through the body does not close | **FAIL**: step 4 (solid.split_body): the section through the body does not close |
| booleans/3455-join-of-64-separate-pegs | [tangency-labs/solidcraft#3455](https://github.com/tangency-labs/solidcraft/issues/3455) | one combine of 64 separate pegs that do not touch: 36 s on truck, growing 4-9x per doubling; must finish in seconds | analytic | pass | **HANG**: no result after 180 s |
| booleans/3456-deep-cut-through-drilled-taper-leaves-base | [tangency-labs/solidcraft#3456](https://github.com/tangency-labs/solidcraft/issues/3456) [tangency-labs/solidcraft#3497](https://github.com/tangency-labs/solidcraft/issues/3497) | a deep cut that removes everything above z=2 of a tapered body with nine through-bores, leaving the 2 mm drilled base | analytic | pass | pass |
| booleans/3460-cut-by-lid-with-coincident-walls-and-half-moon-tabs | [tangency-labs/solidcraft#3460](https://github.com/tangency-labs/solidcraft/issues/3460) | Combine cut (keep tools) of an enclosure by its lid whose insert is flush with the inner walls and carries four small half-moon tabs that cross them; the cut must not return the target unchanged | analytic | pass | pass |
| booleans/3485-boss-joined-on-rod-top-keeps-side-whole | [tangency-labs/solidcraft#3485](https://github.com/tangency-labs/solidcraft/issues/3485) [tangency-labs/solidcraft#3062](https://github.com/tangency-labs/solidcraft/issues/3062) | a boss joined on a rod's top face (the join runs the boss on into the rod); the rod's side must stay one face, not seamed at the boss's foot | analytic | pass | pass |
| booleans/3497-collinear-cylinders-partial-height-intersection | [tangency-labs/solidcraft#3497](https://github.com/tangency-labs/solidcraft/issues/3497) [tangency-labs/solidcraft#3456](https://github.com/tangency-labs/solidcraft/issues/3456) | intersection of two collinear R2 H12 cylinders offset by 0.75 along the axis (curved walls coincide over part of the height) | analytic | not supported yet: step 3 (solid.combine): boolean Intersect: the operation failed: no result; the operation failed: not supported yet: the exact fallback for where the bodies mee | pass |
| booleans/3497-pin-overlapping-bore-by-20-microns | [tangency-labs/solidcraft#3497](https://github.com/tangency-labs/solidcraft/issues/3497) [tangency-labs/solidcraft#3456](https://github.com/tangency-labs/solidcraft/issues/3456) | a pin r=3.02 intersected with a tube whose bore is r=3: a thin annulus (0.02 mm overlap on a curved wall) | analytic | pass | pass |
| booleans/3526-intersect-keeps-every-lump | [tangency-labs/solidcraft#3526](https://github.com/tangency-labs/solidcraft/issues/3526) [tangency-labs/solidcraft#3888](https://github.com/tangency-labs/solidcraft/issues/3888) | intersect of a two-lump target (two spheres joined while apart) with a box holding the bottom half of each | analytic | **FAIL**: body_count 0 (want 1); shells 0 (want 2); volume_mm3 0 (want 268.0826) | pass |
| booleans/3604-cut-with-g2-swept-tool-along-projected-edge | [tangency-labs/solidcraft#3604](https://github.com/tangency-labs/solidcraft/issues/3604) [tangency-labs/solidcraft#3613](https://github.com/tangency-labs/solidcraft/issues/3613) | cut of a box by a swept G2 corner-removal tool along a projected edge chain (left-rear corner; the symmetric front-left chain works) | invariants | **FAIL**: step 13 (solid.combine): boolean Cut: the operation failed: no result | **FAIL**: step 12 (solid.sweep): the path curves are not connected end to end |
| booleans/3612-circular-pattern-of-spoke-tangent-to-hub | [tangency-labs/solidcraft#3612](https://github.com/tangency-labs/solidcraft/issues/3612) [tangency-labs/solidcraft#3379](https://github.com/tangency-labs/solidcraft/issues/3379) | a spoke whose inner face x=12 is exactly tangent to the hub cylinder r=12 (line contact), joined to the rim, patterned 5 times around the hub's axis | analytic | **FAIL**: step 5 (solid.pattern.circular): lumps: shell boundaries intersect or touch; cavity ownership is ambiguous | **FAIL**: step 4 (solid.box): invalid input: native B-rep: portable B-rep: face 3 loop 1: loop encloses no (u, v) area (signed area 0) |
| booleans/3633-sphere-intersect-pyramid-apex-at-centre | [tangency-labs/solidcraft#3633](https://github.com/tangency-labs/solidcraft/issues/3633) [tangency-labs/solidcraft#3682](https://github.com/tangency-labs/solidcraft/issues/3682) | a sphere r=10 intersected with a square pyramid whose apex is the sphere's centre and whose sides lie in the planes of the sphere primitive's patch edges | analytic | **FAIL**: step 9 (solid.combine): boolean Intersect: the operation failed: no result | not supported yet: step 8 (solid.loft): not supported yet: SMLib loft to a point |
| booleans/3652-mirror-of-a-mirror-feature | [tangency-labs/solidcraft#3652](https://github.com/tangency-labs/solidcraft/issues/3652) | mirror a Mirror feature (the first mirror's hole) about a second plane: 'Mirror1 cannot be patterned or mirrored yet' | analytic | **FAIL**: step 7 (solid.mirror): Mirror1 cannot be patterned or mirrored yet | **FAIL**: step 7 (solid.mirror): Mirror1 cannot be patterned or mirrored yet |
| booleans/3665-join-extrude-column-on-floor-and-curved-walls | [tangency-labs/solidcraft#3665](https://github.com/tangency-labs/solidcraft/issues/3665) [tangency-labs/solidcraft#3666](https://github.com/tangency-labs/solidcraft/issues/3666) | a join extrude of a column standing on a channel's flat floor and lying along both its curved walls (column circle tangent to both walls) | analytic | **FAIL**: smlib_check SMLib check: 2 failed tests: SmFace::Test #32 Face has Coincident Vertices: Face has Coincient Verti (want ok) | not supported yet: step 10 (solid.extrude): SMLib boolean: export: SMLib export: not supported yet: a solid touching itself along an edge |
| booleans/3671-intersect-tool-in-top-face-beside-rib | [tangency-labs/solidcraft#3671](https://github.com/tangency-labs/solidcraft/issues/3671) | intersect with a tapered pocket tool whose top face lies in the block's top face, 0.5 mm short of a rib | analytic | pass | pass |
| booleans/3702-board-in-cavity-of-filleted-rim-case | [tangency-labs/solidcraft#3702](https://github.com/tangency-labs/solidcraft/issues/3702) | a 0.2 mm board lying in the open cavity of a case with a filleted circular rim: cutting it from the case must leave the case unchanged (it was taken for wholly inside) | analytic | pass | pass |
| booleans/3703-two-face-extrudes-join-keep-the-step | [tangency-labs/solidcraft#3703](https://github.com/tangency-labs/solidcraft/issues/3703) | two joined face extrudes on one box (top face, then the right side face): the stepped shape must stay | analytic | pass | pass |
| booleans/3729-extrude-to-point-on-step-edge | [tangency-labs/solidcraft#3729](https://github.com/tangency-labs/solidcraft/issues/3729) | extrude `to` a point lying exactly on the top edge of a step: must end at the plane z=20 through the point | analytic | **FAIL**: volume_mm3 5089.982614 (want 5070.6858); bbox.max [10, 10, 22.732051] (want [10, 10, 20]) | **FAIL**: volume_mm3 5089.997564 (want 5070.6858); bbox.max [10, 10, 22.732051] (want [10, 10, 20]) |
| booleans/3782-emboss-on-cylinder-pick-on-far-half | [tangency-labs/solidcraft#3782](https://github.com/tangency-labs/solidcraft/issues/3782) [tangency-labs/solidcraft#3425](https://github.com/tangency-labs/solidcraft/issues/3425) | emboss on a cylinder with the face pick on the half of the wall opposite the sketch | invariants | **FAIL**: step 5 (solid.emboss): invalid input: cylinder emboss: saved selection no longer identifies the sketch's cylindrical face | **FAIL**: step 5 (solid.emboss): invalid input: cylinder emboss: saved selection no longer identifies the sketch's cylindrical face |
| booleans/3816-circular-pattern-of-body-about-offset-axis | [tangency-labs/solidcraft#3816](https://github.com/tangency-labs/solidcraft/issues/3816) | circular pattern of a body about an axis {origin,dir} that does not pass through the world origin | analytic | pass | pass |
| booleans/3830-split-cup-by-extended-spline-surface | [tangency-labs/solidcraft#3830](https://github.com/tangency-labs/solidcraft/issues/3830) | split a thin-walled cup (shell of a d30 cylinder) with a surface body: an extruded spline surface, extended at both ends | analytic | **HANG**: no result after 180 s | **HANG**: no result after 180 s |
| booleans/3841-join-touching-along-one-circle-only | [tangency-labs/solidcraft#3841](https://github.com/tangency-labs/solidcraft/issues/3841) [tangency-labs/solidcraft#168](https://github.com/tangency-labs/solidcraft/issues/168) | Join of a ring (r10..15) onto a coin (r10) that touch only along a circle: no fusion that moves the ring | invariants | **FAIL**: smlib_check SMLib check: 3 failed tests: SmEdgeuse::Test #11 Bad UVTrimCurve: Edgeuse->UVTrimCurve has zero leng (want ok); body_count 1 (want 2) | **FAIL**: shells Coin: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); body_count 1 (want 2) |
| booleans/3850-cross-cut-touching-round-side | [tangency-labs/solidcraft#3850](https://github.com/tangency-labs/solidcraft/issues/3850) [tangency-labs/solidcraft#3741](https://github.com/tangency-labs/solidcraft/issues/3741) | a O50 x 50 cylinder with a 25 mm square through-hole, then a cross cut by a O40 circle split into two halves by a line (both halves picked, merged into one round tool whose end face x=25 touches the cylinder's side along y=0): the result must be one shell, not a good shell plus a zero-area one | analytic | **FAIL**: record_valid the operation failed: lumps: cannot mesh a complete shell boundary (want ok); smlib_check the operation failed: lumps: cannot mesh a complete shell boundary (want ok); shells 2 (want 1) | pass |
| booleans/3850-hole-through-wall-after-cross-cut | [tangency-labs/solidcraft#3850](https://github.com/tangency-labs/solidcraft/issues/3850) [tangency-labs/solidcraft#3741](https://github.com/tangency-labs/solidcraft/issues/3741) | the O10 through-all hole across the wall of the body from the cross-cut case (the report's failing step: 'lumps: cannot mesh a complete shell boundary') | analytic | **FAIL**: step 17 (solid.extrude): lumps: cannot mesh a complete shell boundary | pass |
| booleans/3887-ring-standing-on-perforated-plate | [tangency-labs/solidcraft#3887](https://github.com/tangency-labs/solidcraft/issues/3887) [tangency-labs/solidcraft#2844](https://github.com/tangency-labs/solidcraft/issues/2844) | a ring (r19.6/20.8, 20 tall) joined onto an 80x80x1.2 plate with a 9x9 grid of 6.4 mm square holes; the ring's foot crosses the holes | analytic | **FAIL**: smlib_check SMLib check: 1 failed tests: SmFace::Test #38 Intersecting Face Loops: Face Loops must be disjoint i (want ok) | pass |
| booleans/3968-hole-as-wide-as-a-cones-top | [tangency-labs/solidcraft#3968](https://github.com/tangency-labs/solidcraft/issues/3968) | a hole of diameter 10 drilled into the top of a truncated cone whose top is also diameter 10 (the hole wall meets the cone at the top rim) | analytic | **FAIL**: step 5 (solid.hole): boolean Cut: the operation failed: no result | pass |
| booleans/4008-symmetric-revolve-cut-ends-in-side-face | [tangency-labs/solidcraft#4008](https://github.com/tangency-labs/solidcraft/issues/4008) | symmetric 180 deg revolve cut about a vertical edge of a block, the tool's end faces lying in the block's side face | analytic | **FAIL**: step 8 (solid.revolve): the cut could not be computed reliably: it would change the body away from the tool, at (-1.557, 12.991, 16.000) (outside the tool's reg | pass |
| booleans/4011-mirror-of-cut-under-wall | [tangency-labs/solidcraft#4011](https://github.com/tangency-labs/solidcraft/issues/4011) | a blind hole mirrored to a spot where half its top disc lies under a wall's foot | analytic | pass | pass |
| booleans/4058-walls-joined-flush-round-a-floor | [tangency-labs/solidcraft#4058](https://github.com/tangency-labs/solidcraft/issues/4058) [tangency-labs/solidcraft#4059](https://github.com/tangency-labs/solidcraft/issues/4059) | a 10 mm ring (rounded corners) extruded 40 mm as a Join round a floor's outline: it touches the floor back to back on its flat sides and rounded corners | analytic | **FAIL**: step 14 (solid.extrude): boolean Union: the operation failed: no result | pass |
| booleans/4095-slab-cut-standing-off-a-bore-r10 | [tangency-labs/solidcraft#4095](https://github.com/tangency-labs/solidcraft/issues/4095) | a slab cut whose +x face stands 6.73e-05 mm (0.90 x the coincidence tolerance 7.48e-05) off a through-bore's wall (R=10), beside the bore | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([-10.0000673497, -8.0, 20.0]) to Some([-10.000067 (want ok); smlib_check SMLib check: 2 failed tests: SmFace::Test #32 Face has Coincident Vertices: Face has Coincient Verti (want ok) | pass |
| booleans/4095-slab-cut-standing-off-a-bore-r15 | [tangency-labs/solidcraft#4095](https://github.com/tangency-labs/solidcraft/issues/4095) | a slab cut whose +x face stands 6.60e-05 mm (0.60 x the coincidence tolerance 1.10e-04) off a through-bore's wall (R=15), beside the bore | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([-15.000066, -8.0, 20.0]) to Some([-15.000066, -8 (want ok); smlib_check SMLib check: 2 failed tests: SmFace::Test #32 Face has Coincident Vertices: Face has Coincient Verti (want ok) | pass |
| booleans/423-through-all-cut-must-not-reach-behind-sketch-plane | [tangency-labs/solidcraft#423](https://github.com/tangency-labs/solidcraft/issues/423) | a one-sided Through All cut from a sketch plane at x=98 toward -x, with its wall 0.0022 mm from a face of a notch beyond the plane: the cut must remove nothing at x > 98 | analytic | pass | pass |
| booleans/451-cut-block-crossing-hollow-sphere-tool | [tangency-labs/solidcraft#451](https://github.com/tangency-labs/solidcraft/issues/451) | a 12x8x8 block (x 8..20) crossing the inner sphere r=18.5 of a hollow spherical-shell tool: the cut keeps the part inside r=18.5 | analytic | **FAIL**: step 9 (solid.combine): boolean Cut: the operation failed: no result | **FAIL**: step 9 (solid.combine): lumps: cannot mesh a complete shell boundary |
| booleans/451-cut-block-inside-hollow-sphere-tool | [tangency-labs/solidcraft#451](https://github.com/tangency-labs/solidcraft/issues/451) | a block wholly inside the void of a hollow spherical-shell tool (r 18.5 to 40): cutting leaves it untouched, the tool never reaches it | analytic | pass | **FAIL**: step 9 (solid.combine): lumps: cannot mesh a complete shell boundary |
| booleans/500-coaxial-cylinder-cut-from-thin-disc | [tangency-labs/solidcraft#500](https://github.com/tangency-labs/solidcraft/issues/500) | a radius 20 cylinder cut out of a coaxial radius 40 disc spanning x -1..1 lost about 2.6% of the volume | analytic | pass | pass |
| booleans/559-through-hole-into-shelled-box-rim | [tangency-labs/solidcraft#559](https://github.com/tangency-labs/solidcraft/issues/559) | a 1 mm through-all hole straight down into the 2 mm rim of a shelled box: 'implausible volume' / no result | analytic | pass | pass |
| booleans/562-press-pull-floor-beside-rounds | [tangency-labs/solidcraft#562](https://github.com/tangency-labs/solidcraft/issues/562) | Press Pull of a floor whose neighbours are rounds (vertical corner fillets): 'a neighbouring edge is not straight' | analytic | pass | pass |
| booleans/831-tapered-extrude-d-shape-arc-meets-line | [tangency-labs/solidcraft#831](https://github.com/tangency-labs/solidcraft/issues/831) | tapered extrude of a D shape (an arc meeting a line at a sharp corner): refused as 'tapered profiles where an arc meets another edge at a corner' | analytic | not supported yet: step 5 (solid.extrude): not supported yet: tapered profiles where an arc meets another edge at a corner | pass |
| booleans/831-tapered-extrude-text-glyph | [tangency-labs/solidcraft#831](https://github.com/tangency-labs/solidcraft/issues/831) | tapered extrude of a text glyph (Bezier outline): refused with a misleading 'mixing lines and arcs' error | invariants | pass | pass |
| crashes/1219-bore-fillet-then-grooves-cut | [tangency-labs/solidcraft#1219](https://github.com/tangency-labs/solidcraft/issues/1219) | 24 small grooves cut into a bore whose top edge has an unrelated 1 mm fillet: 73 s and 24 boolean retries instead of 0.2 s | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 1 (Some([-68.19934052346665, 0.29992031010887626, 19.0003 (want ok); smlib_check SMLib check: 1 failed tests: SmBrep::Test #61 Valid: Bad Edge fails pE->ValidateGeometry(FALSE) chec (want ok) | pass |
| crashes/140-join-pad-hanging-past-the-edge | [tangency-labs/solidcraft#140](https://github.com/tangency-labs/solidcraft/issues/140) | a join whose tool face lies flat on the target but only half backed by it (the pad hangs 10 mm past the edge) must not add material | analytic | pass | pass |
| crashes/1985-step-export-enclosure-screw-hole | [tangency-labs/solidcraft#1985](https://github.com/tangency-labs/solidcraft/issues/1985) [tangency-labs/solidcraft#2243](https://github.com/tangency-labs/solidcraft/issues/2243) | a small enclosure (rounded box, inner cut, corner gusset with a screw hole, two standoffs, USB cut-out) whose STEP export never finished (the export meshes its own file back) | invariants | pass | pass |
| crashes/2243-step-export-flanged-enclosure | [tangency-labs/solidcraft#2243](https://github.com/tangency-labs/solidcraft/issues/2243) [tangency-labs/solidcraft#1985](https://github.com/tangency-labs/solidcraft/issues/1985) | a flanged enclosure with two standoffs and no screw hole whose STEP export also never finished | invariants | pass | pass |
| crashes/2357-join-ring-of-90-cylinder-segments | [tangency-labs/solidcraft#2357](https://github.com/tangency-labs/solidcraft/issues/2357) | one join of a ring of 90 straight cylinder segments, each overlapping its neighbour at a 4 degree joint: a caught truck panic, then a refusal after 21 minutes | invariants | **HANG**: no result after 180 s | **HANG**: no result after 180 s |
| crashes/2992-join-disk-and-36-twisted-loft-blades | [tangency-labs/solidcraft#2992](https://github.com/tangency-labs/solidcraft/issues/2992) | join of a disk and a circular pattern of 36 twisted lofted blades (embedded 2.54 mm in the disk): blocks for minutes | invariants | **HANG**: no result after 180 s | **HANG**: no result after 180 s |
| crashes/3540-cut-with-coincident-cylinder-face | [tangency-labs/solidcraft#3540](https://github.com/tangency-labs/solidcraft/issues/3540) | a groove cut whose r33 arcs lie exactly on the r33 cylinder of an earlier slot cut and overlap it in Z: minutes of CPU | analytic | pass | pass |
| crashes/3685-delete-fillet-face-beside-seam | [tangency-labs/solidcraft#1559](https://github.com/tangency-labs/solidcraft/issues/1559) [tangency-labs/solidcraft#3685](https://github.com/tangency-labs/solidcraft/issues/3685) | Delete Face on a fillet face next to a face whose edge a boolean/fillet rebuilt as an intersection curve: must never panic (truck: not implemented: intersection curve cannot connect by homotopy) | analytic | pass | pass |
| crashes/4092-loft-ribs-rounded-pad-union-panics | [tangency-labs/solidcraft#4092](https://github.com/tangency-labs/solidcraft/issues/4092) | join extrude of a rounded pad over a lofted body with ring and ribs: repeated truck intersection_curve panics, then 'boolean Union: no result' | invariants | **FAIL**: step 50 (solid.extrude): boolean Union: the operation failed: no result | **FAIL**: step 50 (solid.extrude): SMLib boolean: operation: SMLib failed (status 1001) |
| crashes/4092-loft-ribs-rounded-pad-union-reduced | [tangency-labs/solidcraft#4092](https://github.com/tangency-labs/solidcraft/issues/4092) | the same without the top flange: the join fails with 'boolean Union: no result' | invariants | **FAIL**: step 40 (solid.extrude): boolean Union: the operation failed: no result | **FAIL**: step 40 (solid.extrude): SMLib boolean: operation: SMLib failed (status 1001) |
| fillets/1008-fillet-tray-floor-and-three-of-four-corners | [tangency-labs/solidcraft#1008](https://github.com/tangency-labs/solidcraft/issues/1008) | an R10 round on the four inside floor edges and three of the four inside vertical corners of an open tray, so one corner keeps a sharp vertical edge where two floor rounds meet (rebuilt from the report's edge picks: the original design is not in the report) | analytic | pass | pass |
| fillets/1080-chamfer-beside-openings-fits | [tangency-labs/solidcraft#1080](https://github.com/tangency-labs/solidcraft/issues/1080) [tangency-labs/solidcraft#1124](https://github.com/tangency-labs/solidcraft/issues/1124) | a 4 mm chamfer on the top front edge of a cube with three square openings stays clear of the openings (they start 5 mm in) | analytic | pass | pass |
| fillets/1080-chamfer-runs-into-openings-refused | [tangency-labs/solidcraft#1080](https://github.com/tangency-labs/solidcraft/issues/1080) [tangency-labs/solidcraft#1124](https://github.com/tangency-labs/solidcraft/issues/1124) | a 9 mm chamfer on the top front edge of a cube with square openings 5 mm in must be refused: it would cut through the rims of the openings | invariants | pass | pass |
| fillets/1191-fillet-both-rims-of-a-tube-top | [tangency-labs/solidcraft#1191](https://github.com/tangency-labs/solidcraft/issues/1191) | an R2 round on the outer and inner rim circles of a tube's top face (the report's ten picks on a ring-shaped top: the round failed after 0.10.1; rebuilt as a plain tube since the design is not in the report) | analytic | pass | pass |
| fillets/1207-fillet-concave-arc-at-boss | [tangency-labs/solidcraft#1207](https://github.com/tangency-labs/solidcraft/issues/1207) | an R2 round on the concave arc where a bar top meets a boss that only partly sits on it | analytic | not supported yet: step 3 (solid.fillet): not supported yet: a vertex of the edge chain where other faces meet (the operation failed: not supported yet: only straight edges can be | pass |
| fillets/1207-fillet-straight-edge-ending-on-boss | [tangency-labs/solidcraft#1207](https://github.com/tangency-labs/solidcraft/issues/1207) | an R2 round along the straight top edge of a bar that runs out against a cylindrical boss | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 3 (Some([15.19868415359896, 12.999999999966905, 10.0]) to (want ok); smlib_check the operation failed: pcurve of loop 0 use 3 (Some([15.19868415359896, 12.999999999966905, 10.0]) to (want ok) | pass |
| fillets/1213-round-end-circle-of-bent-tube | [tangency-labs/solidcraft#1213](https://github.com/tangency-labs/solidcraft/issues/1213) [tangency-labs/solidcraft#1291](https://github.com/tangency-labs/solidcraft/issues/1291) | an R3 round on the end circle of a lofted tube whose axis bends (a 60 degree torus section) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([2.999961609466277, 0.03799226106586362, 20.00000 (want ok) | pass |
| fillets/1262-fillet-boss-bottom-arc | [tangency-labs/solidcraft#1262](https://github.com/tangency-labs/solidcraft/issues/1262) | a 0.8 mm round on the exposed half circle at the bottom of a cylindrical boss joined to a box side | analytic | pass | pass |
| fillets/1390-chamfer-hole-rim-touching-bottom | [tangency-labs/solidcraft#1390](https://github.com/tangency-labs/solidcraft/issues/1390) [tangency-labs/solidcraft#1574](https://github.com/tangency-labs/solidcraft/issues/1574) [tangency-labs/solidcraft#1428](https://github.com/tangency-labs/solidcraft/issues/1428) | a 3 mm chamfer on the rim of a hole that is tangent to the bottom face runs off that face and must not add material below the part | invariants | pass | pass |
| fillets/1488-fillet-slab-end-after-nudged-loft-join | [tangency-labs/solidcraft#1488](https://github.com/tangency-labs/solidcraft/issues/1488) [tangency-labs/solidcraft#1517](https://github.com/tangency-labs/solidcraft/issues/1517) | an R1 fillet on the end edge of a 3.5 mm slab after a pleated loft was joined flush with its inner face (the join needs a tool retry; later fillets must still work) | invariants | pass | pass |
| fillets/1557-fillet-vertical-corners-after-bottom-rounds | [tangency-labs/solidcraft#1557](https://github.com/tangency-labs/solidcraft/issues/1557) [tangency-labs/solidcraft#1581](https://github.com/tangency-labs/solidcraft/issues/1581) | vertical corner fillets R2 on a 25x25x10 box whose four bottom edges are already rounded R2 (the round meets the earlier mitre) | analytic | pass | **FAIL**: step 6 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/1667-fillet-rim-line-beside-quarter-turns | [tangency-labs/solidcraft#1667](https://github.com/tangency-labs/solidcraft/issues/1667) [tangency-labs/solidcraft#1702](https://github.com/tangency-labs/solidcraft/issues/1702) | an R5 round of the top rim of a 297 mm long box whose corners are R5 (a 287 mm line beside 7.85 mm quarter turns) | analytic | pass | **FAIL**: step 3 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/1668-fillet-both-sides-of-thin-wall | [tangency-labs/solidcraft#1668](https://github.com/tangency-labs/solidcraft/issues/1668) [tangency-labs/solidcraft#1720](https://github.com/tangency-labs/solidcraft/issues/1720) | an R5 round on an outer top edge and the matching inner (concave) edge of a 2 mm wall in one feature fits, as it does one after the other | analytic | pass | pass |
| fillets/190-fillet-rim-as-tall-as-wall | [tangency-labs/solidcraft#190](https://github.com/tangency-labs/solidcraft/issues/190) [tangency-labs/solidcraft#318](https://github.com/tangency-labs/solidcraft/issues/318) | an R2 round of the top edge of a disc 2 mm high (the round is as tall as the wall, so it meets the bottom face) | analytic | pass | pass |
| fillets/193-paste-copies-the-fillets | [tangency-labs/solidcraft#193](https://github.com/tangency-labs/solidcraft/issues/193) [tangency-labs/solidcraft#214](https://github.com/tangency-labs/solidcraft/issues/214) [tangency-labs/solidcraft#363](https://github.com/tangency-labs/solidcraft/issues/363) [tangency-labs/solidcraft#613](https://github.com/tangency-labs/solidcraft/issues/613) | a block with two R2 top edges rounded, copied and pasted 40 mm over: the copy must carry its own fillets | analytic | pass | pass |
| fillets/1986-chamfer-arc-edge-of-joined-sectors | [tangency-labs/solidcraft#1986](https://github.com/tangency-labs/solidcraft/issues/1986) | a 3 mm chamfer on the outer top arc of a 120 degree annular sector joined to a lower inner sector (the joined outer wall must not limit the chamfer) | analytic | not supported yet: step 15 (solid.chamfer): not supported yet: the blend is larger than the neighbouring faces (site 1853) (the operation failed: not supported yet: only straight | pass |
| fillets/199-fillet-uses-up-end-face | [tangency-labs/solidcraft#199](https://github.com/tangency-labs/solidcraft/issues/199) [tangency-labs/solidcraft#317](https://github.com/tangency-labs/solidcraft/issues/317) | an R3 round on the four vertical edges of a 14x6x10 box: the two rounds on each 6 mm end face meet exactly (the face is used up) | analytic | pass | pass |
| fillets/219-pattern-of-filleted-pockets | [tangency-labs/solidcraft#219](https://github.com/tangency-labs/solidcraft/issues/219) | a plate with 6 pockets made by patterning one pocket and the R3.2 round of its four corner edges, the pocket height set by a parameter | analytic | pass | pass |
| fillets/2341-pattern-of-chamfered-bosses | [tangency-labs/solidcraft#2341](https://github.com/tangency-labs/solidcraft/issues/2341) [tangency-labs/solidcraft#2774](https://github.com/tangency-labs/solidcraft/issues/2774) [tangency-labs/solidcraft#2775](https://github.com/tangency-labs/solidcraft/issues/2775) [tangency-labs/solidcraft#2342](https://github.com/tangency-labs/solidcraft/issues/2342) | a 2 x 2 grid made by a feature pattern of a boss and its two chamfers (a concave root chamfer and a convex tip chamfer) | analytic | pass | pass |
| fillets/237-fillet-concave-edge-between-two-cylinders | [tangency-labs/solidcraft#237](https://github.com/tangency-labs/solidcraft/issues/237) [tangency-labs/solidcraft#238](https://github.com/tangency-labs/solidcraft/issues/238) | an R6 round on the vertical edge where two cylinder walls meet (the concave corner of two merged discs), the two walls meeting at an angle | analytic | pass | pass |
| fillets/2498-fillet-tiny-end-edges-rounded-rectangle | [tangency-labs/solidcraft#2498](https://github.com/tangency-labs/solidcraft/issues/2498) [tangency-labs/solidcraft#2506](https://github.com/tangency-labs/solidcraft/issues/2506) | an R2 round of the top loop of a 26.4x8.6x8.4 rounded rectangle whose end edges are only 0.02 mm long (corner radius 4.29) | analytic | pass | pass |
| fillets/2672-chamfer-one-pick-large-plate | [tangency-labs/solidcraft#2672](https://github.com/tangency-labs/solidcraft/issues/2672) [tangency-labs/solidcraft#3295](https://github.com/tangency-labs/solidcraft/issues/3295) | one pick on a stadium boss top rim chamfers the whole tangent loop, also when the part is more than 200 mm across | analytic | pass | pass |
| fillets/2708-fillet-curvature-continuous-angled-ends | [tangency-labs/solidcraft#2708](https://github.com/tangency-labs/solidcraft/issues/2708) [tangency-labs/solidcraft#2739](https://github.com/tangency-labs/solidcraft/issues/2739) | a curvature-continuous (G2) fillet of size 5 on a straight edge that ends on two slanted planar faces | analytic | pass | **FAIL**: volume_mm3 11867.72421 (want 11854.052069) |
| fillets/2719-chamfer-as-wide-as-corner-round | [tangency-labs/solidcraft#2719](https://github.com/tangency-labs/solidcraft/issues/2719) | a 1 mm chamfer round a bottom loop whose corners are R1 rounds: each corner cone closes to a point on the bottom face | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([-18.99999999999999, -19.0, 0.0]) to Some([-19.0, (want ok); smlib_check the operation failed: pcurve of loop 0 use 0 (Some([-18.99999999999999, -19.0, 0.0]) to Some([-19.0, (want ok) | **FAIL**: step 3 (solid.chamfer): SMLib chamfer: operation: SMLib failed (status 1001) |
| fillets/2752-fillet-rim-of-flat-cut-on-sphere | [tangency-labs/solidcraft#2752](https://github.com/tangency-labs/solidcraft/issues/2752) [tangency-labs/solidcraft#2787](https://github.com/tangency-labs/solidcraft/issues/2787) | an R1 round round the rim of a radius-2 sphere cut flat at z=1 | analytic | not supported yet: step 3 (solid.fillet): not supported yet: the ball doesn't fit along the resampled spine (the operation failed: not supported yet: only straight edges can be bl | pass |
| fillets/2797-chamfer-two-distances-circular-rim | [tangency-labs/solidcraft#2797](https://github.com/tangency-labs/solidcraft/issues/2797) [tangency-labs/solidcraft#3300](https://github.com/tangency-labs/solidcraft/issues/3300) [tangency-labs/solidcraft#2893](https://github.com/tangency-labs/solidcraft/issues/2893) | a Two Distances chamfer (1 mm on the top face, 0.5 mm down the wall) on the circular rim between a plane and a cylinder | analytic | pass | not supported yet: step 2 (solid.chamfer): invalid input: not supported yet: a chamfer with two different setbacks (two distances, or a distance and an angle) with the SMLib kerne |
| fillets/2811-fillet-rib-roots | [tangency-labs/solidcraft#2811](https://github.com/tangency-labs/solidcraft/issues/2811) | an R1.5 fillet of the 32 vertical root edges of 8 ribs between two walls of a grille tray (a performance case: the time must not blow up) | analytic | pass | pass |
| fillets/2852-fillet-outer-round-concentric-with-inner | [tangency-labs/solidcraft#2852](https://github.com/tangency-labs/solidcraft/issues/2852) | an R18 round on the outside top edges of a 3 mm thick upside-down U, concentric with the R15 round of its inside edges | analytic | pass | pass |
| fillets/2907-chamfer-two-end-outlines-rounded-top | [tangency-labs/solidcraft#2907](https://github.com/tangency-labs/solidcraft/issues/2907) [tangency-labs/solidcraft#3861](https://github.com/tangency-labs/solidcraft/issues/3861) | a 1.5 mm chamfer of both end outlines (sides, top and the two top arcs) of a prism with rounded top corners, bottom edges left alone | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 1 (Some([0.0, 26.0, 18.5]) to Some([0.6931089443069371, 2 (want ok) | pass |
| fillets/324-fillet-over-hole-overlap | [tangency-labs/solidcraft#324](https://github.com/tangency-labs/solidcraft/issues/324) [tangency-labs/solidcraft#1885](https://github.com/tangency-labs/solidcraft/issues/1885) | a 4 mm fillet on a top edge whose round overlaps the rim of a through hole (the hole breaks into the round) | analytic | **FAIL**: step 6 (solid.fillet): fillet: the rounds would leave openings in the surface (they overlap where a wall or a face is narrower than both); the largest radius th | **FAIL**: step 6 (solid.fillet): SMLib fillet: operation: SMLib's result is not a closed solid |
| fillets/3276-chamfer-edge-of-1mm-protrusion-on-joined-l | [tangency-labs/solidcraft#3276](https://github.com/tangency-labs/solidcraft/issues/3276) | three extrudes joined into an L-shaped body with a 1 mm protrusion, then a chamfer on the protrusion's outer edge (the report: the corners are no longer 90 degrees and the chamfer fails) | analytic | pass | pass |
| fillets/334-fillet-top-outline-after-concave-rounds | [tangency-labs/solidcraft#334](https://github.com/tangency-labs/solidcraft/issues/334) [tangency-labs/solidcraft#335](https://github.com/tangency-labs/solidcraft/issues/335) | an R2 round on the whole top outline of two merged cylinders after their two concave vertical edges were rounded R5 | analytic | pass | pass |
| fillets/3369-fillet-edge-ends-on-tangent-seam | [tangency-labs/solidcraft#3369](https://github.com/tangency-labs/solidcraft/issues/3369) [tangency-labs/solidcraft#3922](https://github.com/tangency-labs/solidcraft/issues/3922) | an R2 round on a straight edge whose ends sit on the tangent seam between a flat top and a rounded end | analytic | not supported yet: step 9 (solid.fillet): not supported yet: the faces at the edge ends must be planar | **FAIL**: step 9 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/3435-fillet-larger-than-top-ring | [tangency-labs/solidcraft#3435](https://github.com/tangency-labs/solidcraft/issues/3435) [tangency-labs/solidcraft#3441](https://github.com/tangency-labs/solidcraft/issues/3441) | a fillet of radius 6.9 on a cylinder rim whose flat top ring (round the joined boss) is only 4.3 mm wide must be refused, not grow the part | invariants | **FAIL**: succeeded where the case expects a refusal | pass |
| fillets/3655-chamfer-edge-order-box | [tangency-labs/solidcraft#3655](https://github.com/tangency-labs/solidcraft/issues/3655) [tangency-labs/solidcraft#3660](https://github.com/tangency-labs/solidcraft/issues/3660) | a plain box with all 12 edges chamfered, the edges listed in an order that was refused | analytic | not supported yet: step 5 (solid.chamfer): not supported yet: the blend is larger than the neighbouring faces | pass |
| fillets/3753-circular-pattern-of-hole-and-its-rim-chamfer | [tangency-labs/solidcraft#3753](https://github.com/tangency-labs/solidcraft/issues/3753) | a circular pattern (6 copies about Y) of a through hole and the 1 mm chamfer on its rim (the report: the pattern is refused because the copied chamfer 'would grow the part'); rebuilt as a hole in a disc, the original design is not in the report | analytic | pass | pass |
| fillets/3779-chamfer-all-spline-spans | [tangency-labs/solidcraft#3779](https://github.com/tangency-labs/solidcraft/issues/3779) [tangency-labs/solidcraft#3804](https://github.com/tangency-labs/solidcraft/issues/3804) | a 0.1 mm chamfer on all eight top-rim spans of a 20 x 20 pillow whose four sides are fit splines (two cubic spans each) | invariants | not supported yet: step 8 (solid.chamfer): not supported yet: the blend is larger than the neighbouring faces (site 1853) (the operation failed: not supported yet: only straight e | pass |
| fillets/3779-fillet-all-spline-spans | [tangency-labs/solidcraft#3779](https://github.com/tangency-labs/solidcraft/issues/3779) [tangency-labs/solidcraft#3804](https://github.com/tangency-labs/solidcraft/issues/3804) | a 0.1 mm fillet on all eight top-rim spans of a 20 x 20 pillow whose four sides are fit splines (two cubic spans each) | invariants | not supported yet: step 8 (solid.fillet): not supported yet: the blend is larger than the neighbouring faces | pass |
| fillets/3868-chamfer-concave-edge-adds-material | [tangency-labs/solidcraft#3868](https://github.com/tangency-labs/solidcraft/issues/3868) | a chamfer of an inside (concave) edge fills the corner and adds material, one on the outside edge removes it | analytic | pass | pass |
| fillets/4055-chamfer-bar-edge-over-joined-pin | [tangency-labs/solidcraft#4055](https://github.com/tangency-labs/solidcraft/issues/4055) | a 3 mm chamfer on the bottom long edge of a bar joined on top of a pin, where the chamfer is wider than the 2 mm gap between that edge and the pin | analytic | **FAIL**: smlib_check SMLib check: 1 failed tests: SmFace::Test #38 Intersecting Face Loops: Face Loops must be disjoint i (want ok); volume_mm3 35528.57632 (want 35581.857895) | pass |
| fillets/4101-chamfer-tapered-plug-corners | [tangency-labs/solidcraft#4101](https://github.com/tangency-labs/solidcraft/issues/4101) | the four edges of a block end face chamfered where the block sides are 1 degree off square: exact volume of the plane-clipped prism (the corner edges of about 0.0001 mm are real geometry) | analytic | pass | pass |
| fillets/4141-fillet-corner-after-wedge-cut-beside-bspline | [tangency-labs/solidcraft#4141](https://github.com/tangency-labs/solidcraft/issues/4141) | an R5 round on the corner edge left by a wedge cut through a body vertex next to a B-spline face | invariants | not supported yet: step 11 (solid.fillet): not supported yet: the blend is larger than the neighbouring faces | pass |
| fillets/4143-fillet-notch-rim-on-bspline-ramp | [tangency-labs/solidcraft#4143](https://github.com/tangency-labs/solidcraft/issues/4143) | an R4 round on the rim of an R5 notch where its cylinder meets an extruded B-spline ramp, both ends running into a square wall | invariants | not supported yet: step 13 (solid.fillet): not supported yet: the blend is larger than the neighbouring faces | **FAIL**: step 13 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/485-fillet-d-prism-top-outline-arc-and-flat | [tangency-labs/solidcraft#485](https://github.com/tangency-labs/solidcraft/issues/485) [tangency-labs/solidcraft#604](https://github.com/tangency-labs/solidcraft/issues/604) | an R0.5 round on both top perimeter edges (the arc and the flat) of a D-shaped prism, the two edges meeting at sharp 90 degree corners | analytic | pass | pass |
| fillets/556-fillet-edge-ending-on-curved-boss | [tangency-labs/solidcraft#556](https://github.com/tangency-labs/solidcraft/issues/556) [tangency-labs/solidcraft#646](https://github.com/tangency-labs/solidcraft/issues/646) | an R0.5 round on a single straight bottom edge of a box whose end runs out against a cylindrical boss wall | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([39.5, 8.010421183869017, 0.0]) to Some([49.81441 (want ok); smlib_check the operation failed: pcurve of loop 0 use 0 (Some([39.5, 8.010421183869017, 0.0]) to Some([49.81441 (want ok) | pass |
| fillets/783-fillet-pick-far-from-any-edge-refused | [tangency-labs/solidcraft#783](https://github.com/tangency-labs/solidcraft/issues/783) [tangency-labs/solidcraft#820](https://github.com/tangency-labs/solidcraft/issues/820) | a fillet whose edge pick is 15 mm from the nearest edge must be refused, not applied to some other edge | invariants | pass | pass |
| fillets/814-chamfer-hex-hole-corners | [tangency-labs/solidcraft#814](https://github.com/tangency-labs/solidcraft/issues/814) [tangency-labs/solidcraft#1067](https://github.com/tangency-labs/solidcraft/issues/1067) | a 2 mm chamfer on the six vertical corners of a hexagonal hole: one bevel each, not a notch | analytic | pass | pass |
| fillets/851-fillet-three-edges-at-knife-edge-arc-corner | [tangency-labs/solidcraft#851](https://github.com/tangency-labs/solidcraft/issues/851) [tangency-labs/solidcraft#854](https://github.com/tangency-labs/solidcraft/issues/854) [tangency-labs/solidcraft#926](https://github.com/tangency-labs/solidcraft/issues/926) [tangency-labs/solidcraft#935](https://github.com/tangency-labs/solidcraft/issues/935) [tangency-labs/solidcraft#1294](https://github.com/tangency-labs/solidcraft/issues/1294) | three edges meeting at the front corner of a plate with a concave arc wall that runs out in a knife-edge tip: top front edge, arc top edge and front upright, R2 together | invariants | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 1 (Some([62.16666666666963, -5.480541191988027e-7, 7.9999 (want ok) | pass |
| fillets/862-fillet-curvature-continuous-box-edge | [tangency-labs/solidcraft#862](https://github.com/tangency-labs/solidcraft/issues/862) | a curvature-continuous (G2) fillet of size 6 on one edge of a 20 mm cube | analytic | pass | **FAIL**: volume_mm3 7902.559861 (want 7892.380952) |
| fillets/896-fillet-smooth-seam-refused | [tangency-labs/solidcraft#896](https://github.com/tangency-labs/solidcraft/issues/896) [tangency-labs/solidcraft#936](https://github.com/tangency-labs/solidcraft/issues/936) | a fillet picked on the seam where a rounded edge runs tangent into the flat top has no corner to round and is refused as an invalid pick | invariants | pass | pass |
| import/1721-closed-bspline-tube-face | [tangency-labs/solidcraft#1721](https://github.com/tangency-labs/solidcraft/issues/1721) [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a cylinder r=10 h=30 whose side is a closed (rational B-spline) tube face wrapping all the way round a closed non-periodic surface: it must mesh and measure as the full tube | analytic | **FAIL**: record_valid geometry: portable B-rep: face 1 loop 0 use 0: pcurve starts 1 from the end of the use before it, on (want ok); smlib_check SMLib check: 8 failed tests: SmFace::Test #37 Bad Loop Nesting: Face InnerLoop must lie inside the F (want ok) | not supported yet: step 1 (file.insert_step): tests/kernel-cases/import/1721-closed-bspline-tube-face/input.step: the operation failed: STEP import: no bodies (solid #89: not impo |
| import/2043-outer-bound-opposing-surface-sense | [tangency-labs/solidcraft#1974](https://github.com/tangency-labs/solidcraft/issues/1974) [tangency-labs/solidcraft#2043](https://github.com/tangency-labs/solidcraft/issues/2043) | a block whose every plane's axis points into the part and whose faces say same_sense .F. while their FACE_OUTER_BOUND loops run counter-clockwise about the outward normal: the loops are outer bounds, not holes | analytic | pass | pass |
| import/258-cone-point-vertex | [tangency-labs/solidcraft#258](https://github.com/tangency-labs/solidcraft/issues/258) | the same STEP cone with a VERTEX_LOOP at the apex: the mesh stopped 30 mm short of the apex | analytic | pass | pass |
| import/258-cone-to-point | [tangency-labs/solidcraft#258](https://github.com/tangency-labs/solidcraft/issues/258) | a STEP cone 20 mm across coming to a point 30 mm up (no vertex at the apex): the cone face was meshed flat at its base, so the measured shape was far off | analytic | pass | pass |
| import/258-tiny-pin | [tangency-labs/solidcraft#258](https://github.com/tangency-labs/solidcraft/issues/258) | a STEP pin 0.5 mm across, 2 mm long: meshed 1.16 mm off at a 0.5 mm tolerance | analytic | **FAIL**: record_valid geometry: portable B-rep: face 1 loop 0 use 0: pcurve starts 6.283185307179586 from the end of the u (want ok); smlib_check SMLib check: 8 failed tests: SmFace::Test #37 Bad Loop Nesting: Face InnerLoop must lie inside the F (want ok) | pass |
| import/3098-bspline-edges-over-tiny-knot-span | [tangency-labs/solidcraft#3098](https://github.com/tangency-labs/solidcraft/issues/3098) | a block whose 12 straight edges are degree-1 B-spline curves over a knot span of 1e-7 (as NX writes short edges); the faces must be kept | analytic | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/3098-bspline-edges-over-tiny-knot-span/input.step: the operation failed: STEP import: no bodies (solid 'blo | pass |
| import/3208-extruded-ellipse-face-over-parameter-seam | [tangency-labs/solidcraft#3120](https://github.com/tangency-labs/solidcraft/issues/3120) [tangency-labs/solidcraft#3208](https://github.com/tangency-labs/solidcraft/issues/3208) | a prism over a circular segment whose curved side lies on a SURFACE_OF_LINEAR_EXTRUSION of an ELLIPSE (a = b = 10) and spans the ellipse's parameter origin (-60 to +60 degrees): the face must cover only the narrow segment side, not wrap the ellipse | analytic | pass | pass |
| import/3352-vertex-off-its-edge-curve | [tangency-labs/solidcraft#3351](https://github.com/tangency-labs/solidcraft/issues/3351) [tangency-labs/solidcraft#3352](https://github.com/tangency-labs/solidcraft/issues/3352) | a 300 mm square surface whose corner vertex sits 0.19 mm off the end of its edge's curve (the file declares 0.01 mm accuracy): the face must be kept, the vertex snapped onto the curve | analytic | pass | pass |
| import/3359-iges-trim-pieces-written-end-to-start | [tangency-labs/solidcraft#3358](https://github.com/tangency-labs/solidcraft/issues/3358) [tangency-labs/solidcraft#3359](https://github.com/tangency-labs/solidcraft/issues/3359) | a box of six trimmed planes whose composite trim curves have their 2nd and 4th pieces written end to start: every loop must still close | analytic | pass | pass |
| import/3730-void-oriented-shell-false | [tangency-labs/solidcraft#3730](https://github.com/tangency-labs/solidcraft/issues/3730) [tangency-labs/solidcraft#3872](https://github.com/tangency-labs/solidcraft/issues/3872) | a block with a closed cavity written as BREP_WITH_VOIDS whose void shell (outward-facing faces) is turned by ORIENTED_CLOSED_SHELL .F.; the cavity must be taken out, not added | analytic | pass | pass |
| import/3806-iges-revolved-arc-spherical-cap-dome | [tangency-labs/solidcraft#3806](https://github.com/tangency-labs/solidcraft/issues/3806) [tangency-labs/solidcraft#3813](https://github.com/tangency-labs/solidcraft/issues/3813) | a dome: an IGES surface of revolution (120) of a 60-to-90 degree circular arc (100) of radius 50 centred on the axis, trimmed by a circle at the rim, over a flat base disc; the cap must be 50 mm across and 6.7 mm tall, not a whole sphere | analytic | pass | pass |
| import/3845-iges-trim-pieces-miss-by-a-gap | [tangency-labs/solidcraft#3845](https://github.com/tangency-labs/solidcraft/issues/3845) [tangency-labs/solidcraft#3846](https://github.com/tangency-labs/solidcraft/issues/3846) | a box of six trimmed planes where the edge (0,0,0)-(0,20,0) stops 0.01 mm short of its end corner in both faces that use it: the small gap must be closed, giving a closed box instead of two dropped faces | analytic | **FAIL**: faces 4 (want 6); area_mm2 1400 (want 2200) | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/3845-iges-trim-pieces-miss-by-a-gap/input.igs: the operation failed: STEP import: no bodies (solid 'Body1': |
| import/3871-cone-base-circle-with-vertex-loop | [tangency-labs/solidcraft#3871](https://github.com/tangency-labs/solidcraft/issues/3871) [tangency-labs/solidcraft#3901](https://github.com/tangency-labs/solidcraft/issues/3901) | the same cone with a VERTEX_LOOP at its point on the cone face: the point must still be reached, not read as a flat disc | analytic | pass | pass |
| import/3871-cone-bounded-only-by-its-base-circle | [tangency-labs/solidcraft#3871](https://github.com/tangency-labs/solidcraft/issues/3871) [tangency-labs/solidcraft#3901](https://github.com/tangency-labs/solidcraft/issues/3901) [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a cone whose face is bounded only by its base circle (no vertex at the point) must reach its point, not come in as a flat disc | analytic | pass | pass |
| import/3880-cylinder-seam-edge | [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a cylinder r=10 h=30 whose side face is written with a seam edge: one closed solid with 3 faces | analytic | pass | pass |
| import/3880-nurbs-hemisphere-dome | [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a hemisphere r=20 whose curved face is a rational B-spline surface, flat disc below | analytic | **FAIL**: record_valid geometry: portable B-rep: face 1 loop 0 use 0: pcurve starts 1 from the end of the use before it, on (want ok); smlib_check SMLib check: 1 failed tests: SmTrimmingTools::Test #1 UVEdge/UVEdge Gap: too large U Dir gap between (want ok) | not supported yet: step 1 (file.insert_step): tests/kernel-cases/import/3880-nurbs-hemisphere-dome/input.step: the operation failed: STEP import: no bodies (solid #73: not importe |
| import/3886-iges-bspline-curve-over-tiny-knot-span | [tangency-labs/solidcraft#3885](https://github.com/tangency-labs/solidcraft/issues/3885) [tangency-labs/solidcraft#3886](https://github.com/tangency-labs/solidcraft/issues/3886) | a box of six trimmed planes with one edge written as a B-spline curve (126) over a knot span of 1e-7: both faces it bounds must be kept | analytic | pass | pass |
| import/3912-iges-hole-trim-first-piece-reversed | [tangency-labs/solidcraft#3912](https://github.com/tangency-labs/solidcraft/issues/3912) | a 10 x 10 trimmed patch with a 4 x 4 square hole whose composite trim curve starts with a reversed piece: the hole stays a hole | analytic | pass | pass |
| import/3913-iges-trim-curve-first-piece-reversed | [tangency-labs/solidcraft#3912](https://github.com/tangency-labs/solidcraft/issues/3912) [tangency-labs/solidcraft#3913](https://github.com/tangency-labs/solidcraft/issues/3913) | a box of six trimmed planes whose composite trim curves start with a piece written end to start (1st and 3rd pieces reversed): every loop must still close | analytic | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/3913-iges-trim-curve-first-piece-reversed/input.igs: the operation failed: STEP import: no bodies (solid 'B | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/3913-iges-trim-curve-first-piece-reversed/input.igs: the operation failed: STEP import: no bodies (solid 'B |
| import/3963-closed-spline-edge-vertex-past-start | [tangency-labs/solidcraft#3963](https://github.com/tangency-labs/solidcraft/issues/3963) | a 20 mm square face bounded by one closed degree-1 B-spline edge whose only vertex sits at parameter 2e-7, just past the curve's start: the face must be kept, not dropped or crashed on | analytic | **CRASH**: step 1 (file.insert_step): tests/kernel-cases/import/3963-closed-spline-edge-vertex-past-start/input.step: the operation failed: STEP import: no bodies (solid ' | pass |
| import/3972-iges-two-separate-closed-boxes | [tangency-labs/solidcraft#3928](https://github.com/tangency-labs/solidcraft/issues/3928) [tangency-labs/solidcraft#3972](https://github.com/tangency-labs/solidcraft/issues/3972) | an IGES file of twelve trimmed planes forming two separate closed boxes (10x20x30, one 100 mm along x): they must come in as two solids, not one open body | analytic | **FAIL**: smlib_check SMLib check: 4 failed tests: SmShell::Test #22 SmFaceuse_TYPE: sShellFaceuses and sFaceuses2 are equ (want ok); body_count 1 (want 2) | **FAIL**: smlib_check SMLib check: 4 failed tests: SmShell::Test #22 SmFaceuse_TYPE: sShellFaceuses and sFaceuses2 are equ (want ok); body_count 1 (want 2) |
| import/4005-cylinder-written-as-near-zero-cone | [tangency-labs/solidcraft#4005](https://github.com/tangency-labs/solidcraft/issues/4005) | a cylinder r=5 h=10 whose side is a CONICAL_SURFACE with a semi-angle of 8e-12 rad (a cylinder to within rounding, as the exporter wrote it): the face must be read, not refused as a 'bad cone' | analytic | **FAIL**: smlib_check SMLib check: 2 failed tests: SmShell::Test #22 SmFaceuse_TYPE: sShellFaceuses and sFaceuses2 are equ (want ok); faces 2 (want 3); edges 2 (want 3); volume_mm3 261.772931 (want 785.3982); area_mm2 157.063759 (want 471.2389) | pass |
| import/4006-plane-written-as-cone-of-nearly-right-angle | [tangency-labs/solidcraft#4006](https://github.com/tangency-labs/solidcraft/issues/4006) | an annular plate r 4..10, 3 thick, whose top face is a CONICAL_SURFACE of semi-angle pi/2 - 7e-12 (a plane to within rounding, as the exporter wrote it): the face must be read, not refused as a 'bad cone', and the body stays closed | analytic | **FAIL**: faces 3 (want 4); volume_mm3 527.743525 (want 791.6813); area_mm2 527.754304 (want 791.6813) | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/4006-plane-written-as-cone-of-nearly-right-angle/input.step: the operation failed: STEP import: no bodies ( |
| sheet-metal/1040-convert-a-1200-mm-strip-1-mm-thick | [tangency-labs/solidcraft#1040](https://github.com/tangency-labs/solidcraft/issues/1040) | a 1200 x 100 x 1 strip (diagonal over 1000 times its thickness) converted to sheet metal: refused with no outline on that face | analytic | pass | pass |
| sheet-metal/1040-convert-a-990-mm-strip-keeps-its-1-mm-hole | [tangency-labs/solidcraft#1040](https://github.com/tangency-labs/solidcraft/issues/1040) | a 990 x 100 x 1 strip with holes of 10, 4, 2 and 1 mm: the 1 mm hole fell out of the outline when the mesh sagged by almost the thickness | analytic | pass | **FAIL**: step 6 (sheet.convert): no outline on that face |
| sheet-metal/1092-convert-a-channel-with-its-bends-modelled | [tangency-labs/solidcraft#1092](https://github.com/tangency-labs/solidcraft/issues/1092) [tangency-labs/solidcraft#1314](https://github.com/tangency-labs/solidcraft/issues/1314) | a U channel modelled with its bend radii (R2 inside, R4 outside), a 6 mm hole in one wall and a label engraved 0.2 deep in its web, converted at the bends' outer arcs | analytic | pass | pass |
| sheet-metal/1092-convert-an-L-with-a-modelled-bend-to-the-rules-radius | [tangency-labs/solidcraft#1092](https://github.com/tangency-labs/solidcraft/issues/1092) [tangency-labs/solidcraft#1314](https://github.com/tangency-labs/solidcraft/issues/1314) | an L section modelled with a bend of R2 inside and R4 outside, converted at that bend under a rule of R3: the bend becomes one bend of the rule's radius at the legs' virtual sharp | analytic | pass | pass |
| sheet-metal/1092-convert-an-engraved-plate | [tangency-labs/solidcraft#1092](https://github.com/tangency-labs/solidcraft/issues/1092) [tangency-labs/solidcraft#1314](https://github.com/tangency-labs/solidcraft/issues/1314) | a 60 x 40 x 1 plate with a 20 x 10 x 0.1 engraving in its top face converted to sheet metal (refused as not a plate of even thickness; the engraving becomes a pocket of the sheet) | analytic | pass | pass |
| sheet-metal/1095-refold-a-cutout-with-a-corner-on-the-sheets-edge-at-a-bend | [tangency-labs/solidcraft#1095](https://github.com/tangency-labs/solidcraft/issues/1095) | a flange unfolded, a triangular cut-out with a corner on the sheet's own edge at the middle of the bend zone, refolded: sew failed (this wire is not simple) | analytic | **FAIL**: smlib_check SMLib check: 4 failed tests: SmFace::Test #32 Face has Coincident Vertices: Face has Coincient Verti (want ok) | **FAIL**: step 11 (solid.extrude): SMLib export: the mapped B-rep does not validate: portable B-rep: a closed shell bounds two regions and encloses one |
| sheet-metal/1280-hole-square-to-a-45-degree-flange | [tangency-labs/solidcraft#1280](https://github.com/tangency-labs/solidcraft/issues/1280) | a 5 mm hole drilled square to the face of a 45 degree flange: the drill cap's certificate refused it by 1e-11 mm | analytic | pass | pass |
| sheet-metal/1285-convert-a-bracket-whose-wall-covers-part-of-an-edge | [tangency-labs/solidcraft#1285](https://github.com/tangency-labs/solidcraft/issues/1285) [tangency-labs/solidcraft#1340](https://github.com/tangency-labs/solidcraft/issues/1340) | an 80 x 50 x 2 plate with a 40 wide, 30 high wall on part of its front edge, converted at the wall's outside bend edge: refused because the bend's setback used up an edge of a face | analytic | pass | pass |
| sheet-metal/1295-a-slot-across-a-flange-leaves-the-rest-of-it-as-a-loose-piece | [tangency-labs/solidcraft#1295](https://github.com/tangency-labs/solidcraft/issues/1295) [tangency-labs/solidcraft#1338](https://github.com/tangency-labs/solidcraft/issues/1338) | a 100 x 60 sheet with a 45 degree 40 mm flange and a slot cut across the flange just past its bend: the rest of the flange keeps no material joining it to the base | analytic | pass | pass |
| sheet-metal/1311-inside-flange-on-a-plate-turned-62-degrees | [tangency-labs/solidcraft#1311](https://github.com/tangency-labs/solidcraft/issues/1311) | a 100 x 60 plate turned 62 degrees about the origin with a 90 degree inside flange on one edge: the trimmed corner falls on the sew grid and the flange failed to close | analytic | pass | pass |
| sheet-metal/1481-unfold-a-tray-whose-features-choose-their-own-corner-relief | [tangency-labs/solidcraft#1232](https://github.com/tangency-labs/solidcraft/issues/1232) [tangency-labs/solidcraft#1481](https://github.com/tangency-labs/solidcraft/issues/1481) | a 120 x 90 base with two edge flange features (bottom and left edges with a round relief, top and right edges with a square one) over a rule whose relief is a notch, unfolded | analytic | pass | pass |
| sheet-metal/1797-tray-with-torn-corners-at-72-degrees-folded | [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a tray whose flanges lean at 72 degrees with the tear corner relief: the torn ends are helices over slanted bends | invariants | pass | pass |
| sheet-metal/1979-every-cut-after-a-cut-machines-the-sheet | [tangency-labs/solidcraft#1979](https://github.com/tangency-labs/solidcraft/issues/1979) [tangency-labs/solidcraft#1980](https://github.com/tangency-labs/solidcraft/issues/1980) | on a folded sheet a rectangular cut-out and then twenty 4 mm holes in one sketch: a cut after a cut was dropped without a word, and many holes ran out of budget | analytic | pass | pass |
| sheet-metal/262-fold-a-tab-just-inside-its-root | [tangency-labs/solidcraft#262](https://github.com/tangency-labs/solidcraft/issues/262) [tangency-labs/solidcraft#277](https://github.com/tangency-labs/solidcraft/issues/277) | a 20 x 20 tab folded 90 degrees on a line 1 mm inside its root, where the bend zone stays clear of the blank's outline | analytic | pass | pass |
| sheet-metal/262-fold-at-a-tab-root-refused | [tangency-labs/solidcraft#262](https://github.com/tangency-labs/solidcraft/issues/262) [tangency-labs/solidcraft#277](https://github.com/tangency-labs/solidcraft/issues/277) | a fold exactly at a tab's root, where the bend zone (+-BA/2) would reach the blank's outline beside the tab, needs a bend relief | invariants | pass | pass |
| sheet-metal/264-fold-one-of-two-collinear-tabs | [tangency-labs/solidcraft#264](https://github.com/tangency-labs/solidcraft/issues/264) [tangency-labs/solidcraft#279](https://github.com/tangency-labs/solidcraft/issues/279) | a 100 x 40 blank with two 15 x 7 tabs on one line, one tab folded 90 degrees on a line that the other tab also lies on | analytic | pass | pass |
| sheet-metal/264-one-fold-across-two-collinear-tabs | [tangency-labs/solidcraft#264](https://github.com/tangency-labs/solidcraft/issues/264) | one fold line spanning both of two collinear tabs folds both | analytic | pass | pass |
| sheet-metal/296-hole-in-a-base-with-two-adjacent-edge-flanges | [tangency-labs/solidcraft#296](https://github.com/tangency-labs/solidcraft/issues/296) [tangency-labs/solidcraft#355](https://github.com/tangency-labs/solidcraft/issues/355) | an 80 x 40 base with a 30 mm flange on the y = 0 edge and a 15 mm flange on the x = 80 edge, and a round hole through the base beside them: sew failed with a non-manifold edge contact | invariants | pass | pass |
| sheet-metal/3078-flange-on-the-side-edge-of-a-flange | [tangency-labs/solidcraft#3078](https://github.com/tangency-labs/solidcraft/issues/3078) [tangency-labs/solidcraft#3274](https://github.com/tangency-labs/solidcraft/issues/3274) | an edge flange on the side edge of an existing wall, meeting a flange on the base across the existing bend with a round corner relief (not supported yet: a flange on the side of another flange) | invariants | pass | pass |
| sheet-metal/3234-edge-flange-on-the-bend-line-refused | [tangency-labs/solidcraft#3234](https://github.com/tangency-labs/solidcraft/issues/3234) [tangency-labs/solidcraft#3273](https://github.com/tangency-labs/solidcraft/issues/3273) | a second edge flange picked on the bend line of an existing flange made a doubled flange with a gap and two shells in one body | invariants | pass | pass |
| sheet-metal/3316-convert-a-plate-keeps-its-place | [tangency-labs/solidcraft#3316](https://github.com/tangency-labs/solidcraft/issues/3316) | a 100 x 60 x 2 plate converted from its top face moved down by one thickness (z -2..0 instead of 0..2) | analytic | pass | pass |
| sheet-metal/3324-flat-pattern-refused-after-a-fillet-on-the-sheet | [tangency-labs/solidcraft#3324](https://github.com/tangency-labs/solidcraft/issues/3324) [tangency-labs/solidcraft#3325](https://github.com/tangency-labs/solidcraft/issues/3325) [tangency-labs/solidcraft#3418](https://github.com/tangency-labs/solidcraft/issues/3418) | a fillet on a sheet metal corner changes the body but not its sheet model, so the flat pattern would be a sharp rectangle: it must refuse | invariants | pass | pass |
| sheet-metal/3353-mirrored-sheet-body-keeps-its-flat-pattern | [tangency-labs/solidcraft#3353](https://github.com/tangency-labs/solidcraft/issues/3353) [tangency-labs/solidcraft#3354](https://github.com/tangency-labs/solidcraft/issues/3354) | a sheet metal body mirrored into a new body must still be sheet metal (flat pattern, bend table): it was a plain solid | analytic | **FAIL**: step 13 (sheet.flat_pattern): invalid parameters for `sheet.flat_pattern`: `Body1 (2)` is not a sheet metal body | **FAIL**: step 13 (sheet.flat_pattern): invalid parameters for `sheet.flat_pattern`: `Body1 (2)` is not a sheet metal body |
| sheet-metal/3417-rhombus-with-a-flange-on-each-edge-and-square-reliefs | [tangency-labs/solidcraft#3417](https://github.com/tangency-labs/solidcraft/issues/3417) [tangency-labs/solidcraft#3421](https://github.com/tangency-labs/solidcraft/issues/3421) [tangency-labs/solidcraft#3280](https://github.com/tangency-labs/solidcraft/issues/3280) | a 60 mm rhombus (120 and 60 degree corners) with a 90 degree flange on each of its four edges and a square corner relief 8 mm across: the reliefs at the two 120 degree corners would overlap | invariants | pass | pass |
| sheet-metal/349-unfold-a-tray-shrunk-by-a-parameter-72-degrees | [tangency-labs/solidcraft#349](https://github.com/tangency-labs/solidcraft/issues/349) | a 2000 x 2500 tray with four 38.6 mm flanges at 72 degrees whose sketch is driven by parameters W and H, shrunk to 400 x 300 and unfolded (the solver leaves 1e-13 mm residuals: the planar region arrangement failed) | analytic | pass | pass |
| sheet-metal/349-unfold-a-tray-shrunk-by-a-parameter-90-degrees | [tangency-labs/solidcraft#349](https://github.com/tangency-labs/solidcraft/issues/349) | a 2000 x 2500 tray with four 38.6 mm flanges at 90 degrees whose sketch is driven by parameters W and H, shrunk to 400 x 300 and unfolded (the solver leaves 1e-13 mm residuals: the planar region arrangement failed) | analytic | pass | pass |
| sheet-metal/405-tray-with-72-degree-flanges-folded | [tangency-labs/solidcraft#405](https://github.com/tangency-labs/solidcraft/issues/405) [tangency-labs/solidcraft#406](https://github.com/tangency-labs/solidcraft/issues/406) | a 120 x 90 tray with four 38.6 mm flanges at 72 degrees closed with the rule's gap: the corners used to stay open as a V | invariants | pass | pass |
| sheet-metal/405-unfold-a-tray-with-72-degree-flanges | [tangency-labs/solidcraft#405](https://github.com/tangency-labs/solidcraft/issues/405) [tangency-labs/solidcraft#406](https://github.com/tangency-labs/solidcraft/issues/406) | a 120 x 90 tray with four 38.6 mm flanges at 72 degrees, closed at the corners with the rule's gap, unfolded | analytic | pass | pass |
| sheet-metal/416-round-hole-and-slanted-slot-across-a-bend | [tangency-labs/solidcraft#416](https://github.com/tangency-labs/solidcraft/issues/416) [tangency-labs/solidcraft#425](https://github.com/tangency-labs/solidcraft/issues/425) [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a 160 x 100 plate with a 90 degree flange, unfolded, a 20 mm round hole and a 10 x 24 slot turned 30 degrees cut across the bend zone, refolded: the cut-out walls fold to curves on the bend's cylinder | analytic | pass | pass |
| sheet-metal/436-edge-flanges-at-105-and-120-degrees-on-opposite-edges | [tangency-labs/solidcraft#436](https://github.com/tangency-labs/solidcraft/issues/436) [tangency-labs/solidcraft#447](https://github.com/tangency-labs/solidcraft/issues/447) | one edge flange feature with its own angle and height on each of two opposite edges: 105 degrees and 30 mm, 120 degrees and 25 mm | analytic | pass | pass |
| sheet-metal/436-edge-flanges-with-their-own-height-on-opposite-edges | [tangency-labs/solidcraft#436](https://github.com/tangency-labs/solidcraft/issues/436) [tangency-labs/solidcraft#447](https://github.com/tangency-labs/solidcraft/issues/447) | one edge flange feature whose two edges carry their own heights (30 and 25 mm) over the feature's 20 mm default | analytic | pass | pass |
| sheet-metal/436-unfold-a-tray-with-four-angles-and-heights | [tangency-labs/solidcraft#436](https://github.com/tangency-labs/solidcraft/issues/436) [tangency-labs/solidcraft#447](https://github.com/tangency-labs/solidcraft/issues/447) [tangency-labs/solidcraft#501](https://github.com/tangency-labs/solidcraft/issues/501) | one edge flange feature whose four edges carry 75, 90, 105 and 120 degrees and heights 38.6, 38.6, 30 and 25, with corners between unequal angles closed, unfolded | analytic | pass | pass |
| sheet-metal/479-unfold-a-tray-with-round-relieved-corners | [tangency-labs/solidcraft#479](https://github.com/tangency-labs/solidcraft/issues/479) | a 120 x 90 tray with four 20 mm 90 degree flanges and corner relief shape round, unfolded | analytic | pass | pass |
| sheet-metal/488-unfold-a-tray-with-square-relieved-corners | [tangency-labs/solidcraft#488](https://github.com/tangency-labs/solidcraft/issues/488) | a 120 x 90 tray with four 20 mm 90 degree flanges and corner relief shape rectangular, unfolded | analytic | pass | pass |
| sheet-metal/514-refold-an-L-bracket-after-unfolding-it | [tangency-labs/solidcraft#514](https://github.com/tangency-labs/solidcraft/issues/514) | an L bracket unfolded and refolded: the refold must give the folded part back | analytic | pass | pass |
| sheet-metal/514-unfold-an-L-bracket | [tangency-labs/solidcraft#514](https://github.com/tangency-labs/solidcraft/issues/514) | a 60 x 40 base with a 20 mm 90 degree flange on one edge, unfolded: the flat plate is the base, the bend allowance and the flange's straight | analytic | pass | pass |
| sheet-metal/529-a-hundred-slots-and-four-folds | [tangency-labs/solidcraft#529](https://github.com/tangency-labs/solidcraft/issues/529) [tangency-labs/solidcraft#430](https://github.com/tangency-labs/solidcraft/issues/430) [tangency-labs/solidcraft#964](https://github.com/tangency-labs/solidcraft/issues/964) | a 200 x 300 panel with a hundred 4.4 x 20 slots and four 90 degree folds (one per side tab): the flat geometry ran out of its processing budget above 77 slots | analytic | pass | pass |
| sheet-metal/541-box-cut-straight-through-a-flat-sheet | [tangency-labs/solidcraft#541](https://github.com/tangency-labs/solidcraft/issues/541) | a solid.box cut straight through a 100 x 60 x 2.5 sheet was refused, though the same rectangle as an extrude cut works | analytic | pass | pass |
| sheet-metal/542-round-hole-in-a-flat-sheet-and-its-flat-pattern | [tangency-labs/solidcraft#542](https://github.com/tangency-labs/solidcraft/issues/542) [tangency-labs/solidcraft#552](https://github.com/tangency-labs/solidcraft/issues/552) | a 3.2 mm round hole cut through a 100 x 60 x 2.5 sheet, which the flat pattern must report as a circle | analytic | pass | pass |
| sheet-metal/560-hole-through-a-sheet-metal-base | [tangency-labs/solidcraft#560](https://github.com/tangency-labs/solidcraft/issues/560) [tangency-labs/solidcraft#656](https://github.com/tangency-labs/solidcraft/issues/656) | solid.hole square to a flat sheet metal panel was refused as sheet machining that cannot be preserved | analytic | pass | pass |
| sheet-metal/570-flange-refuses-thickness-it-would-ignore | [tangency-labs/solidcraft#570](https://github.com/tangency-labs/solidcraft/issues/570) [tangency-labs/solidcraft#594](https://github.com/tangency-labs/solidcraft/issues/594) [tangency-labs/solidcraft#572](https://github.com/tangency-labs/solidcraft/issues/572) | sheet.flange given thickness, k_factor and bend_radius, which the rule alone defines, used to ignore them silently and build the 2.5 mm default | invariants | pass | pass |
| sheet-metal/601-return-lip-on-a-flanges-far-edge | [tangency-labs/solidcraft#593](https://github.com/tangency-labs/solidcraft/issues/593) [tangency-labs/solidcraft#601](https://github.com/tangency-labs/solidcraft/issues/601) | an edge flange stands on the far edge of another edge flange (a lip turned in over the base), both 90 degrees | analytic | pass | pass |
| sheet-metal/634-flange-beside-the-leg-of-an-L-folded | [tangency-labs/solidcraft#634](https://github.com/tangency-labs/solidcraft/issues/634) | the same bar with its leg and a 15 mm inside flange on the bar's top edge, folded | analytic | pass | pass |
| sheet-metal/634-unfold-a-flange-beside-the-leg-of-an-L | [tangency-labs/solidcraft#634](https://github.com/tangency-labs/solidcraft/issues/634) | a 160 x 30 bar with a 20 x 30 leg past its top edge at the left end, and a 90 degree 15 mm inside flange on the bar's top edge (x 20..160), unfolded: the flange's trim cut the leg away | analytic | pass | pass |
| sheet-metal/638-fold-both-collinear-tabs-one-after-the-other | [tangency-labs/solidcraft#638](https://github.com/tangency-labs/solidcraft/issues/638) [tangency-labs/solidcraft#652](https://github.com/tangency-labs/solidcraft/issues/652) [tangency-labs/solidcraft#963](https://github.com/tangency-labs/solidcraft/issues/963) | two collinear tabs folded in two features on the same line; the second fold used to be refused as crossing a slanted edge | analytic | pass | pass |
| sheet-metal/639-fold-tab-on-inside-edge-of-an-L-blank | [tangency-labs/solidcraft#639](https://github.com/tangency-labs/solidcraft/issues/639) [tangency-labs/solidcraft#653](https://github.com/tangency-labs/solidcraft/issues/653) [tangency-labs/solidcraft#963](https://github.com/tangency-labs/solidcraft/issues/963) | a tab (x 45..60, y 60..90) on an inside edge of an L-shaped blank folded 90 degrees at x = 59 with the fixed point on the other leg; refused as folding tabs that join again | analytic | pass | pass |
| sheet-metal/659-ellipse-cutout-across-a-bend | [tangency-labs/solidcraft#659](https://github.com/tangency-labs/solidcraft/issues/659) [tangency-labs/solidcraft#692](https://github.com/tangency-labs/solidcraft/issues/692) | a 160 x 100 plate with a 90 degree flange, unfolded, a 24 x 12 ellipse cut across the bend zone and refolded: the cut's wall folds to a curve on the bend's cylinder | analytic | pass | pass |
| sheet-metal/659-ellipse-cutout-in-a-flat-sheet | [tangency-labs/solidcraft#659](https://github.com/tangency-labs/solidcraft/issues/659) [tangency-labs/solidcraft#692](https://github.com/tangency-labs/solidcraft/issues/692) | a 20 x 12 ellipse cut through a 100 x 60 x 2.5 sheet: it became 0.001 mm chords, one face each | analytic | pass | pass |
| sheet-metal/685-fold-with-the-fixed-point-on-the-top-face | [tangency-labs/solidcraft#958](https://github.com/tangency-labs/solidcraft/issues/958) | a large thin blank folded across its whole width with the fixed point exactly on the sheet's top face | analytic | pass | pass |
| sheet-metal/702-flange-along-what-a-cutout-leaves | [tangency-labs/solidcraft#702](https://github.com/tangency-labs/solidcraft/issues/702) | a 200 x 100 plate whose bottom-left 100 x 60 is cut away, and a 90 degree 40 mm inside flange picked on what is left of the bottom edge (x 100..200) | analytic | pass | pass |
| sheet-metal/723-tray-with-torn-corners-folded | [tangency-labs/solidcraft#723](https://github.com/tangency-labs/solidcraft/issues/723) [tangency-labs/solidcraft#809](https://github.com/tangency-labs/solidcraft/issues/809) [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a 120 x 90 tray with four 20 mm 90 degree flanges and the tear corner relief: each torn bend end is a helical cut across the bend | invariants | pass | pass |
| sheet-metal/723-unfold-a-tray-with-torn-corners | [tangency-labs/solidcraft#723](https://github.com/tangency-labs/solidcraft/issues/723) [tangency-labs/solidcraft#809](https://github.com/tangency-labs/solidcraft/issues/809) [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a 120 x 90 tray with four 20 mm 90 degree flanges and corner relief shape tear, unfolded | analytic | pass | pass |
| sheet-metal/725-convert-a-shelled-tray-and-unfold-it | [tangency-labs/solidcraft#647](https://github.com/tangency-labs/solidcraft/issues/647) [tangency-labs/solidcraft#725](https://github.com/tangency-labs/solidcraft/issues/725) [tangency-labs/solidcraft#1285](https://github.com/tangency-labs/solidcraft/issues/1285) [tangency-labs/solidcraft#1340](https://github.com/tangency-labs/solidcraft/issues/1340) | a 100 x 60 x 30 box shelled to 2 mm, converted to sheet metal by its four bottom edges and unfolded | analytic | pass | pass |
| sheet-metal/774-convert-a-plate-with-nine-round-holes | [tangency-labs/solidcraft#774](https://github.com/tangency-labs/solidcraft/issues/774) [tangency-labs/solidcraft#977](https://github.com/tangency-labs/solidcraft/issues/977) | a 30 x 30 x 2 plate with nine 4 mm holes converted to sheet metal (refused as not a plate of even thickness: the holes were read as polygons) | analytic | pass | pass |
| sheet-metal/839-flange-on-a-plate-with-rounded-corners-unfolded | [tangency-labs/solidcraft#839](https://github.com/tangency-labs/solidcraft/issues/839) | a 200 x 100 plate with its corners rounded 8 and one 40 mm inside flange on its bottom edge, unfolded: the trim made the outline's arcs chords | analytic | pass | pass |
| sheet-metal/955-hole-drilled-into-a-sheet-metal-rim | [tangency-labs/solidcraft#955](https://github.com/tangency-labs/solidcraft/issues/955) | a 2 mm hole drilled 10 mm deep into the rim of a 4 mm sheet, along the panel; it is a bore the panel keeps | analytic | pass | pass |
| sheet-metal/978-edge-flange-beside-a-ledge-as-tall-as-its-setback | [tangency-labs/solidcraft#978](https://github.com/tangency-labs/solidcraft/issues/978) | a 90 degree inside flange of radius 1 on an edge that has a ledge beside it exactly as tall as the flange's setback (3 mm): sew failed with a degenerate edge | invariants | pass | pass |
| shell/12-offset-one-split-face-piece | [tangency-labs/solidcraft#12](https://github.com/tangency-labs/solidcraft/issues/12) | Offset Face on one piece of a split face moves only that piece, not the coplanar neighbour | analytic | pass | pass |
| shell/1494-shell-box-with-cylinder-on-edge-line | [tangency-labs/solidcraft#1494](https://github.com/tangency-labs/solidcraft/issues/1494) | a 47.5x45x30 box with a cylinder r7.5 joined on its side whose axis lies in the plane of the box's front face (y=0), shelled 1 mm open at the bottom | invariants | **FAIL**: step 3 (solid.shell): offset: a corner whose faces don't meet the same way after the move | **FAIL**: step 3 (solid.shell): SMLib shell: operation: SMLib failed (status 1001) |
| shell/1525-shell-box-with-rounds-chamfer-and-fillet | [tangency-labs/solidcraft#1525](https://github.com/tangency-labs/solidcraft/issues/1525) | a 50x50x30 box with r10 vertical rounds, a 5 mm chamfer round the base and a 4 mm fillet where the chamfer meets the wall, shelled 2 mm open at the top | invariants | **FAIL**: step 5 (solid.shell): offset: only bodies with planes, cylinders, cones, spheres and tori (a face at [10.00, 0.00, 6.66]) | **FAIL**: step 4 (solid.fillet): SMLib fillet: SMLib's check refuses the result: 3 failed tests: SmBrep::Test #59 Tolerance: Edge tolerance relative to brep tolerance (of |
| shell/1972-shell-one-half-sphere-leaves-the-other | [tangency-labs/solidcraft#1972](https://github.com/tangency-labs/solidcraft/issues/1972) | a sphere split into two hemispheres; shelling the flat face of one must hollow that half only, the other half stays solid | analytic | **FAIL**: smlib_check SMLib check: 4 failed tests: SmFace::Test #36 Face Near missing Seam: Face Surface Seam has suspicio (want ok) | pass |
| shell/2531-shell-point-pick-after-parameter-edit | [tangency-labs/solidcraft#2531](https://github.com/tangency-labs/solidcraft/issues/2531) | a shell opened by a point pick keeps opening only that face after a parameter edit moves the body under the stored point | analytic | **FAIL**: faces 10 (want 11); volume_mm3 17376 (want 22112) | **FAIL**: volume_mm3 17952 (want 22112) |
| shell/2939-offset-face-sphere | [tangency-labs/solidcraft#2939](https://github.com/tangency-labs/solidcraft/issues/2939) | Offset Face on a sphere's round face | analytic | pass | pass |
| shell/3103-shell-tapered-cylinder | [tangency-labs/solidcraft#3103](https://github.com/tangency-labs/solidcraft/issues/3103) | a cone frustum (r20 at the base, r15 at the top, 30 tall) shelled 2 mm open at the top | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([-12.972412489914536, 1.0839936279907245e-9, 29.9 (want ok); smlib_check the operation failed: pcurve of loop 0 use 0 (Some([-12.972412489914536, 1.0839936279907245e-9, 29.9 (want ok) | pass |
| shell/3283-offset-face-cylinder-wall | [tangency-labs/solidcraft#3283](https://github.com/tangency-labs/solidcraft/issues/3283) [tangency-labs/solidcraft#3650](https://github.com/tangency-labs/solidcraft/issues/3650) | Offset Face on the outer cylindrical wall of a tube (the picker only accepted planar faces) | analytic | pass | pass |
| shell/3468-offset-face-boss-wall-next-to-fillet | [tangency-labs/solidcraft#3468](https://github.com/tangency-labs/solidcraft/issues/3468) [tangency-labs/solidcraft#3898](https://github.com/tangency-labs/solidcraft/issues/3898) | Offset Face on a boss wall whose base has a 2 mm fillet: the boss grows to r 11 and the fillet follows | analytic | **FAIL**: step 4 (solid.offset_face): offset: a corner whose faces don't meet the same way after the move | **FAIL**: step 4 (solid.offset_face): SMLib offset faces: SMLib's check refuses the result: 4 failed tests: SmBrep::Test #59 Tolerance: Edge tolerance relative to brep to |
| shell/3506-split-body-then-shell-both-halves | [tangency-labs/solidcraft#3506](https://github.com/tangency-labs/solidcraft/issues/3506) | a box split in two at z=10, then each half shelled 2 mm open on the mating face | analytic | pass | pass |
| shell/3576-shell-tapered-box-rounded-corners | [tangency-labs/solidcraft#3576](https://github.com/tangency-labs/solidcraft/issues/3576) [tangency-labs/solidcraft#3573](https://github.com/tangency-labs/solidcraft/issues/3573) | a 120x80x40 box drafted 5 degrees with 4 mm rounds on the sloping corners, shelled 2 mm open at the top: the inner rounds' edges must lie on their faces (#3573 reports the same design) | invariants | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([57.81738299786144, 35.84870237103483, 2.0]) to S (want ok); smlib_check the operation failed: pcurve of loop 0 use 1 (Some([55.848702371033994, 37.81738299786145, 2.0]) to (want ok) | **FAIL**: step 6 (solid.shell): SMLib shell: SMLib's check refuses the result: 12 failed tests: SmBSplineSurface::Test #5 Bad NonMonotonic CPts: SmBSplineSurface Control |
| shell/3669-shell-lofted-square-frustum | [tangency-labs/solidcraft#3669](https://github.com/tangency-labs/solidcraft/issues/3669) [tangency-labs/solidcraft#2990](https://github.com/tangency-labs/solidcraft/issues/2990) | a loft between a 40 mm and a 20 mm square 80 mm apart, shelled 2 mm open at the small end | analytic | pass | pass |
| shell/391-deboss-text-on-flange-of-filleted-shelled-body | [tangency-labs/solidcraft#391](https://github.com/tangency-labs/solidcraft/issues/391) | text debossed 0.6 mm into the flat flange top of a filleted and shelled tapered housing, well away from the curved walls | invariants | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([42.37656695189378, 23.85763450177594, 3.5]) to S (want ok); smlib_check the operation failed: pcurve of loop 0 use 0 (Some([42.37656695189378, 23.85763450177594, 3.5]) to S (want ok) | not supported yet: step 8 (solid.extrude): not supported yet: SMLib draft extrusion with a straight foot |
| shell/4009-closed-shell-internal-void | [tangency-labs/solidcraft#4009](https://github.com/tangency-labs/solidcraft/issues/4009) | shell with no face removed: a closed hollow body with a sealed internal void | analytic | **FAIL**: step 5 (solid.shell): invalid parameters for `solid.shell`: select 1…1000 faces | **FAIL**: step 5 (solid.shell): invalid parameters for `solid.shell`: select 1…1000 faces |
| shell/4010-shell-open-at-through-hole-wall | [tangency-labs/solidcraft#4010](https://github.com/tangency-labs/solidcraft/issues/4010) | plate with a through hole shelled 2.5 mm with only the hole's wall removed | analytic | **FAIL**: step 6 (solid.shell): offset: a corner whose faces don't meet the same way after the move | pass |
| shell/566-shell-swept-bar-with-bend | [tangency-labs/solidcraft#566](https://github.com/tangency-labs/solidcraft/issues/566) | a 8x5 bar swept along a line-arc-line path (quarter circle r30 between two 30 mm legs), shelled 0.5 mm open at its start | analytic | **FAIL**: step 10 (solid.shell): offset: a corner whose faces don't meet the same way after the move | pass |
| shell/745-offset-face-on-body-with-distant-freeform-boss | [tangency-labs/solidcraft#745](https://github.com/tangency-labs/solidcraft/issues/745) [tangency-labs/solidcraft#3893](https://github.com/tangency-labs/solidcraft/issues/3893) | Offset Face on a planar end of a body that has a spline-outlined boss far from the moved face | invariants | **FAIL**: step 7 (solid.offset_face): offset: only bodies with planes, cylinders, cones, spheres and tori (a face at [35.00, 5.00, 10.00]) | pass |
| shell/745-offset-face-then-cut-boss-away | [tangency-labs/solidcraft#745](https://github.com/tangency-labs/solidcraft/issues/745) [tangency-labs/solidcraft#3893](https://github.com/tangency-labs/solidcraft/issues/3893) | the same end offset, then the boss and the box beyond x=24 cut away, which leaves an analytic body | analytic | **FAIL**: step 7 (solid.offset_face): offset: only bodies with planes, cylinders, cones, spheres and tori (a face at [35.00, 5.00, 10.00]) | pass |
| sweeps/1093-circular-pattern-of-a-lofted-join-blade | [tangency-labs/solidcraft#1093](https://github.com/tangency-labs/solidcraft/issues/1093) [tangency-labs/solidcraft#1107](https://github.com/tangency-labs/solidcraft/issues/1107) | a tapered lofted blade (6 x 3 root embedded 2 mm into a disk, 3 x 1.5 tip) joined to a disk and patterned 9 times round the axis as joins (31 minutes with eight retries, or "cavity ownership is ambiguous") | analytic | pass | pass |
| sweeps/1140-loft-hollow-tube-bands-halved-and-joined | [tangency-labs/solidcraft#1140](https://github.com/tangency-labs/solidcraft/issues/1140) | two hollow lofted tube bands (outer r 30, bore r 18 on R100, 5 sections each, 45 degrees each), each cut in half through its axis plane z = 0 and the halves joined into one body ("no result" after ten minutes of fallbacks) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 3 (Some([91.92386223510539, 91.92386223510539, -1.2621774 (want ok) | pass |
| sweeps/1184-loft-ring-sections-keep-the-hole | [tangency-labs/solidcraft#1184](https://github.com/tangency-labs/solidcraft/issues/1184) [tangency-labs/solidcraft#1254](https://github.com/tangency-labs/solidcraft/issues/1254) [tangency-labs/solidcraft#2435](https://github.com/tangency-labs/solidcraft/issues/2435) [tangency-labs/solidcraft#2447](https://github.com/tangency-labs/solidcraft/issues/2447) | a loft between two ring sections (outer r 20, inner r 12) 20 mm apart (the hole was dropped and a solid disc built) | analytic | pass | not supported yet: step 9 (solid.loft): not supported yet: SMLib loft through sections with holes |
| sweeps/1269-sweep-parallel-orientation-oblique-cylinder | [tangency-labs/solidcraft#1269](https://github.com/tangency-labs/solidcraft/issues/1269) | a circle of radius 5 on XY swept with orientation parallel along a path rising 20 mm while leaning 20 mm in x (the profile does not turn: a sheared cylinder) | analytic | pass | pass |
| sweeps/1269-sweep-twisted-square-ninety-degrees | [tangency-labs/solidcraft#1269](https://github.com/tangency-labs/solidcraft/issues/1269) | a 10 x 10 square swept 40 mm along a straight path while turning 90 degrees about the path | analytic | pass | not supported yet: step 7 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/1391-flange-flush-on-the-end-of-a-bent-tapered-loft-20deg | [tangency-labs/solidcraft#1391](https://github.com/tangency-labs/solidcraft/issues/1391) [tangency-labs/solidcraft#1556](https://github.com/tangency-labs/solidcraft/issues/1556) | a half tube (6 mm wall, inner radius tapering 60 to 75 mm) lofted through 5 sections along an R300 bend of 20 degrees, with an 8 mm half-annulus flange (inner radius +3 into the wall, outer +25 beyond it) extruded from the end plane outward and joined: the flange face lies in the end plane ("Union: no result") | analytic | **FAIL**: shells Tube: 2 (want 1) | pass |
| sweeps/1391-flange-flush-on-the-end-of-a-bent-tapered-loft-40deg | [tangency-labs/solidcraft#1391](https://github.com/tangency-labs/solidcraft/issues/1391) [tangency-labs/solidcraft#1556](https://github.com/tangency-labs/solidcraft/issues/1556) | a half tube (6 mm wall, inner radius tapering 60 to 75 mm) lofted through 5 sections along an R300 bend of 40 degrees, with an 8 mm half-annulus flange (inner radius +3 into the wall, outer +25 beyond it) extruded from the end plane outward and joined: the flange face lies in the end plane ("Union: no result") | analytic | **FAIL**: shells Tube: 2 (want 1) | pass |
| sweeps/1411-coil-intersected-with-a-cylinder-holding-it | [tangency-labs/solidcraft#1411](https://github.com/tangency-labs/solidcraft/issues/1411) | a 4-turn coil (centre diameter 40, wire 3 mm, pitch 8) intersected with a cylinder of radius 25 and height 40 that holds it (crash report: unclean exit in solid.coil) | analytic | pass | pass |
| sweeps/1490-loft-joined-into-a-window-of-a-wall-that-it-overhangs | [tangency-labs/solidcraft#1490](https://github.com/tangency-labs/solidcraft/issues/1490) | a wall 2.5 mm thick with a 30 x 20 window cut through it and a loft (34 x 24 growing to 38 x 28 over 3.5 mm) joined into the window so that its strips overhang the wall on both faces ("Union: no result" at some wall thicknesses) | analytic | pass | pass |
| sweeps/1666-loft-zigzag-to-flat-rectangle | [tangency-labs/solidcraft#1666](https://github.com/tangency-labs/solidcraft/issues/1666) | a ruled loft from an 18-vertex zig-zag section to a flat 52 x 3 rectangle with 18 vertices (8 of them collinear), whose twisted ruled faces were exported as crossing triangles | analytic | pass | pass |
| sweeps/1669-mirrored-window-and-loft-on-a-hollow-case | [tangency-labs/solidcraft#1669](https://github.com/tangency-labs/solidcraft/issues/1669) | a closed hollow box (60 x 60 x 40, 2.5 mm walls) with a window cut in one end wall and a loft joined into it, both mirrored about the middle plane x = 30 onto the far wall ("Union: no result" on the mirror only) | analytic | pass | pass |
| sweeps/1853-revolve-cut-half-a-slot-about-its-centreline | [tangency-labs/solidcraft#1853](https://github.com/tangency-labs/solidcraft/issues/1853) [tangency-labs/solidcraft#1866](https://github.com/tangency-labs/solidcraft/issues/1866) | half a slot (r 3, centres 14 apart) revolved a full turn about its own centreline, which lies in the top face of a plate, as a cut (no result after about 10 s of retries) | analytic | pass | pass |
| sweeps/1856-disk-and-36-twisted-lofted-blades-joined | [tangency-labs/solidcraft#2992](https://github.com/tangency-labs/solidcraft/issues/2992) [tangency-labs/solidcraft#1856](https://github.com/tangency-labs/solidcraft/issues/1856) | a disk joined to 36 patterned twisted lofted blades (each a loft of 9 rectangle sections turning 7.5 degrees apart, rooted 2 mm inside the disk): hang of minutes | analytic | **HANG**: no result after 180 s | **HANG**: no result after 180 s |
| sweeps/1866-revolve-half-slot-profile-180 | [tangency-labs/solidcraft#1866](https://github.com/tangency-labs/solidcraft/issues/1866) | half a slot (r 3, centres 14 apart; the segment before the axis edge comes back to the axis along an arc) revolved 180 deg about its centreline | analytic | pass | pass |
| sweeps/1866-revolve-half-slot-profile-90 | [tangency-labs/solidcraft#1866](https://github.com/tangency-labs/solidcraft/issues/1866) | half a slot (r 3, centres 14 apart; the segment before the axis edge comes back to the axis along an arc) revolved 90 deg about its centreline | analytic | pass | pass |
| sweeps/2005-closed-sweep-twisted-cut-inside-a-torus | [tangency-labs/solidcraft#2005](https://github.com/tangency-labs/solidcraft/issues/2005) [tangency-labs/solidcraft#2010](https://github.com/tangency-labs/solidcraft/issues/2010) | an 8 x 8 square swept a full turn round a circle of radius 30 with a 180 degree twist, cut from a torus (R 30, r 8) that holds it (no result, or minutes) | analytic | pass | not supported yet: step 11 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/2005-closed-sweep-twisted-new-body | [tangency-labs/solidcraft#2005](https://github.com/tangency-labs/solidcraft/issues/2005) [tangency-labs/solidcraft#2010](https://github.com/tangency-labs/solidcraft/issues/2010) | an 8 x 8 square swept a full turn round a circle of radius 30 with a 90 degree twist, as a new body (the sweep that closes on itself) | analytic | pass | not supported yet: step 7 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/201-loft-one-guide-rail-cone-frustum | [tangency-labs/solidcraft#201](https://github.com/tangency-labs/solidcraft/issues/201) [tangency-labs/solidcraft#3371](https://github.com/tangency-labs/solidcraft/issues/3371) | a loft from a circle of radius 5 to a circle of radius 10, 20 mm above, guided by one straight rail through (5,0,0) and (10,0,20) | analytic | pass | not supported yet: step 10 (solid.loft): not supported yet: SMLib loft along guide rails |
| sweeps/2056-rib-grows-along-the-sketch-normal-to-the-part | [tangency-labs/solidcraft#2056](https://github.com/tangency-labs/solidcraft/issues/2056) [tangency-labs/solidcraft#2057](https://github.com/tangency-labs/solidcraft/issues/2057) | a rib drawn on a plane 20 mm in front of a block (parallel to XZ, a 40 mm line along X) with direction normal, growing toward the block | analytic | pass | pass |
| sweeps/2183-revolve-profile-crosses-the-axis-refused | [tangency-labs/solidcraft#2453](https://github.com/tangency-labs/solidcraft/issues/2453) [tangency-labs/solidcraft#2183](https://github.com/tangency-labs/solidcraft/issues/2183) | a rectangle that straddles the revolve axis (x from -5 to 15 about the sketch y axis) | invariants | pass | pass |
| sweeps/2295-revolve-cut-torus-by-an-overlapping-ring | [tangency-labs/solidcraft#2295](https://github.com/tangency-labs/solidcraft/issues/2295) | a torus (R 10, r 5) cut by a disc of radius 5 centred at (15,0) in the XZ plane revolved about Z (the disc overlaps the torus tube) | analytic | pass | pass |
| sweeps/2435-loft-rectangular-ring-sections | [tangency-labs/solidcraft#2435](https://github.com/tangency-labs/solidcraft/issues/2435) [tangency-labs/solidcraft#2447](https://github.com/tangency-labs/solidcraft/issues/2447) | a loft between two rectangular ring sections (a rectangle with a rectangular hole), 24 mm apart, tapering outer 40 x 30 to 28 x 20 and hole 20 x 14 to 12 x 6 | analytic | pass | not supported yet: step 9 (solid.loft): not supported yet: SMLib loft through sections with holes |
| sweeps/2516-revolve-about-a-named-construction-axis | [tangency-labs/solidcraft#3796](https://github.com/tangency-labs/solidcraft/issues/3796) [tangency-labs/solidcraft#3619](https://github.com/tangency-labs/solidcraft/issues/3619) [tangency-labs/solidcraft#2516](https://github.com/tangency-labs/solidcraft/issues/2516) | a rectangle revolved about a construction axis picked by name ("unknown sketch line `Axis1`") | analytic | **FAIL**: step 5 (solid.revolve): unknown sketch line `Axis1` | **FAIL**: step 5 (solid.revolve): unknown sketch line `Axis1` |
| sweeps/2552-thread-groove-cut-by-a-square-coil-in-a-bore | [tangency-labs/solidcraft#2552](https://github.com/tangency-labs/solidcraft/issues/2552) | a square-wire coil (diameter 10, section 0.9 inside, pitch 1.5, height 10) cut as a helical groove into the wall of a bore of radius 4.1 in a 30 x 30 x 12 block (crash report: unclean exit in solid.coil) | analytic | **HANG**: no result after 180 s | **CRASH**: process exited (signal: 11 (SIGSEGV) (core dumped)) without a result: |
| sweeps/2570-loft-circle-to-a-non-star-shaped-comb | [tangency-labs/solidcraft#2570](https://github.com/tangency-labs/solidcraft/issues/2570) [tangency-labs/solidcraft#3670](https://github.com/tangency-labs/solidcraft/issues/3670) | a loft between a circle and a 20-edge comb outline (not star-shaped from its centroid: the teeth turn the vertex directions back on themselves), 40 mm apart (the circle was wound about ten times, the app froze) | invariants | **FAIL**: record_valid geometry: portable B-rep: face 21 loop 0: outer loop runs clockwise in (u, v) (signed area -1.154845 (want ok); smlib_check SMLib check: 4 failed tests: SmBrep::Test #4 Bad Gap: Edge/Surface gap across Edgeuse larger than to (want ok); bbox.min [-18.151366, -22.51753, -0] (want [-18, -2, 0]); bbox.max [20.634025, 37.723464, 40] (want [18, 18, 40]) | **FAIL**: step 7 (solid.loft): invalid input: an arc turns more than once |
| sweeps/2607-revolve-axis-outside-the-sketch-plane-refused | [tangency-labs/solidcraft#3736](https://github.com/tangency-labs/solidcraft/issues/3736) [tangency-labs/solidcraft#2607](https://github.com/tangency-labs/solidcraft/issues/2607) | a profile on the XZ plane revolved about the world Y axis, which does not lie in the sketch plane | invariants | pass | pass |
| sweeps/2667-revolve-half-disc-sphere | [tangency-labs/solidcraft#2667](https://github.com/tangency-labs/solidcraft/issues/2667) | a half disc of radius 6 on the axis revolved a full turn (mutation survivor: half_disc area factor) | analytic | pass | pass |
| sweeps/2667-revolve-half-disc-three-quarters | [tangency-labs/solidcraft#2667](https://github.com/tangency-labs/solidcraft/issues/2667) | the same half disc revolved 270 degrees (mutation survivor: full_circle test of the sweep angle) | analytic | pass | pass |
| sweeps/2667-sweep-hostile-end-scale-refused | [tangency-labs/solidcraft#2667](https://github.com/tangency-labs/solidcraft/issues/2667) | a sweep with an end scale of 500 (the engine allows 0.01 to 100): the option check (SweepControl::check) must refuse it | invariants | pass | pass |
| sweeps/271-loft-cut-with-targets-keeps-the-bystander | [tangency-labs/solidcraft#271](https://github.com/tangency-labs/solidcraft/issues/271) [tangency-labs/solidcraft#286](https://github.com/tangency-labs/solidcraft/issues/286) [tangency-labs/solidcraft#299](https://github.com/tangency-labs/solidcraft/issues/299) | a loft cut limited by targets to one body while a second body lies inside the loft | analytic | pass | pass |
| sweeps/2820-pipe-cut-oblique-hole-through-a-block | [tangency-labs/solidcraft#2820](https://github.com/tangency-labs/solidcraft/issues/2820) | a pipe of diameter 6 cut through a 40 x 40 x 20 block along a line leaning 30 degrees from the vertical | analytic | pass | pass |
| sweeps/2820-pipe-hollow-with-a-wall-along-a-bend | [tangency-labs/solidcraft#2820](https://github.com/tangency-labs/solidcraft/issues/2820) | a hollow pipe (outer diameter 10, wall 2) along a path of two lines joined by a tangent R20 quarter arc | analytic | pass | **FAIL**: step 6 (solid.pipe): SMLib sweep: SMLib failed (status 1001) |
| sweeps/2847-loft-rectangles-turning-through-half-a-turn | [tangency-labs/solidcraft#2847](https://github.com/tangency-labs/solidcraft/issues/2847) [tangency-labs/solidcraft#3452](https://github.com/tangency-labs/solidcraft/issues/3452) | a loft through 19 identical 6 x 4 rectangles on planes turning about the Z axis every 10 degrees from 0 to 180 degrees, centred 30 mm from the axis (volume came out 6 % of the expected at 180 degrees, no error) | analytic | **FAIL**: smlib_check SMLib check: 1 failed tests: SmBrep::Test #8 Bad Infinite Region: m_pInfiniteRegion is incorrect [ow (want ok); volume_mm3 125.665718 (want 2261.946711); bbox.max [33, 33.222229, 2] (want [33, 33, 2]) | **FAIL**: volume_mm3 -127.306602 (want 2261.946711); bbox.max [33, 33.208374, 2] (want [33, 33, 2]) |
| sweeps/2862-three-pipes-meeting-at-one-point | [tangency-labs/solidcraft#2862](https://github.com/tangency-labs/solidcraft/issues/2862) | three pipes of diameter 4.4 and length 20 along +X, +Y and +Z, all ending at the origin, joined (a non-planar tripod junction: kernel panics, then no result) | analytic | **FAIL**: step 9 (solid.pipe): boolean Union: the operation failed: no result | not supported yet: step 7 (solid.pipe): not supported yet: SMLib sweep along a path of points (a 3D sketch curve) |
| sweeps/2891-twisted-sweep-cut-through-a-tube | [tangency-labs/solidcraft#2891](https://github.com/tangency-labs/solidcraft/issues/2891) [tangency-labs/solidcraft#3695](https://github.com/tangency-labs/solidcraft/issues/3695) | a 20 x 20 square swept 250 mm along the axis of a tube (ID 20, OD 30, 250 long) with a 30 degree twist, cut from it (the twisted cut froze the app) | analytic | **FAIL**: step 12 (solid.sweep): boolean Cut: the operation failed: no result | not supported yet: step 12 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/2947-revolve-300-degrees-intersected-by-a-plate | [tangency-labs/solidcraft#2947](https://github.com/tangency-labs/solidcraft/issues/2947) [tangency-labs/solidcraft#2948](https://github.com/tangency-labs/solidcraft/issues/2948) | a rectangle section revolved 300 degrees about Z, then intersected with a plate (slab /y/ <= 5) crossing the ring at the start/end gap side and the far side (boolean gave up: "loop not inside any face piece") | analytic | pass | pass |
| sweeps/3006-second-sweep-from-a-plane-along-a-closed-path | [tangency-labs/solidcraft#3006](https://github.com/tangency-labs/solidcraft/issues/3006) | a circle of radius 3 on a plane at 0.5 of a closed circular path (R 30) swept round it, then a 5 x 5 square on a plane at 0.75 swept round the same path and joined (it did not follow the path) | analytic | **FAIL**: smlib_check SMLib check: 12 failed tests: SmFace::Test #36 Face Near missing Seam: Face Surface Seam has suspici (want ok) | **FAIL**: step 13 (solid.sweep): SMLib export: the mapped B-rep does not validate: portable B-rep: a closed shell bounds two regions and encloses one |
| sweeps/3088-coil-thread-joined-flush-with-a-cylinder | [tangency-labs/solidcraft#3088](https://github.com/tangency-labs/solidcraft/issues/3088) [tangency-labs/solidcraft#3758](https://github.com/tangency-labs/solidcraft/issues/3758) | a 4-turn square coil (4 mm wire, pitch 9, outer diameter 30.8, section inside) joined round a cylinder of radius 15 and height 40, its ends flush with the cylinder end faces (hang of several minutes, crash report) | analytic | **HANG**: no result after 180 s | pass |
| sweeps/3111-loft-rectangular-ring-to-circular-ring | [tangency-labs/solidcraft#3111](https://github.com/tangency-labs/solidcraft/issues/3111) | a loft from a rectangular ring (two nested rectangles) to a circular ring (two concentric circles) 30 mm above: a hollow transition piece | invariants | pass | not supported yet: step 9 (solid.loft): not supported yet: SMLib loft through sections with holes |
| sweeps/3156-revolve-join-end-faces-flush-with-a-face | [tangency-labs/solidcraft#3156](https://github.com/tangency-labs/solidcraft/issues/3156) [tangency-labs/solidcraft#3224](https://github.com/tangency-labs/solidcraft/issues/3224) | a rectangle revolved plus and minus 90 degrees about an axis in a plate top face: both planar end faces lie in that face and the join needed a tool nudge | analytic | pass | pass |
| sweeps/3191-revolve-cut-leaves-a-cone | [tangency-labs/solidcraft#3911](https://github.com/tangency-labs/solidcraft/issues/3911) [tangency-labs/solidcraft#3191](https://github.com/tangency-labs/solidcraft/issues/3191) | a triangle sharing the cylinder side and top rim revolved as a cut to leave a cone (the cut never completed) | analytic | **FAIL**: step 5 (solid.revolve): invalid input: the profile crosses the revolve axis | **FAIL**: step 5 (solid.revolve): invalid input: the profile crosses the revolve axis |
| sweeps/3326-loft-20mm-square-to-a-circle | [tangency-labs/solidcraft#3326](https://github.com/tangency-labs/solidcraft/issues/3326) [tangency-labs/solidcraft#3402](https://github.com/tangency-labs/solidcraft/issues/3402) | a loft from a 20 mm square to a circle of radius 10 offset 20 mm (the loft tool symbol): the loft geometry looked wrong | invariants | pass | pass |
| sweeps/3345-sweep-profile-mid-line-round-a-rounded-rectangle | [tangency-labs/solidcraft#3345](https://github.com/tangency-labs/solidcraft/issues/3345) | a 4 x 3 profile drawn at the middle of the bottom line of a closed 60 x 40 rounded-rectangle path (corner radius 8) and swept round the whole path (walls offset, fillets turned the wrong way) | analytic | **FAIL**: volume_mm3 2225.797307 (want 2235.185789); bbox.min [-45.497256, -35.488093, -1.5] (want [-32, -22, -1.5]); bbox.max [45.497256, 35.488093, 1.5] (want [32, 22, 1.5]) | **FAIL**: bbox.min [-46.165028, -36.165028, -1.5] (want [-32, -22, -1.5]); bbox.max [46.165028, 36.165028, 1.5] (want [32, 22, 1.5]) |
| sweeps/3412-loft-sections-in-one-plane-refused | [tangency-labs/solidcraft#3412](https://github.com/tangency-labs/solidcraft/issues/3412) | a loft through two circles drawn on the same plane (no volume between them; it built a flat zero-volume body and reported success) | invariants | pass | pass |
| sweeps/3505-extrude-the-flat-wall-of-a-sweep-with-a-corner | [tangency-labs/solidcraft#3505](https://github.com/tangency-labs/solidcraft/issues/3505) | the inner side wall of the vertical leg of a mitred swept bar extruded outward by 3 mm (the wall is a B-spline net in a plane, "the selected planar face no longer exists") | analytic | **FAIL**: step 9 (solid.extrude): invalid parameters for `face profile`: the selected planar face no longer exists; choose another face or an explicit fixed plane | not supported yet: step 8 (solid.sweep): not supported yet: SMLib sweep along a path with corners (SMLib's sweep follows smooth paths) |
| sweeps/3528-revolved-dome-cut-by-a-ball-on-its-seam | [tangency-labs/solidcraft#3528](https://github.com/tangency-labs/solidcraft/issues/3528) | a ball of radius 4 centred on the dome of a revolved mushroom cap (azimuth 15 degrees, across an internal seam of the revolved faces), cut from it: removed nearly the whole ball | analytic | pass | **FAIL**: volume_mm3 48118.357835 (want 46424.505878) |
| sweeps/3541-loft-two-circles-into-a-cone-flipped-plane | [tangency-labs/solidcraft#3541](https://github.com/tangency-labs/solidcraft/issues/3541) | a loft from a circle of radius 8 to a circle of radius 20, 30 mm below it (sections given small first, the small one drawn on a plane turned over (normal pointing down)): "a horizontal narrowing is created" instead of a cone | analytic | pass | pass |
| sweeps/3541-loft-two-circles-into-a-cone-same-sense | [tangency-labs/solidcraft#3541](https://github.com/tangency-labs/solidcraft/issues/3541) | a loft from a circle of radius 8 to a circle of radius 20, 30 mm below it (sections given small first, the small one drawn on a plane facing the same way): "a horizontal narrowing is created" instead of a cone | analytic | pass | pass |
| sweeps/3832-coil-cut-with-negative-pitch-inside-a-cylinder | [tangency-labs/solidcraft#3832](https://github.com/tangency-labs/solidcraft/issues/3832) | a 7-turn coil (centre diameter 80, wire 1 mm, pitch -2 so it winds downward) cut from a cylinder that holds it entirely (boolean Cut: no result) | analytic | pass | pass |
| sweeps/3862-coil-square-wire-outside-the-diameter | [tangency-labs/solidcraft#3862](https://github.com/tangency-labs/solidcraft/issues/3862) [tangency-labs/solidcraft#3915](https://github.com/tangency-labs/solidcraft/issues/3915) | a clockwise 5-turn coil of 4 mm square wire placed outside a 40 mm diameter, pitch 8 (the section, position and direction parameters) | analytic | pass | pass |
| sweeps/3897-sweep-ring-along-a-short-arc-joined-to-a-collar | [tangency-labs/solidcraft#3897](https://github.com/tangency-labs/solidcraft/issues/3897) | a ring profile (radii 79.815 and 78.285) swept along a 22.5 degree arc of radius 94.815 whose start is at the ring centre, joined to a ring-shaped collar under the profile (froze at "Computing") | analytic | pass | pass |
| sweeps/3936-loft-join-circle-to-rectangle-on-a-cylinder | [tangency-labs/solidcraft#3936](https://github.com/tangency-labs/solidcraft/issues/3936) | a loft from the circle on top of a cylinder (r 10, height 15) to a 40 x 30 rectangle 30 mm above, joined to the cylinder (builds as a new body in 2 ms, the join never returns) | invariants | **HANG**: no result after 180 s | pass |
| sweeps/396-loft-join-standing-on-a-box-face | [tangency-labs/solidcraft#396](https://github.com/tangency-labs/solidcraft/issues/396) [tangency-labs/solidcraft#577](https://github.com/tangency-labs/solidcraft/issues/577) | a conical loft standing on a box top face, joined to the box (one body reported, two touching shells in the result) | analytic | pass | pass |
| sweeps/4007-revolve-half-disc-horn-torus-270-degrees | [tangency-labs/solidcraft#4007](https://github.com/tangency-labs/solidcraft/issues/4007) | the half disc of radius 14 on the far side of a diameter 14 mm from the axis (the full circle would touch the axis: a horn torus) revolved 270 degrees | analytic | pass | pass |
| sweeps/4008-symmetric-revolve-cut-end-faces-in-the-side-face | [tangency-labs/solidcraft#4008](https://github.com/tangency-labs/solidcraft/issues/4008) | a 7 x 21 rectangle 2.6 mm from a block vertical edge revolved as a symmetric 180 degree cut about that edge: both end faces of the tool lie in the block left face (refused as "could not be computed reliably") | analytic | **FAIL**: step 6 (solid.revolve): the cut could not be computed reliably: it would change the body away from the tool, at (-0.924, 12.796, 2.000) (outside the tool's regi | pass |
| sweeps/4056-surface-loft-rails-straight-section-in-a-rail-plane-bow-to-stern | [tangency-labs/solidcraft#4056](https://github.com/tangency-labs/solidcraft/issues/4056) [tangency-labs/solidcraft#4080](https://github.com/tangency-labs/solidcraft/issues/4080) | a surface loft between a vertical line on XZ (bow) and a slanted line in the plane x = 100 (stern), bow to stern, guided by a keel rail lying in the bow sketch plane and a sheer rail at z = 20 (refused: "a guide rail crosses section 2's plane") | analytic | pass | pass |
| sweeps/4056-surface-loft-rails-straight-section-in-a-rail-plane-stern-to-bow | [tangency-labs/solidcraft#4056](https://github.com/tangency-labs/solidcraft/issues/4056) [tangency-labs/solidcraft#4080](https://github.com/tangency-labs/solidcraft/issues/4080) | a surface loft between a vertical line on XZ (bow) and a slanted line in the plane x = 100 (stern), stern to bow, guided by a keel rail lying in the bow sketch plane and a sheer rail at z = 20 (refused: "a guide rail crosses section 2's plane") | analytic | **FAIL**: step 13 (surface.loft): invalid input: a guide rail crosses section 2's plane 100.000 mm from its curves: a rail has to pass through every section | **FAIL**: step 13 (surface.loft): invalid input: a guide rail crosses section 2's plane 100.000 mm from its curves: a rail has to pass through every section |
| sweeps/443-loft-intersect-cone-meets-wall-below-top | [tangency-labs/solidcraft#443](https://github.com/tangency-labs/solidcraft/issues/443) | a cylinder (r 35, h 10) intersected with a conical loft (r 45 at z = -1 to r 33 at z = 11) that crosses its wall 1 mm below the top face (body came back unchanged) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([-34.0, 7.915749896921301e-14, 10.0]) to Some([34 (want ok) | pass |
| sweeps/450-revolve-spherical-shell-sketched-off-the-origin | [tangency-labs/solidcraft#450](https://github.com/tangency-labs/solidcraft/issues/450) [tangency-labs/solidcraft#452](https://github.com/tangency-labs/solidcraft/issues/452) | a half ring between two arcs (both radial lines on the axis) revolved a full turn from a sketch plane 10 mm above the origin (volume +34 %) | analytic | **CRASH**: process exited (signal: 11 (SIGSEGV) (core dumped)) without a result: | **FAIL**: shells Body1: 2 (want 1); record_valid the operation failed: lumps: cannot mesh a complete shell boundary (want ok); smlib_check the operation failed: lumps: cannot mesh a complete shell boundary (want ok); volume_mm3 294558.478017 (want 241560.724326) |
| sweeps/487-cut-disc-by-revolved-adjacent-profiles | [tangency-labs/solidcraft#487](https://github.com/tangency-labs/solidcraft/issues/487) [tangency-labs/solidcraft#490](https://github.com/tangency-labs/solidcraft/issues/490) | a disc cut by the body made from two adjacent profiles revolved on the axis, around the disc flat end | analytic | pass | pass |
| sweeps/487-revolve-two-adjacent-profiles-on-the-axis | [tangency-labs/solidcraft#487](https://github.com/tangency-labs/solidcraft/issues/487) [tangency-labs/solidcraft#490](https://github.com/tangency-labs/solidcraft/issues/490) | two rectangles sharing an edge, both resting on the axis, revolved together (zero-area faces along the axis) | analytic | pass | pass |
| sweeps/494-extrude-the-flange-face-of-a-fresh-revolve | [tangency-labs/solidcraft#726](https://github.com/tangency-labs/solidcraft/issues/726) [tangency-labs/solidcraft#494](https://github.com/tangency-labs/solidcraft/issues/494) [tangency-labs/solidcraft#2114](https://github.com/tangency-labs/solidcraft/issues/2114) | the flange top annulus of a freshly revolved hub (z = 6, r 18..30) picked by a point and extruded 5 mm (the pick found a third of the face: "the selected planar face no longer exists") | analytic | pass | pass |
| sweeps/561-extrude-the-end-face-of-a-loft | [tangency-labs/solidcraft#561](https://github.com/tangency-labs/solidcraft/issues/561) [tangency-labs/solidcraft#677](https://github.com/tangency-labs/solidcraft/issues/677) | the small end face of a square-to-square loft (40 mm side to 20 mm over 40 mm) extruded 10 mm (loft faces had no attachable source) | analytic | pass | pass |
| sweeps/561-extrude-the-end-face-of-a-sweep | [tangency-labs/solidcraft#561](https://github.com/tangency-labs/solidcraft/issues/561) [tangency-labs/solidcraft#677](https://github.com/tangency-labs/solidcraft/issues/677) | the end cap of a mitred swept bar (8 x 5 section, 30 up then 40 across) extruded 6 mm further along the path | analytic | **FAIL**: shells Bar: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok) | not supported yet: step 8 (solid.sweep): not supported yet: SMLib sweep along a path with corners (SMLib's sweep follows smooth paths) |
| sweeps/561-extrude-the-start-face-of-a-coil | [tangency-labs/solidcraft#561](https://github.com/tangency-labs/solidcraft/issues/561) [tangency-labs/solidcraft#677](https://github.com/tangency-labs/solidcraft/issues/677) | the start face of a 3-turn square-wire coil (4 mm wire, pitch 8, centre diameter 40) extruded 5 mm | analytic | pass | pass |
| sweeps/726-revolve-full-turn-planar-faces-whole | [tangency-labs/solidcraft#726](https://github.com/tangency-labs/solidcraft/issues/726) [tangency-labs/solidcraft#1687](https://github.com/tangency-labs/solidcraft/issues/1687) | a flanged hub profile (six edges, none on the axis) revolved a full turn: the planar faces must come out whole, not as three patches | analytic | pass | pass |
| sweeps/726-revolve-partial-turn-planar-faces-whole | [tangency-labs/solidcraft#726](https://github.com/tangency-labs/solidcraft/issues/726) [tangency-labs/solidcraft#1718](https://github.com/tangency-labs/solidcraft/issues/1718) | the same flanged hub profile revolved 240 degrees: its planar faces (three annular sectors and two end faces) must come out whole | analytic | pass | pass |
| sweeps/757-surface-loft-ruled-strip-between-two-lines | [tangency-labs/solidcraft#757](https://github.com/tangency-labs/solidcraft/issues/757) [tangency-labs/solidcraft#847](https://github.com/tangency-labs/solidcraft/issues/847) | a surface loft between the line (0,0,0)-(10,0,0) and the line (0,0,20)-(10,6,20): a ruled (bilinear) strip | analytic | pass | pass |
| sweeps/757-surface-revolve-line-cone-frustum-sheet | [tangency-labs/solidcraft#757](https://github.com/tangency-labs/solidcraft/issues/757) [tangency-labs/solidcraft#824](https://github.com/tangency-labs/solidcraft/issues/824) | a line from (5,0) to (10,20) revolved a full turn into a surface body (a cone frustum wall, no caps) | analytic | pass | pass |
| sweeps/757-surface-sweep-slanted-line-round-a-quarter-arc | [tangency-labs/solidcraft#757](https://github.com/tangency-labs/solidcraft/issues/757) [tangency-labs/solidcraft#843](https://github.com/tangency-labs/solidcraft/issues/843) | a slanted line (from (20,0,0) to (30,0,10)) swept as a surface round a quarter circle of radius 20 about Z | analytic | pass | pass |
| sweeps/771-sweep-end-scale-cone-frustum | [tangency-labs/solidcraft#771](https://github.com/tangency-labs/solidcraft/issues/771) [tangency-labs/solidcraft#1269](https://github.com/tangency-labs/solidcraft/issues/1269) | a circle of radius 5 swept 30 mm along a straight path with end scale 2 | analytic | **FAIL**: faces 4 (want 3) | not supported yet: step 7 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/771-sweep-one-guide-rail-cone-frustum | [tangency-labs/solidcraft#771](https://github.com/tangency-labs/solidcraft/issues/771) [tangency-labs/solidcraft#1806](https://github.com/tangency-labs/solidcraft/issues/1806) | a circle of radius 5 swept 20 mm up a straight path with one guide rail from its point (5,0,0) to (10,0,20) | analytic | pass | not supported yet: step 10 (solid.sweep): not supported yet: SMLib sweep along guide rails |
| sweeps/771-sweep-two-guide-rails-cone-frustum | [tangency-labs/solidcraft#771](https://github.com/tangency-labs/solidcraft/issues/771) [tangency-labs/solidcraft#1806](https://github.com/tangency-labs/solidcraft/issues/1806) | a circle of radius 5 swept 20 mm up a straight path between two guide rails from (5,0,0) to (10,0,20) and from (-5,0,0) to (-10,0,20) | analytic | pass | not supported yet: step 11 (solid.sweep): not supported yet: SMLib sweep along guide rails |
| sweeps/793-coil-cut-by-a-box-above-a-plane | [tangency-labs/solidcraft#793](https://github.com/tangency-labs/solidcraft/issues/793) | the same coil trimmed flat by cutting away everything above z = 12.5 with a box (trimming a coil to length) | analytic | **HANG**: no result after 180 s | **FAIL**: step 3 (solid.combine): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([13.434874451541004, 13.434916434571074, 12.499999999999998]) to Some([13.43487445154 |
| sweeps/793-coil-split-by-a-plane-across-its-axis | [tangency-labs/solidcraft#793](https://github.com/tangency-labs/solidcraft/issues/793) | a 6-turn coil (centre diameter 40, wire 2 mm, pitch 4) split by the plane z = 12.5 square to its axis ("boolean Intersect: no result") | analytic | **HANG**: no result after 180 s | **FAIL**: step 2 (solid.split_body): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([13.434874451540997, 13.434916434571077, 12.499999999999998]) to Some([13.43487445 |
| sweeps/844-join-two-overlapping-swept-arc-walls | [tangency-labs/solidcraft#844](https://github.com/tangency-labs/solidcraft/issues/844) | two swept walls (12 mm thick, 60 mm high) along concentric half circles of radius 50 and 58 turned 90 degrees apart, overlapping in thickness by 4 mm over a quarter turn and sharing the planes z = 0 and z = 60 (join gave an error, minutes, or an open body) | analytic | **FAIL**: shells WallA: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok) | **FAIL**: step 14 (solid.sweep): SMLib boolean: operation: SMLib failed (status 1006) |
| sweeps/881-loft-zigzag-pleat-vertex-pairing | [tangency-labs/solidcraft#881](https://github.com/tangency-labs/solidcraft/issues/881) [tangency-labs/solidcraft#956](https://github.com/tangency-labs/solidcraft/issues/956) | a ruled loft between two 18-vertex zig-zag sections with the same start vertex and winding, whose first-vertex direction is ambiguous from the section centroid | analytic | pass | pass |
| sweeps/96-loft-cut-box-sections-pad-first | [tangency-labs/solidcraft#122](https://github.com/tangency-labs/solidcraft/issues/122) [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | a loft cut through a 100 x 60 x 30 block from its whole 100 x 60 outline at z = 20 (edges flush with the side faces) down to a 10 x 10 pad in a corner at z = 11, sections given pad first (the cut panicked for one order) | analytic | **FAIL**: shells Basin: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); body_count 1 (want 2) | **FAIL**: step 8 (solid.loft): SMLib boolean: export: SMLib export: the mapped B-rep does not validate: portable B-rep: an open, wire or vertex shell lies in one region |
| sweeps/96-loft-cut-box-sections-top-first | [tangency-labs/solidcraft#122](https://github.com/tangency-labs/solidcraft/issues/122) [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | a loft cut through a 100 x 60 x 30 block from its whole 100 x 60 outline at z = 20 (edges flush with the side faces) down to a 10 x 10 pad in a corner at z = 11, sections given top first (the cut panicked for one order) | analytic | **FAIL**: shells Basin: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); body_count 1 (want 2) | **FAIL**: step 8 (solid.loft): SMLib boolean: export: SMLib export: the mapped B-rep does not validate: portable B-rep: an open, wire or vertex shell lies in one region |
| sweeps/96-shallow-loft-cut-starting-in-the-top-face | [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | a loft cut from a 556.68 x 99 rectangle on the top face of a 900 x 480 x 160 slab down 4 mm to an 80 x 80 square (a kernel panic in healing; the sides are about 0.9 degrees from horizontal) | analytic | pass | pass |
| sweeps/96-sweep-rectangle-round-a-mitred-corner | [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | an 8 x 5 rectangle swept along a path of a 30 mm vertical line and a 40 mm horizontal line meeting at a sharp corner (walls mitred) | analytic | pass | not supported yet: step 8 (solid.sweep): not supported yet: SMLib sweep along a path with corners (SMLib's sweep follows smooth paths) |
| sweeps/968-loft-hollow-elbow-60deg-5sections | [tangency-labs/solidcraft#968](https://github.com/tangency-labs/solidcraft/issues/968) [tangency-labs/solidcraft#1084](https://github.com/tangency-labs/solidcraft/issues/1084) | a bent tube (circles r 30 lofted through 5 sections along an R100 arc turning 60 degrees) with a bore (r 18, sections running 5 mm of arc past both ends) cut out of it: a hollow elbow ("no result" for some section counts, not their neighbours) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 1 (Some([100.0000000000009, 0.0, -17.999999999999996]) to (want ok) | pass |
| sweeps/968-loft-hollow-elbow-90deg-10sections | [tangency-labs/solidcraft#968](https://github.com/tangency-labs/solidcraft/issues/968) [tangency-labs/solidcraft#1084](https://github.com/tangency-labs/solidcraft/issues/1084) | a bent tube (circles r 30 lofted through 10 sections along an R100 arc turning 90 degrees) with a bore (r 18, sections running 5 mm of arc past both ends) cut out of it: a hollow elbow ("no result" for some section counts, not their neighbours) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([6.123235057019227e-15, 100.00000000000101, -18.0 (want ok) | pass |
| tessellation/1263-concave-arc-knife-edge-plate | [tangency-labs/solidcraft#1263](https://github.com/tangency-labs/solidcraft/issues/1263) | a plate with a concave quarter-round wall that meets the back face tangentially at a knife-edge tip (a box and a box less a cylinder, united): its display tessellation used to fail with 'boundary does not lie on the surface' before anything was filleted | analytic | pass | pass |
| tessellation/1615-crossed-lofted-tubes | [tangency-labs/solidcraft#1615](https://github.com/tangency-labs/solidcraft/issues/1615) [tangency-labs/solidcraft#1653](https://github.com/tangency-labs/solidcraft/issues/1653) | two lofted tubes that cross and are joined (the bike-frame case): the trimmed loft faces along the intersection curves used to mesh with a flat sheet across the tube and slivers inside it | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([-10.000000000000243, 5.32800127382499e-10, -9.99 (want ok); smlib_check the operation failed: pcurve of loop 0 use 0 (Some([-10.000000000000243, 5.32800127382499e-10, -9.99 (want ok) | pass |
| tessellation/1648-sphere-touches-box-edge-union | [tangency-labs/solidcraft#1648](https://github.com/tangency-labs/solidcraft/issues/1648) [tangency-labs/solidcraft#1850](https://github.com/tangency-labs/solidcraft/issues/1850) | a sphere that touches a box's bottom edge at one point: the union leaves a sliver face pinched to zero height, whose loop touches itself within tolerance, and it must still mesh | analytic | pass | pass |
| tessellation/1666-loft-18-gon-ruled-sides | [tangency-labs/solidcraft#1666](https://github.com/tangency-labs/solidcraft/issues/1666) [tangency-labs/solidcraft#1670](https://github.com/tangency-labs/solidcraft/issues/1670) | a loft between two 18-vertex polylines whose side faces are twisted ruled (bilinear) patches: each used to be exported as two flat triangles with crossing diagonals | analytic | pass | pass |
| tessellation/1666-loft-twisted-square | [tangency-labs/solidcraft#1666](https://github.com/tangency-labs/solidcraft/issues/1666) [tangency-labs/solidcraft#1670](https://github.com/tangency-labs/solidcraft/issues/1670) | a loft from a 20x20 square to the same square turned 45 degrees, 30 mm higher: its four side faces are strongly twisted ruled patches, the case a two-triangle mesh gets visibly wrong | analytic | pass | pass |
| tessellation/1753-bowl-rim-cut-by-cylinder | [tangency-labs/solidcraft#1753](https://github.com/tangency-labs/solidcraft/issues/1753) | a revolved bowl whose rim is cut by a large cylinder (R320, axis across the bowl): the cut edge is an intersection curve between the cylinder and the cone walls, whose two faces used to put different vertices on it, so the STL/3MF export had a 0.001 mm crack | analytic | **FAIL**: watertight Bowl: 3 open, 0 over-shared mesh edges (want no open edges) | pass |
| tessellation/1813-sphere-lens-thinner-than-tolerance | [tangency-labs/solidcraft#2712](https://github.com/tangency-labs/solidcraft/issues/2712) [tangency-labs/solidcraft#1813](https://github.com/tangency-labs/solidcraft/issues/1813) | a sphere whose centre lies on a box's top face, poking out of the box's side as a lens-shaped face thinner than the mesh tolerance; the face must still be meshed | analytic | pass | pass |
| tessellation/2069-chamfered-ring-notch-moved-far | [tangency-labs/solidcraft#2069](https://github.com/tangency-labs/solidcraft/issues/2069) | a 210-degree ring with a chamfered outer edge, notched through its chamfer cone and then moved 1000 mm: where the notch meets the cone the mesh used to leave a crack, and the measured volume then grew with the distance from the origin | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 0 (Some([1025.9229635399038, 2.0, 9.999999999999998]) to (want ok) | pass |
| tessellation/2528-stadium-joined-with-overlapping-cylinder | [tangency-labs/solidcraft#2528](https://github.com/tangency-labs/solidcraft/issues/2528) | a rounded slot (a box with a half-cylinder on each end) joined with a cylinder that overlaps one end: the cylinder walls meet along vertical seams and intersection edges, where wedge-shaped mis-tessellated facets showed up | analytic | pass | pass |
| tessellation/311-ramp-cut-cylinder-blank | [tangency-labs/solidcraft#311](https://github.com/tangency-labs/solidcraft/issues/311) | an inclined cut across a round blank, which used to pinch the cylindrical wall inward (a 4.4 mm chord deficit) in the display and STL mesh | analytic | pass | pass |
| tessellation/466-revolved-cone-tip-stays-smooth | [tangency-labs/solidcraft#466](https://github.com/tangency-labs/solidcraft/issues/466) | a six-line profile revolved a full turn about its first line, with a cone ending in a point: the tip came out with dents every 120 degrees instead of a smooth cone (rebuilt as a pencil-like profile with a collinear frustum and tip; the original design is not in the report) | analytic | pass | pass |
| tessellation/784-stl-open-edges-filleted-and-drilled | [tangency-labs/solidcraft#784](https://github.com/tangency-labs/solidcraft/issues/784) [tangency-labs/solidcraft#811](https://github.com/tangency-labs/solidcraft/issues/811) | two bodies whose STL export used to have open edges where faces were meshed apart: a 40x30x20 box with all twelve edges rounded 2 mm, and a cylinder R15 x 20 with a coaxial 6 mm bore | analytic | pass | **FAIL**: watertight RoundedBox: 0 open, 8 over-shared mesh edges (want no open edges); record_valid the operation failed: pcurve of loop 0 use 2 (Some([2.0, 30.0, 2.0]) to Some([0.0, 28.0, 2.0])): the (want ok); smlib_check the operation failed: pcurve of loop 0 use 2 (Some([2.0, 30.0, 2.0]) to Some([0.0, 28.0, 2.0])): the (want ok) |
| tessellation/818-blind-hole-splits-vertical-edges | [tangency-labs/solidcraft#818](https://github.com/tangency-labs/solidcraft/issues/818) | a blind hole cut into a ring whose six concave corners are filleted: the cut used to split every vertical edge (the outer seam and all twelve fillet tangent edges) at the hole's depth, and the fillet corners drew black | analytic | pass | pass |
| tessellation/819-cup-pocket-splits-wall-seam | [tangency-labs/solidcraft#819](https://github.com/tangency-labs/solidcraft/issues/819) [tangency-labs/solidcraft#921](https://github.com/tangency-labs/solidcraft/issues/921) | a disc with a pocket that splits the outer cylinder wall's seam edges at the pocket floor: the wall used to be meshed with fans cutting through the disc, so the measured volume and the STL read too small | analytic | pass | pass |
| threads/1250-external-m10x1.5-shaft-full-length | [tangency-labs/solidcraft#1250](https://github.com/tangency-labs/solidcraft/issues/1250) | a modelled external M10 thread over the whole length of a 10 mm shaft (8 turns) | analytic | **FAIL**: smlib_check SMLib check: 6 failed tests: SmEdgeuse::Test #11 Bad UVTrimCurve: Edgeuse->UVTrimCurve has zero leng (want ok) | **FAIL**: step 2 (solid.thread): SMLib boolean: SMLib's check refuses the result: 2 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partially |
| threads/1395-long-external-m6-thread-24-turns | [tangency-labs/solidcraft#1395](https://github.com/tangency-labs/solidcraft/issues/1395) | a long modelled external thread: M6 over a 24 mm shaft (24 turns), the kind that once ran out of depth in the boolean | analytic | **FAIL**: smlib_check SMLib check: 40 failed tests: SmLoop::Test #2 Bad Loop Orient: A UpperLoopuse->Edgeuse's 'Inside' is (want ok) | **FAIL**: step 2 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([-1.738532668045337, 1.7385379467804876, -2.949029909160572e-17]) to Some([-1.73853839 |
| threads/1443-m5x0.7-thread-in-5mm-hole | [tangency-labs/solidcraft#1443](https://github.com/tangency-labs/solidcraft/issues/1443) [tangency-labs/solidcraft#3060](https://github.com/tangency-labs/solidcraft/issues/3060) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass | pass |
| threads/1995-m8x1-thread-in-7mm-hole | [tangency-labs/solidcraft#1995](https://github.com/tangency-labs/solidcraft/issues/1995) | an M8x1 modelled thread in a 7 mm hole through a block (the report: the thread also changed the block's outer surface and made too many faces) | analytic | **FAIL**: smlib_check SMLib check: 45 failed tests: SmEdgeuse::Test #11 Bad UVTrimCurve: Edgeuse->UVTrimCurve has zero len (want ok) | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([2.862740053704183, 2.0136333789738825, 1.4963877373859766]) to Some([-2.8627400537041 |
| threads/2038-cut-threaded-stud-from-bored-block | [tangency-labs/solidcraft#2038](https://github.com/tangency-labs/solidcraft/issues/2038) | cutting an externally threaded stud out of a block bored at the tap drill (to make the internal thread): the boolean found no result | analytic | **HANG**: no result after 180 s | **FAIL**: step 4 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([6.735685053790036, 6.735671302570509, -5.000000000000002]) to Some([4.018069973126635 |
| threads/2038-internal-then-external-thread-on-one-body | [tangency-labs/solidcraft#2038](https://github.com/tangency-labs/solidcraft/issues/2038) | two modelled threads on one body, an internal one then an external one (the second was refused: no cylindrical face there to thread) | analytic | **HANG**: no result after 180 s | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 4 (Some([-2.583065773355961, 6.236083486130154, -3.382710778154774e-17]) to Some([0.6966280122 |
| threads/2038-join-two-threaded-bodies | [tangency-labs/solidcraft#2038](https://github.com/tangency-labs/solidcraft/issues/2038) | joining a body with an internal modelled thread to one with an external modelled thread, touching in a plane (the join ran for over ten minutes) | analytic | **HANG**: no result after 180 s | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 4 (Some([-2.583065773355961, 6.236083486130154, -3.382710778154774e-17]) to Some([0.6966280122 |
| threads/2115-tapped-hole-drill-is-major-minus-pitch | [tangency-labs/solidcraft#3311](https://github.com/tangency-labs/solidcraft/issues/3311) [tangency-labs/solidcraft#2115](https://github.com/tangency-labs/solidcraft/issues/2115) [tangency-labs/solidcraft#2367](https://github.com/tangency-labs/solidcraft/issues/2367) [tangency-labs/solidcraft#2440](https://github.com/tangency-labs/solidcraft/issues/2440) [tangency-labs/solidcraft#2441](https://github.com/tangency-labs/solidcraft/issues/2441) | tapped holes (Hole with a thread size, no diameter) are drilled at the tap drill, not at the major diameter | analytic | pass | pass |
| threads/2152-m3x0.2-thread-in-3mm-hole | [tangency-labs/solidcraft#2152](https://github.com/tangency-labs/solidcraft/issues/2152) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass | pass |
| threads/2193-modelled-m33x3.5-thread | [tangency-labs/solidcraft#2193](https://github.com/tangency-labs/solidcraft/issues/2193) [tangency-labs/solidcraft#2263](https://github.com/tangency-labs/solidcraft/issues/2263) [tangency-labs/solidcraft#4153](https://github.com/tangency-labs/solidcraft/issues/4153) | a modelled M33x3.5 thread, a size the thread menu lacked (designation typed by hand), on a 33 mm shaft (4 turns) | analytic | **FAIL**: smlib_check SMLib check: 6 failed tests: SmEdgeuse::Test #11 Bad UVTrimCurve: Edgeuse->UVTrimCurve has zero leng (want ok) | **FAIL**: step 2 (solid.thread): SMLib boolean: SMLib's check refuses the result: 3 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partially |
| threads/2209-fine-m44x1-thread-on-shaft | [tangency-labs/solidcraft#2209](https://github.com/tangency-labs/solidcraft/issues/2209) | a fine modelled thread on a large shaft (M44x1 on a 44 mm shaft, 4 turns), which once cut about 9% too much | analytic | **HANG**: no result after 180 s | **FAIL**: step 2 (solid.thread): SMLib boolean: SMLib's check refuses the result: 1 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partially |
| threads/2209-m44x1.5-thread-on-flange-hub | [tangency-labs/solidcraft#2209](https://github.com/tangency-labs/solidcraft/issues/2209) | a full-diameter M44x1.5 modelled thread on the hub of a flange, which once failed to rebuild a closed shell | analytic | **FAIL**: smlib_check SMLib check: 351 failed tests: SmEdgeuse::Test #11 Bad UVTrimCurve: Edgeuse->UVTrimCurve has zero le (want ok) | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([17.993100249475514, 12.658923469723806, 12.61506452654108]) to Some([-17.993100249475 |
| threads/2369-m8-thread-in-6.3mm-hole-refused | [tangency-labs/solidcraft#2369](https://github.com/tangency-labs/solidcraft/issues/2369) [tangency-labs/solidcraft#2688](https://github.com/tangency-labs/solidcraft/issues/2688) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass | pass |
| threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole | [tangency-labs/solidcraft#2406](https://github.com/tangency-labs/solidcraft/issues/2406) | an M8 modelled thread in a 6.8 mm pilot hole (the case where the thread 'was not visible') | analytic | **FAIL**: smlib_check SMLib check: 19 failed tests: SmLoop::Test #2 Bad Loop Orient: A UpperLoopuse->Edgeuse's 'Inside' is (want ok) | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([-2.780947480741209, -1.9561009967174812, 1.2599347416400593]) to Some([2.780947480741 |
| threads/2526-three-modelled-threads-in-one-body | [tangency-labs/solidcraft#2526](https://github.com/tangency-labs/solidcraft/issues/2526) | three modelled threads, internal and external, in one body with a hub and a plain hole beside the bore (each thread used to facet the rest of the part and the next thread was refused) | analytic | **FAIL**: step 6 (solid.thread): no cylindrical face there to thread | **FAIL**: step 5 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([-3.4104950138828145, -2.089969146215104, 30.000000000000007]) to Some([-0.93378481328 |
| threads/2705-m14-thread-on-14.6mm-shaft-refused | [tangency-labs/solidcraft#2705](https://github.com/tangency-labs/solidcraft/issues/2705) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a shaft that isn't the thread's size: refused with the size to use, never a silent change of the shaft | analytic | pass | pass |
| threads/2822-modelled-thread-in-filleted-cube | [tangency-labs/solidcraft#2822](https://github.com/tangency-labs/solidcraft/issues/2822) | a modelled M3 thread in a hole through a block whose vertical edges are rounded (the fillets showed as black lines after the thread) | analytic | **FAIL**: smlib_check SMLib check: 173 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partia (want ok) | **FAIL**: step 7 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([11.022407162037219, 10.719154778204942, 0.24820214174911687]) to Some([8.994053254378 |
| threads/2969-m48x0.75-thread-in-48mm-hole | [tangency-labs/solidcraft#2969](https://github.com/tangency-labs/solidcraft/issues/2969) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass | pass |
| threads/3311-two-tapped-holes-both-modelled-threaded | [tangency-labs/solidcraft#3311](https://github.com/tangency-labs/solidcraft/issues/3311) | a second modelled thread on the same body (the first thread faceted every other hole), over each hole's full length | analytic | **FAIL**: step 5 (solid.thread): no cylindrical face there to thread | **FAIL**: step 4 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([10.956692141520428, 12.309678320897202, 2.0383000842727483e-17]) to Some([9.043311931 |
| threads/3366-m20-thread-in-20mm-hole | [tangency-labs/solidcraft#3366](https://github.com/tangency-labs/solidcraft/issues/3366) [tangency-labs/solidcraft#3367](https://github.com/tangency-labs/solidcraft/issues/3367) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass | pass |
| threads/3368-faceted-prism-pocket-cut-and-boss-join | [tangency-labs/solidcraft#3368](https://github.com/tangency-labs/solidcraft/issues/3368) | booleans of a finely faceted body (a 1200-sided prism, 1202 flat faces, the kind of body a modelled thread leaves) with box tools: they must finish in bounded time with the exact result, not run for minutes | analytic | pass | pass |
| threads/3368-faceted-prism-with-bore-and-cross-hole | [tangency-labs/solidcraft#3368](https://github.com/tangency-labs/solidcraft/issues/3368) | a finely faceted body (a 1200-sided prism) with a curved partner: a vertical bore and a horizontal cross hole drilled through it (the case where the B-rep ladder is bounded but must still decide) | analytic | **FAIL**: record_valid the operation failed: pcurve of loop 0 use 57 (Some([-29.89940005346547, -2.453604579473993, 3.27378 (want ok); smlib_check the operation failed: pcurve of loop 0 use 57 (Some([-29.89940005346547, -2.453604579473993, 3.27378 (want ok); volume_mm3 26829.949748 (want 25792.3465); bbox.min [-30.34151, -30, 0] (want [-30, -30, 0]) | pass |
| threads/3368-two-faceted-prisms-cut-then-joined | [tangency-labs/solidcraft#3368](https://github.com/tangency-labs/solidcraft/issues/3368) | two finely faceted bodies (1000-sided prisms, flat faces only): a faceted stud cut out of a faceted disc, then a faceted cap joined on top touching in a plane; both booleans must finish in bounded time with the exact result | analytic | pass | **HANG**: no result after 180 s |
| threads/3914-sketch-on-top-face-of-threaded-rounded-block | [tangency-labs/solidcraft#3914](https://github.com/tangency-labs/solidcraft/issues/3914) | Create Sketch on the top face of a block with a modelled thread and rounded corners, then a boss from it | analytic | **FAIL**: step 5 (sketch.create): invalid parameters for `sketch.create`: face capture work limit exceeded; use an exact body and face index | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([7.955185675925581, 8.561690443590084, 0.9964288343534452]) to Some([12.04481432407442 |
| threads/3952-modelled-thread-in-blind-hole-of-revolved-ring | [tangency-labs/solidcraft#3952](https://github.com/tangency-labs/solidcraft/issues/3952) | a modelled thread in a small blind hole drilled into a revolved ring, off its axis ('faceted boolean: inconsistent volumes') | analytic | **FAIL**: smlib_check SMLib check: 269 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partia (want ok) | **FAIL**: step 9 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([20.516265215511172, -1.0755765706655467, 22.0]) to Some([19.994014397500948, -0.74195 |
| threads/4149-internal-thread-below-counterbore-filleted-rim | [tangency-labs/solidcraft#4149](https://github.com/tangency-labs/solidcraft/issues/4149) | a modelled M10x1.5 internal thread, full length of the bore below a counterbore, in a cylinder with its rim rounded (stack overflow) | analytic | **FAIL**: smlib_check SMLib check: 117 failed tests: SmLoop::Test #2 Bad Loop Orient: A UpperLoopuse->Edgeuse's 'Inside' i (want ok) | **FAIL**: step 4 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([1.9133830447635627, 4.619347644845553, -3.469446951953614e-18]) to Some([-1.913372921 |
| threads/602-fillet-hex-head-beside-modelled-thread | [tangency-labs/solidcraft#602](https://github.com/tangency-labs/solidcraft/issues/602) [tangency-labs/solidcraft#618](https://github.com/tangency-labs/solidcraft/issues/618) | rounding the top edges of a hex head on a shaft with a modelled thread (it froze the app) | analytic | **FAIL**: smlib_check SMLib check: 35 failed tests: SmLoop::Test #2 Bad Loop Orient: A UpperLoopuse->Edgeuse's 'Inside' is (want ok) | **FAIL**: step 9 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([2.5000000000000018, -3.353876639995629e-15, 0.24997448866668603]) to Some([-0.9560955 |
| threads/995-m5-thread-in-5mm-hole | [tangency-labs/solidcraft#995](https://github.com/tangency-labs/solidcraft/issues/995) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass | pass |
| Case | Sources | What went wrong | Answer | Result |
|---|---|---|---|---|
| booleans/1107-join-hollow-hub-with-nine-blades | [tangency-labs/solidcraft#1107](https://github.com/tangency-labs/solidcraft/issues/1107) | a hollow hub (tube r 21.5..23) joined with nine disjoint blades whose roots lie wholly in the wall: one valid solid, the cavity stays the hub's. Blades here are r1 round bars (the report's are lofted fan blades) | analytic | pass |
| booleans/114-extrude-join-on-curved-body-coincident-wall | [tangency-labs/solidcraft#114](https://github.com/tangency-labs/solidcraft/issues/114) | extruding a profile onto a cylinder with zero taper: the new wall is the old wall continued (coincident cylindrical faces), join failed | analytic | pass |
| booleans/1140-hollow-lofted-tube-cut-in-half-and-joined | [tangency-labs/solidcraft#1140](https://github.com/tangency-labs/solidcraft/issues/1140) | a spiral round tube (radius growing 76 to 210 mm over one turn, 12 mm wall) built as 8 lofted bands, each minus a lofted bore, cut in half through the axis plane z=0 and the halves joined: must give one body | invariants | pass |
| booleans/1195-text-cut-into-plate | [tangency-labs/solidcraft#1195](https://github.com/tangency-labs/solidcraft/issues/1195) | text cut into a plate: a boundary curve's end meeting a point whatever its parameter (glyph outlines through a text cut) | invariants | pass |
| booleans/1279-cut-with-tool-cylinder-coaxial-with-hole | [tangency-labs/solidcraft#1279](https://github.com/tangency-labs/solidcraft/issues/1279) | a corner piece (square column minus a quarter disc r1.5, 0.0003 off the axis) cut out of a part with a blind r1.6 hole on the same axis: the tool's r1.5 face sits 0.1 mm inside the hole wall; 'no result' | analytic | **FAIL**: step 4 (solid.cylinder): SMLib boolean: SMLib's check refuses the result: 6 failed tests: SmFace::Test #33 Face has Coincident Edges: Face has Coincident Edges. |
| booleans/13-split-body-by-a-plane | [tangency-labs/solidcraft#13](https://github.com/tangency-labs/solidcraft/issues/13) | split a body by a plane (the split-by-a-face path tripped a debug assertion, 'Two same vertices cannot construct an edge') | analytic | pass |
| booleans/1355-concentric-hole-through-drilled-recess | [tangency-labs/solidcraft#1355](https://github.com/tangency-labs/solidcraft/issues/1355) [tangency-labs/solidcraft#1736](https://github.com/tangency-labs/solidcraft/issues/1736) | a drilled O8.5 recess (118 deg drill point) in a plate, then a O4 hole through its centre: the second cut 'does not work' | analytic | pass |
| booleans/1647-box-cylinder-general-intersect | [tangency-labs/solidcraft#1647](https://github.com/tangency-labs/solidcraft/issues/1647) | a box and a cylinder in general position (nothing coincident or tangent): Intersect refused as an implausible volume | analytic | pass |
| booleans/1649-crossing-cylinders-union-far-from-origin | [tangency-labs/solidcraft#1649](https://github.com/tangency-labs/solidcraft/issues/1649) | union of two crossing cylinders, both moved (1000,-700,300) mm: volume lost with position | analytic | pass |
| booleans/168-rim-touching-coin-along-a-circle-only | [tangency-labs/solidcraft#168](https://github.com/tangency-labs/solidcraft/issues/168) | a rim on a coin's top face that meets the coin along one circle only (no shared area, no shared volume): it must not be joined into it | analytic | **FAIL**: shells Coin: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); body_count 1 (want 2) |
| booleans/1717-two-overlapping-sphere-cuts | [tangency-labs/solidcraft#1717](https://github.com/tangency-labs/solidcraft/issues/1717) [tangency-labs/solidcraft#2158](https://github.com/tangency-labs/solidcraft/issues/2158) | a second sphere cut overlapping an earlier sphere cut on a box edge: 'no result' | analytic | pass |
| booleans/1730-cut-short-of-far-face-keeps-skin | [tangency-labs/solidcraft#1730](https://github.com/tangency-labs/solidcraft/issues/1730) | an extrude cut whose profile stops 0.25 mm short of a wall's far face must leave that skin (it was grown through) | analytic | pass |
| booleans/1858-shallow-cuts-after-earlier-pocket | [tangency-labs/solidcraft#1765](https://github.com/tangency-labs/solidcraft/issues/1765) [tangency-labs/solidcraft#1858](https://github.com/tangency-labs/solidcraft/issues/1858) | two 1.5 mm circular cuts overlapping an earlier 0.75 mm pocket (timeline roll-back, insert, redefine): the cut came out empty | analytic | pass |
| booleans/1865-tube-and-sector-meeting-along-cylinder-walls | [tangency-labs/solidcraft#1865](https://github.com/tangency-labs/solidcraft/issues/1865) [tangency-labs/solidcraft#1910](https://github.com/tangency-labs/solidcraft/issues/1910) [tangency-labs/solidcraft#1983](https://github.com/tangency-labs/solidcraft/issues/1983) [tangency-labs/solidcraft#2034](https://github.com/tangency-labs/solidcraft/issues/2034) | a union of two solids that meet along cylindrical faces: a tube (r10..12, z 0..20) and a 90 deg ring sector (same radii, z 10..30) whose curved faces are the tube's own, overlapping it axially; refused ('planar faces only') or, by the faceted fallback, left 1710 faceted faces | analytic | pass |
| booleans/1910-coaxial-cylinders-intersect | [tangency-labs/solidcraft#1910](https://github.com/tangency-labs/solidcraft/issues/1910) [tangency-labs/solidcraft#1865](https://github.com/tangency-labs/solidcraft/issues/1865) | intersection of two cylinders of one radius on one axis (z 0..30 and 22..46) whose round sides lie in each other over the shared 8 mm | analytic | pass |
| booleans/1927-delete-pocket-face-restores-plate | [tangency-labs/solidcraft#1927](https://github.com/tangency-labs/solidcraft/issues/1927) | Delete Face on the 0.5 mm deep O15 recess of a plate: the face around the gap must keep its surface | analytic | pass |
| booleans/1949-extrude-side-drawn-in-collinear-pieces | [tangency-labs/solidcraft#1949](https://github.com/tangency-labs/solidcraft/issues/1949) | a profile side drawn as two collinear lines extrudes into one flat face, not two with an edge between them | analytic | pass |
| booleans/1949-tapered-extrude-side-in-collinear-pieces | [tangency-labs/solidcraft#1949](https://github.com/tangency-labs/solidcraft/issues/1949) | with a taper too, a side drawn in two collinear pieces is one face | analytic | pass |
| booleans/1984-near-coaxial-pin-overlaps-bore-wall | [tangency-labs/solidcraft#1984](https://github.com/tangency-labs/solidcraft/issues/1984) | the overlap of a pin 0.00056 mm off the axis of a bore of its own radius (r=3, 9.65 long): a thin crescent. The report's STEP round trip is left out; this is the geometry | analytic | pass |
| booleans/1984-rivet-with-flush-heads-a-hair-off-its-hole | [tangency-labs/solidcraft#1984](https://github.com/tangency-labs/solidcraft/issues/1984) | a rivet (shank r=2, heads r=4 flat on both faces of a 1.5 mm sheet) 0.004 mm off the axis of its hole: overlap with the sheet is the shank's crescent; the heads touch the sheet faces over an area but add no volume | analytic | pass |
| booleans/2003-mirror-feature-join-flush-with-mirror-plane | [tangency-labs/solidcraft#2003](https://github.com/tangency-labs/solidcraft/issues/2003) | mirror a feature with Join: the image meets its original along the mirror plane and the join was refused for its volume | analytic | pass |
| booleans/2008-coaxial-cylinders-join-one-wall | [tangency-labs/solidcraft#2008](https://github.com/tangency-labs/solidcraft/issues/2008) [tangency-labs/solidcraft#1986](https://github.com/tangency-labs/solidcraft/issues/1986) | a join of coaxial cylinders of one radius whose walls overlap leaves one cylindrical wall in one face (it came out as a stack of faces, so a later chamfer on its top edge refused) | analytic | pass |
| booleans/2055-countersink-holes-from-several-sketch-points | [tangency-labs/solidcraft#2055](https://github.com/tangency-labs/solidcraft/issues/2055) | a countersunk hole at two sketch points at once, in a design with several bodies: 'there is no body to cut or intersect' (one point works) | analytic | pass |
| booleans/2076-rectangular-pattern-of-cylinder-join | [tangency-labs/solidcraft#2076](https://github.com/tangency-labs/solidcraft/issues/2076) | a rectangular pattern of a cylinder join (pin-fin plate) scales quadratically in time | analytic | pass |
| booleans/2464-extrude-join-leaves-hidden-body-alone | [tangency-labs/solidcraft#2464](https://github.com/tangency-labs/solidcraft/issues/2464) [tangency-labs/solidcraft#2465](https://github.com/tangency-labs/solidcraft/issues/2465) | an Extrude Join onto a plate with a hidden coincident copy: the hidden body must not be joined in | analytic | **FAIL**: body_count 1 (want 2); volume_mm3 8816 (want 16816) |
| booleans/2524-circular-pattern-of-bore-cut | [tangency-labs/solidcraft#2524](https://github.com/tangency-labs/solidcraft/issues/2524) | a circular pattern (count 2, 360 deg, about Y) of a cut made off-axis: 'boolean Cut: no result' | analytic | pass |
| booleans/2564-joined-side-run-wrapping-past-loop-start | [tangency-labs/solidcraft#2564](https://github.com/tangency-labs/solidcraft/issues/2564) [tangency-labs/solidcraft#1949](https://github.com/tangency-labs/solidcraft/issues/1949) | an extrude of an outline whose bottom side is drawn as two collinear pieces that wrap past the loop's first segment ((10,0)->(20,0) ... (0,0)->(10,0)): the bottom is one face | analytic | pass |
| booleans/2580-clip-round-small-hole-of-long-plate | [tangency-labs/solidcraft#2580](https://github.com/tangency-labs/solidcraft/issues/2580) [tangency-labs/solidcraft#2579](https://github.com/tangency-labs/solidcraft/issues/2579) | a 16 mm box cut out round a small (r 1.8) hole of a 3 m long, 2 mm plate keeps the hole in both faces | analytic | pass |
| booleans/2583-taper-side-drawn-in-collinear-pieces | [tangency-labs/solidcraft#2583](https://github.com/tangency-labs/solidcraft/issues/2583) | a tapered extrude of a 20x10 rectangle whose bottom side is drawn as two collinear pieces: the sloped side is one face | analytic | pass |
| booleans/2601-taper-with-start-offset | [tangency-labs/solidcraft#2601](https://github.com/tangency-labs/solidcraft/issues/2601) | a tapered extrude whose start is offset along the sketch normal (the app says: not supported yet: taper with two-sided, symmetric or offset extents) | analytic | pass |
| booleans/2754-taper-extrude-line-arc-corner | [tangency-labs/solidcraft#2754](https://github.com/tangency-labs/solidcraft/issues/2754) | a tapered extrude of a profile in which an arc meets a line at a corner (a half disc) | analytic | **FAIL**: step 5 (solid.extrude): SMLib extrude: SMLib's result is not a closed solid |
| booleans/2755-mirror-copy-keeps-seed-targets | [tangency-labs/solidcraft#2755](https://github.com/tangency-labs/solidcraft/issues/2755) | the mirror copy of a primitive cut changes only the seed's targets, not a body the seed was told to leave alone | analytic | pass |
| booleans/2755-pattern-copies-keep-seed-targets | [tangency-labs/solidcraft#2755](https://github.com/tangency-labs/solidcraft/issues/2755) | copies of a primitive cut made with a rectangular pattern change only the seed's targets, not a body the seed was told to leave alone | analytic | pass |
| booleans/2801-prism-edge-in-round-cornered-slab-end-face | [tangency-labs/solidcraft#2801](https://github.com/tangency-labs/solidcraft/issues/2801) | a join of a triangular prism and a thin slab with rounded corners (r 4.9) that share their bottom plane, the prism's edge in that plane lying in the slab's end face | analytic | **FAIL**: step 11 (solid.combine): SMLib boolean: SMLib's check refuses the result: 2 failed tests: SmTrimmingTools::Test #0 Edge/Edge Gap: Gap between edge endPoints exc |
| booleans/2810-taper-extrude-arcs-meeting-at-corners | [tangency-labs/solidcraft#2810](https://github.com/tangency-labs/solidcraft/issues/2810) [tangency-labs/solidcraft#2813](https://github.com/tangency-labs/solidcraft/issues/2813) | a tapered extrude of a loop of arcs on three circles meeting at sharp corners (a circle with a lobe on each side); the walls must meet at the corners | analytic | **FAIL**: faces 14 (want 6) |
| booleans/2826-cut-up-to-face-leaves-no-skin | [tangency-labs/solidcraft#2826](https://github.com/tangency-labs/solidcraft/issues/2826) [tangency-labs/solidcraft#2827](https://github.com/tangency-labs/solidcraft/issues/2827) | a cut that ends exactly in a face of its target (the plate's top face) must open the hole, not leave a zero-thickness skin over it | analytic | pass |
| booleans/2896-join-arm-end-into-ring-wall | [tangency-labs/solidcraft#2896](https://github.com/tangency-labs/solidcraft/issues/2896) | a join of a ring (R30/R24, 6 tall) and an arm with a convex R5 end whose tip runs 0.1 mm into the ring's outer wall (curved faces that nearly graze) | analytic | pass |
| booleans/2896-join-arm-end-near-ring-wall-gap | [tangency-labs/solidcraft#2896](https://github.com/tangency-labs/solidcraft/issues/2896) | a join of a ring and an arm whose R5 convex tip stops 0.01 mm short of the ring's outer wall: nothing overlaps, so nothing fuses | analytic | **FAIL**: shells Ring: 2 (want 1); body_count 1 (want 2) |
| booleans/2904-countersunk-hole-with-distant-body | [tangency-labs/solidcraft#2904](https://github.com/tangency-labs/solidcraft/issues/2904) | a countersunk hole in a small plate, near a rounded corner, while an unrelated body sits 120 mm away: only the plate may change, and the countersink must be complete | analytic | pass |
| booleans/2928-join-cap-touching-lips-with-offset-walls | [tangency-labs/solidcraft#2928](https://github.com/tangency-labs/solidcraft/issues/2928) | two half-annulus lips (r 4..5, from z=2 to 20) joined onto a stadium-ring base (z 0..2, r 3..5 arcs, centres 20 apart) with their cylinder walls 0.0001 mm off the base's: the lip cap touches the base top, leaving a 0.0001 mm crescent overhang. Layout is a hand-built variant of the PR's public reproduction | analytic | **FAIL**: volume_mm3 1066.017651 (want 769.468975) |
| booleans/3027-pin-seated-line-to-line-in-bore | [tangency-labs/solidcraft#3027](https://github.com/tangency-labs/solidcraft/issues/3027) | a pin (r4) seated line to line in a bore (r4, exactly coaxial) of a bush: the two cylinder walls coincide | analytic | pass |
| booleans/307-tangent-hole-contacts-ring-against-grid | [tangency-labs/solidcraft#307](https://github.com/tangency-labs/solidcraft/issues/307) | four pairs of through holes whose circles touch at exactly one point (ring holes at (+-25,0),(0,+-25) against grid holes at (+-15,0),(0,+-15)); the symmetric contacts must be treated alike and split no cylinder face | analytic | not supported yet: step 6 (solid.cylinder): SMLib boolean: export: SMLib export: not supported yet: a solid touching itself along an edge |
| booleans/308-blind-cut-ending-inside-a-cylinder | [tangency-labs/solidcraft#308](https://github.com/tangency-labs/solidcraft/issues/308) | a hinge leaf (40x30x3) with a joined r4 knuckle cylinder along X and a O4 pin hole, then a 3.3 mm blind cut of x 12..28, y 29..40 ending inside the cylinder: the result grew a sphere and a freeform face | analytic | pass |
| booleans/3092-ring-on-perforated-plate | [tangency-labs/solidcraft#3092](https://github.com/tangency-labs/solidcraft/issues/3092) [tangency-labs/solidcraft#2844](https://github.com/tangency-labs/solidcraft/issues/2844) | a ring (r 19.6/20.8, 20 tall) joined onto the top of an 80x80x1.2 plate with a 9x9 grid of 6.4 mm square holes: the ring's foot crosses many hole edges | analytic | pass |
| booleans/3175-cut-beside-sealed-void | [tangency-labs/solidcraft#3175](https://github.com/tangency-labs/solidcraft/issues/3175) | a cut over the bottom edge of a revolved cylinder that holds a sealed spherical void on its axis: the body must not come out empty or refused | analytic | pass |
| booleans/3243-rim-and-rounded-tooth-join | [tangency-labs/solidcraft#3243](https://github.com/tangency-labs/solidcraft/issues/3243) | a join of a cylindrical rim (r 15.27..16.65, to z=5) and a rounded tooth trimmed to the same two cylinders that overlaps it by 0.01 mm in Z | invariants | pass |
| booleans/3303-inward-cut-of-frustum-top-face | [tangency-labs/solidcraft#3303](https://github.com/tangency-labs/solidcraft/issues/3303) [tangency-labs/solidcraft#3309](https://github.com/tangency-labs/solidcraft/issues/3309) | cutting the complete circular top face of a widening conical frustum inward: the cylindrical tool touches the cone only at its rim | analytic | pass |
| booleans/3327-cut-ending-flush-with-side-wall | [tangency-labs/solidcraft#3327](https://github.com/tangency-labs/solidcraft/issues/3327) [tangency-labs/solidcraft#2963](https://github.com/tangency-labs/solidcraft/issues/2963) | a cut whose end face lies exactly in a side wall of its target (a window notch): the cut must open the wall, with no skin left in it | analytic | pass |
| booleans/3378-circular-pattern-of-join-that-merged-targets | [tangency-labs/solidcraft#3378](https://github.com/tangency-labs/solidcraft/issues/3378) | a circular pattern of a join whose two targets (rim and hub) were merged into one body by that join | analytic | pass |
| booleans/3379-circular-pattern-of-thin-spoke-on-ring | [tangency-labs/solidcraft#3379](https://github.com/tangency-labs/solidcraft/issues/3379) | a circular pattern (count 5) of a spoke thinner than the ring it joins (faces 0.5 mm inside the rim and hub faces) | analytic | pass |
| booleans/3383-combine-tool-into-rotated-occurrence | [tangency-labs/solidcraft#3383](https://github.com/tangency-labs/solidcraft/issues/3383) | a root body joined into a body inside a component whose occurrence is turned a quarter turn: the tool must stay where it is in the world | analytic | **FAIL**: shells Plate: 2 (want 1); volume_mm3 17000 (want 16750); bbox.min [-20, -10, -20] (want [-20, -10, -25]); bbox.max [20, 25, 20] (want [20, 5, 20]) |
| booleans/3447-split-along-plane-of-a-face | [tangency-labs/solidcraft#3447](https://github.com/tangency-labs/solidcraft/issues/3447) [tangency-labs/solidcraft#2979](https://github.com/tangency-labs/solidcraft/issues/2979) | split body where the splitting plane contains an end face (with a boss on it and an R1 fillet on the face's edge) | analytic | **FAIL**: step 4 (solid.split_body): the section through the body does not close |
| booleans/3455-join-of-64-separate-pegs | [tangency-labs/solidcraft#3455](https://github.com/tangency-labs/solidcraft/issues/3455) | one combine of 64 separate pegs that do not touch: 36 s on truck, growing 4-9x per doubling; must finish in seconds | analytic | **HANG**: no result after 180 s |
| booleans/3456-deep-cut-through-drilled-taper-leaves-base | [tangency-labs/solidcraft#3456](https://github.com/tangency-labs/solidcraft/issues/3456) [tangency-labs/solidcraft#3497](https://github.com/tangency-labs/solidcraft/issues/3497) | a deep cut that removes everything above z=2 of a tapered body with nine through-bores, leaving the 2 mm drilled base | analytic | pass |
| booleans/3460-cut-by-lid-with-coincident-walls-and-half-moon-tabs | [tangency-labs/solidcraft#3460](https://github.com/tangency-labs/solidcraft/issues/3460) | Combine cut (keep tools) of an enclosure by its lid whose insert is flush with the inner walls and carries four small half-moon tabs that cross them; the cut must not return the target unchanged | analytic | pass |
| booleans/3485-boss-joined-on-rod-top-keeps-side-whole | [tangency-labs/solidcraft#3485](https://github.com/tangency-labs/solidcraft/issues/3485) [tangency-labs/solidcraft#3062](https://github.com/tangency-labs/solidcraft/issues/3062) | a boss joined on a rod's top face (the join runs the boss on into the rod); the rod's side must stay one face, not seamed at the boss's foot | analytic | pass |
| booleans/3497-collinear-cylinders-partial-height-intersection | [tangency-labs/solidcraft#3497](https://github.com/tangency-labs/solidcraft/issues/3497) [tangency-labs/solidcraft#3456](https://github.com/tangency-labs/solidcraft/issues/3456) | intersection of two collinear R2 H12 cylinders offset by 0.75 along the axis (curved walls coincide over part of the height) | analytic | pass |
| booleans/3497-pin-overlapping-bore-by-20-microns | [tangency-labs/solidcraft#3497](https://github.com/tangency-labs/solidcraft/issues/3497) [tangency-labs/solidcraft#3456](https://github.com/tangency-labs/solidcraft/issues/3456) | a pin r=3.02 intersected with a tube whose bore is r=3: a thin annulus (0.02 mm overlap on a curved wall) | analytic | pass |
| booleans/3526-intersect-keeps-every-lump | [tangency-labs/solidcraft#3526](https://github.com/tangency-labs/solidcraft/issues/3526) [tangency-labs/solidcraft#3888](https://github.com/tangency-labs/solidcraft/issues/3888) | intersect of a two-lump target (two spheres joined while apart) with a box holding the bottom half of each | analytic | pass |
| booleans/3604-cut-with-g2-swept-tool-along-projected-edge | [tangency-labs/solidcraft#3604](https://github.com/tangency-labs/solidcraft/issues/3604) [tangency-labs/solidcraft#3613](https://github.com/tangency-labs/solidcraft/issues/3613) | cut of a box by a swept G2 corner-removal tool along a projected edge chain (left-rear corner; the symmetric front-left chain works) | invariants | **FAIL**: step 12 (solid.sweep): the path curves are not connected end to end |
| booleans/3612-circular-pattern-of-spoke-tangent-to-hub | [tangency-labs/solidcraft#3612](https://github.com/tangency-labs/solidcraft/issues/3612) [tangency-labs/solidcraft#3379](https://github.com/tangency-labs/solidcraft/issues/3379) | a spoke whose inner face x=12 is exactly tangent to the hub cylinder r=12 (line contact), joined to the rim, patterned 5 times around the hub's axis | analytic | **FAIL**: step 4 (solid.box): invalid input: native B-rep: portable B-rep: face 3 loop 1: loop encloses no (u, v) area (signed area 0) |
| booleans/3633-sphere-intersect-pyramid-apex-at-centre | [tangency-labs/solidcraft#3633](https://github.com/tangency-labs/solidcraft/issues/3633) [tangency-labs/solidcraft#3682](https://github.com/tangency-labs/solidcraft/issues/3682) | a sphere r=10 intersected with a square pyramid whose apex is the sphere's centre and whose sides lie in the planes of the sphere primitive's patch edges | analytic | not supported yet: step 8 (solid.loft): not supported yet: SMLib loft to a point |
| booleans/3652-mirror-of-a-mirror-feature | [tangency-labs/solidcraft#3652](https://github.com/tangency-labs/solidcraft/issues/3652) | mirror a Mirror feature (the first mirror's hole) about a second plane: 'Mirror1 cannot be patterned or mirrored yet' | analytic | **FAIL**: step 7 (solid.mirror): Mirror1 cannot be patterned or mirrored yet |
| booleans/3665-join-extrude-column-on-floor-and-curved-walls | [tangency-labs/solidcraft#3665](https://github.com/tangency-labs/solidcraft/issues/3665) [tangency-labs/solidcraft#3666](https://github.com/tangency-labs/solidcraft/issues/3666) | a join extrude of a column standing on a channel's flat floor and lying along both its curved walls (column circle tangent to both walls) | analytic | not supported yet: step 10 (solid.extrude): SMLib boolean: export: SMLib export: not supported yet: a solid touching itself along an edge |
| booleans/3671-intersect-tool-in-top-face-beside-rib | [tangency-labs/solidcraft#3671](https://github.com/tangency-labs/solidcraft/issues/3671) | intersect with a tapered pocket tool whose top face lies in the block's top face, 0.5 mm short of a rib | analytic | pass |
| booleans/3702-board-in-cavity-of-filleted-rim-case | [tangency-labs/solidcraft#3702](https://github.com/tangency-labs/solidcraft/issues/3702) | a 0.2 mm board lying in the open cavity of a case with a filleted circular rim: cutting it from the case must leave the case unchanged (it was taken for wholly inside) | analytic | pass |
| booleans/3703-two-face-extrudes-join-keep-the-step | [tangency-labs/solidcraft#3703](https://github.com/tangency-labs/solidcraft/issues/3703) | two joined face extrudes on one box (top face, then the right side face): the stepped shape must stay | analytic | pass |
| booleans/3729-extrude-to-point-on-step-edge | [tangency-labs/solidcraft#3729](https://github.com/tangency-labs/solidcraft/issues/3729) | extrude `to` a point lying exactly on the top edge of a step: must end at the plane z=20 through the point | analytic | **FAIL**: volume_mm3 5089.997564 (want 5070.6858); bbox.max [10, 10, 22.732051] (want [10, 10, 20]) |
| booleans/3782-emboss-on-cylinder-pick-on-far-half | [tangency-labs/solidcraft#3782](https://github.com/tangency-labs/solidcraft/issues/3782) [tangency-labs/solidcraft#3425](https://github.com/tangency-labs/solidcraft/issues/3425) | emboss on a cylinder with the face pick on the half of the wall opposite the sketch | invariants | **FAIL**: step 5 (solid.emboss): invalid input: cylinder emboss: saved selection no longer identifies the sketch's cylindrical face |
| booleans/3816-circular-pattern-of-body-about-offset-axis | [tangency-labs/solidcraft#3816](https://github.com/tangency-labs/solidcraft/issues/3816) | circular pattern of a body about an axis {origin,dir} that does not pass through the world origin | analytic | pass |
| booleans/3830-split-cup-by-extended-spline-surface | [tangency-labs/solidcraft#3830](https://github.com/tangency-labs/solidcraft/issues/3830) | split a thin-walled cup (shell of a d30 cylinder) with a surface body: an extruded spline surface, extended at both ends | analytic | **HANG**: no result after 180 s |
| booleans/3841-join-touching-along-one-circle-only | [tangency-labs/solidcraft#3841](https://github.com/tangency-labs/solidcraft/issues/3841) [tangency-labs/solidcraft#168](https://github.com/tangency-labs/solidcraft/issues/168) | Join of a ring (r10..15) onto a coin (r10) that touch only along a circle: no fusion that moves the ring | invariants | **FAIL**: shells Coin: 2 (want 1); record_valid the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); smlib_check the operation failed: lumps: shell boundaries intersect or touch; cavity ownership is ambiguous (want ok); body_count 1 (want 2) |
| booleans/3850-cross-cut-touching-round-side | [tangency-labs/solidcraft#3850](https://github.com/tangency-labs/solidcraft/issues/3850) [tangency-labs/solidcraft#3741](https://github.com/tangency-labs/solidcraft/issues/3741) | a O50 x 50 cylinder with a 25 mm square through-hole, then a cross cut by a O40 circle split into two halves by a line (both halves picked, merged into one round tool whose end face x=25 touches the cylinder's side along y=0): the result must be one shell, not a good shell plus a zero-area one | analytic | pass |
| booleans/3850-hole-through-wall-after-cross-cut | [tangency-labs/solidcraft#3850](https://github.com/tangency-labs/solidcraft/issues/3850) [tangency-labs/solidcraft#3741](https://github.com/tangency-labs/solidcraft/issues/3741) | the O10 through-all hole across the wall of the body from the cross-cut case (the report's failing step: 'lumps: cannot mesh a complete shell boundary') | analytic | pass |
| booleans/3887-ring-standing-on-perforated-plate | [tangency-labs/solidcraft#3887](https://github.com/tangency-labs/solidcraft/issues/3887) [tangency-labs/solidcraft#2844](https://github.com/tangency-labs/solidcraft/issues/2844) | a ring (r19.6/20.8, 20 tall) joined onto an 80x80x1.2 plate with a 9x9 grid of 6.4 mm square holes; the ring's foot crosses the holes | analytic | pass |
| booleans/3968-hole-as-wide-as-a-cones-top | [tangency-labs/solidcraft#3968](https://github.com/tangency-labs/solidcraft/issues/3968) | a hole of diameter 10 drilled into the top of a truncated cone whose top is also diameter 10 (the hole wall meets the cone at the top rim) | analytic | pass |
| booleans/4008-symmetric-revolve-cut-ends-in-side-face | [tangency-labs/solidcraft#4008](https://github.com/tangency-labs/solidcraft/issues/4008) | symmetric 180 deg revolve cut about a vertical edge of a block, the tool's end faces lying in the block's side face | analytic | pass |
| booleans/4011-mirror-of-cut-under-wall | [tangency-labs/solidcraft#4011](https://github.com/tangency-labs/solidcraft/issues/4011) | a blind hole mirrored to a spot where half its top disc lies under a wall's foot | analytic | pass |
| booleans/4058-walls-joined-flush-round-a-floor | [tangency-labs/solidcraft#4058](https://github.com/tangency-labs/solidcraft/issues/4058) [tangency-labs/solidcraft#4059](https://github.com/tangency-labs/solidcraft/issues/4059) | a 10 mm ring (rounded corners) extruded 40 mm as a Join round a floor's outline: it touches the floor back to back on its flat sides and rounded corners | analytic | pass |
| booleans/4095-slab-cut-standing-off-a-bore-r10 | [tangency-labs/solidcraft#4095](https://github.com/tangency-labs/solidcraft/issues/4095) | a slab cut whose +x face stands 6.73e-05 mm (0.90 x the coincidence tolerance 7.48e-05) off a through-bore's wall (R=10), beside the bore | analytic | pass |
| booleans/4095-slab-cut-standing-off-a-bore-r15 | [tangency-labs/solidcraft#4095](https://github.com/tangency-labs/solidcraft/issues/4095) | a slab cut whose +x face stands 6.60e-05 mm (0.60 x the coincidence tolerance 1.10e-04) off a through-bore's wall (R=15), beside the bore | analytic | pass |
| booleans/423-through-all-cut-must-not-reach-behind-sketch-plane | [tangency-labs/solidcraft#423](https://github.com/tangency-labs/solidcraft/issues/423) | a one-sided Through All cut from a sketch plane at x=98 toward -x, with its wall 0.0022 mm from a face of a notch beyond the plane: the cut must remove nothing at x > 98 | analytic | pass |
| booleans/451-cut-block-crossing-hollow-sphere-tool | [tangency-labs/solidcraft#451](https://github.com/tangency-labs/solidcraft/issues/451) | a 12x8x8 block (x 8..20) crossing the inner sphere r=18.5 of a hollow spherical-shell tool: the cut keeps the part inside r=18.5 | analytic | **FAIL**: step 9 (solid.combine): lumps: cannot mesh a complete shell boundary |
| booleans/451-cut-block-inside-hollow-sphere-tool | [tangency-labs/solidcraft#451](https://github.com/tangency-labs/solidcraft/issues/451) | a block wholly inside the void of a hollow spherical-shell tool (r 18.5 to 40): cutting leaves it untouched, the tool never reaches it | analytic | **FAIL**: step 9 (solid.combine): lumps: cannot mesh a complete shell boundary |
| booleans/500-coaxial-cylinder-cut-from-thin-disc | [tangency-labs/solidcraft#500](https://github.com/tangency-labs/solidcraft/issues/500) | a radius 20 cylinder cut out of a coaxial radius 40 disc spanning x -1..1 lost about 2.6% of the volume | analytic | pass |
| booleans/559-through-hole-into-shelled-box-rim | [tangency-labs/solidcraft#559](https://github.com/tangency-labs/solidcraft/issues/559) | a 1 mm through-all hole straight down into the 2 mm rim of a shelled box: 'implausible volume' / no result | analytic | pass |
| booleans/562-press-pull-floor-beside-rounds | [tangency-labs/solidcraft#562](https://github.com/tangency-labs/solidcraft/issues/562) | Press Pull of a floor whose neighbours are rounds (vertical corner fillets): 'a neighbouring edge is not straight' | analytic | pass |
| booleans/831-tapered-extrude-d-shape-arc-meets-line | [tangency-labs/solidcraft#831](https://github.com/tangency-labs/solidcraft/issues/831) | tapered extrude of a D shape (an arc meeting a line at a sharp corner): refused as 'tapered profiles where an arc meets another edge at a corner' | analytic | pass |
| booleans/831-tapered-extrude-text-glyph | [tangency-labs/solidcraft#831](https://github.com/tangency-labs/solidcraft/issues/831) | tapered extrude of a text glyph (Bezier outline): refused with a misleading 'mixing lines and arcs' error | invariants | pass |
| crashes/1219-bore-fillet-then-grooves-cut | [tangency-labs/solidcraft#1219](https://github.com/tangency-labs/solidcraft/issues/1219) | 24 small grooves cut into a bore whose top edge has an unrelated 1 mm fillet: 73 s and 24 boolean retries instead of 0.2 s | analytic | pass |
| crashes/140-join-pad-hanging-past-the-edge | [tangency-labs/solidcraft#140](https://github.com/tangency-labs/solidcraft/issues/140) | a join whose tool face lies flat on the target but only half backed by it (the pad hangs 10 mm past the edge) must not add material | analytic | pass |
| crashes/1985-step-export-enclosure-screw-hole | [tangency-labs/solidcraft#1985](https://github.com/tangency-labs/solidcraft/issues/1985) [tangency-labs/solidcraft#2243](https://github.com/tangency-labs/solidcraft/issues/2243) | a small enclosure (rounded box, inner cut, corner gusset with a screw hole, two standoffs, USB cut-out) whose STEP export never finished (the export meshes its own file back) | invariants | pass |
| crashes/2243-step-export-flanged-enclosure | [tangency-labs/solidcraft#2243](https://github.com/tangency-labs/solidcraft/issues/2243) [tangency-labs/solidcraft#1985](https://github.com/tangency-labs/solidcraft/issues/1985) | a flanged enclosure with two standoffs and no screw hole whose STEP export also never finished | invariants | pass |
| crashes/2357-join-ring-of-90-cylinder-segments | [tangency-labs/solidcraft#2357](https://github.com/tangency-labs/solidcraft/issues/2357) | one join of a ring of 90 straight cylinder segments, each overlapping its neighbour at a 4 degree joint: a caught truck panic, then a refusal after 21 minutes | invariants | **HANG**: no result after 180 s |
| crashes/2992-join-disk-and-36-twisted-loft-blades | [tangency-labs/solidcraft#2992](https://github.com/tangency-labs/solidcraft/issues/2992) | join of a disk and a circular pattern of 36 twisted lofted blades (embedded 2.54 mm in the disk): blocks for minutes | invariants | **HANG**: no result after 180 s |
| crashes/3540-cut-with-coincident-cylinder-face | [tangency-labs/solidcraft#3540](https://github.com/tangency-labs/solidcraft/issues/3540) | a groove cut whose r33 arcs lie exactly on the r33 cylinder of an earlier slot cut and overlap it in Z: minutes of CPU | analytic | pass |
| crashes/3685-delete-fillet-face-beside-seam | [tangency-labs/solidcraft#1559](https://github.com/tangency-labs/solidcraft/issues/1559) [tangency-labs/solidcraft#3685](https://github.com/tangency-labs/solidcraft/issues/3685) | Delete Face on a fillet face next to a face whose edge a boolean/fillet rebuilt as an intersection curve: must never panic (truck: not implemented: intersection curve cannot connect by homotopy) | analytic | pass |
| crashes/4092-loft-ribs-rounded-pad-union-panics | [tangency-labs/solidcraft#4092](https://github.com/tangency-labs/solidcraft/issues/4092) | join extrude of a rounded pad over a lofted body with ring and ribs: repeated truck intersection_curve panics, then 'boolean Union: no result' | invariants | **FAIL**: step 50 (solid.extrude): SMLib boolean: operation: SMLib failed (status 1001) |
| crashes/4092-loft-ribs-rounded-pad-union-reduced | [tangency-labs/solidcraft#4092](https://github.com/tangency-labs/solidcraft/issues/4092) | the same without the top flange: the join fails with 'boolean Union: no result' | invariants | **FAIL**: step 40 (solid.extrude): SMLib boolean: operation: SMLib failed (status 1001) |
| fillets/1008-fillet-tray-floor-and-three-of-four-corners | [tangency-labs/solidcraft#1008](https://github.com/tangency-labs/solidcraft/issues/1008) | an R10 round on the four inside floor edges and three of the four inside vertical corners of an open tray, so one corner keeps a sharp vertical edge where two floor rounds meet (rebuilt from the report's edge picks: the original design is not in the report) | analytic | pass |
| fillets/1080-chamfer-beside-openings-fits | [tangency-labs/solidcraft#1080](https://github.com/tangency-labs/solidcraft/issues/1080) [tangency-labs/solidcraft#1124](https://github.com/tangency-labs/solidcraft/issues/1124) | a 4 mm chamfer on the top front edge of a cube with three square openings stays clear of the openings (they start 5 mm in) | analytic | pass |
| fillets/1080-chamfer-runs-into-openings-refused | [tangency-labs/solidcraft#1080](https://github.com/tangency-labs/solidcraft/issues/1080) [tangency-labs/solidcraft#1124](https://github.com/tangency-labs/solidcraft/issues/1124) | a 9 mm chamfer on the top front edge of a cube with square openings 5 mm in must be refused: it would cut through the rims of the openings | invariants | pass |
| fillets/1191-fillet-both-rims-of-a-tube-top | [tangency-labs/solidcraft#1191](https://github.com/tangency-labs/solidcraft/issues/1191) | an R2 round on the outer and inner rim circles of a tube's top face (the report's ten picks on a ring-shaped top: the round failed after 0.10.1; rebuilt as a plain tube since the design is not in the report) | analytic | pass |
| fillets/1207-fillet-concave-arc-at-boss | [tangency-labs/solidcraft#1207](https://github.com/tangency-labs/solidcraft/issues/1207) | an R2 round on the concave arc where a bar top meets a boss that only partly sits on it | analytic | pass |
| fillets/1207-fillet-straight-edge-ending-on-boss | [tangency-labs/solidcraft#1207](https://github.com/tangency-labs/solidcraft/issues/1207) | an R2 round along the straight top edge of a bar that runs out against a cylindrical boss | analytic | pass |
| fillets/1213-round-end-circle-of-bent-tube | [tangency-labs/solidcraft#1213](https://github.com/tangency-labs/solidcraft/issues/1213) [tangency-labs/solidcraft#1291](https://github.com/tangency-labs/solidcraft/issues/1291) | an R3 round on the end circle of a lofted tube whose axis bends (a 60 degree torus section) | analytic | pass |
| fillets/1262-fillet-boss-bottom-arc | [tangency-labs/solidcraft#1262](https://github.com/tangency-labs/solidcraft/issues/1262) | a 0.8 mm round on the exposed half circle at the bottom of a cylindrical boss joined to a box side | analytic | pass |
| fillets/1390-chamfer-hole-rim-touching-bottom | [tangency-labs/solidcraft#1390](https://github.com/tangency-labs/solidcraft/issues/1390) [tangency-labs/solidcraft#1574](https://github.com/tangency-labs/solidcraft/issues/1574) [tangency-labs/solidcraft#1428](https://github.com/tangency-labs/solidcraft/issues/1428) | a 3 mm chamfer on the rim of a hole that is tangent to the bottom face runs off that face and must not add material below the part | invariants | pass |
| fillets/1488-fillet-slab-end-after-nudged-loft-join | [tangency-labs/solidcraft#1488](https://github.com/tangency-labs/solidcraft/issues/1488) [tangency-labs/solidcraft#1517](https://github.com/tangency-labs/solidcraft/issues/1517) | an R1 fillet on the end edge of a 3.5 mm slab after a pleated loft was joined flush with its inner face (the join needs a tool retry; later fillets must still work) | invariants | pass |
| fillets/1557-fillet-vertical-corners-after-bottom-rounds | [tangency-labs/solidcraft#1557](https://github.com/tangency-labs/solidcraft/issues/1557) [tangency-labs/solidcraft#1581](https://github.com/tangency-labs/solidcraft/issues/1581) | vertical corner fillets R2 on a 25x25x10 box whose four bottom edges are already rounded R2 (the round meets the earlier mitre) | analytic | **FAIL**: step 6 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/1667-fillet-rim-line-beside-quarter-turns | [tangency-labs/solidcraft#1667](https://github.com/tangency-labs/solidcraft/issues/1667) [tangency-labs/solidcraft#1702](https://github.com/tangency-labs/solidcraft/issues/1702) | an R5 round of the top rim of a 297 mm long box whose corners are R5 (a 287 mm line beside 7.85 mm quarter turns) | analytic | **FAIL**: step 3 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/1668-fillet-both-sides-of-thin-wall | [tangency-labs/solidcraft#1668](https://github.com/tangency-labs/solidcraft/issues/1668) [tangency-labs/solidcraft#1720](https://github.com/tangency-labs/solidcraft/issues/1720) | an R5 round on an outer top edge and the matching inner (concave) edge of a 2 mm wall in one feature fits, as it does one after the other | analytic | pass |
| fillets/190-fillet-rim-as-tall-as-wall | [tangency-labs/solidcraft#190](https://github.com/tangency-labs/solidcraft/issues/190) [tangency-labs/solidcraft#318](https://github.com/tangency-labs/solidcraft/issues/318) | an R2 round of the top edge of a disc 2 mm high (the round is as tall as the wall, so it meets the bottom face) | analytic | pass |
| fillets/193-paste-copies-the-fillets | [tangency-labs/solidcraft#193](https://github.com/tangency-labs/solidcraft/issues/193) [tangency-labs/solidcraft#214](https://github.com/tangency-labs/solidcraft/issues/214) [tangency-labs/solidcraft#363](https://github.com/tangency-labs/solidcraft/issues/363) [tangency-labs/solidcraft#613](https://github.com/tangency-labs/solidcraft/issues/613) | a block with two R2 top edges rounded, copied and pasted 40 mm over: the copy must carry its own fillets | analytic | pass |
| fillets/1986-chamfer-arc-edge-of-joined-sectors | [tangency-labs/solidcraft#1986](https://github.com/tangency-labs/solidcraft/issues/1986) | a 3 mm chamfer on the outer top arc of a 120 degree annular sector joined to a lower inner sector (the joined outer wall must not limit the chamfer) | analytic | pass |
| fillets/199-fillet-uses-up-end-face | [tangency-labs/solidcraft#199](https://github.com/tangency-labs/solidcraft/issues/199) [tangency-labs/solidcraft#317](https://github.com/tangency-labs/solidcraft/issues/317) | an R3 round on the four vertical edges of a 14x6x10 box: the two rounds on each 6 mm end face meet exactly (the face is used up) | analytic | pass |
| fillets/219-pattern-of-filleted-pockets | [tangency-labs/solidcraft#219](https://github.com/tangency-labs/solidcraft/issues/219) | a plate with 6 pockets made by patterning one pocket and the R3.2 round of its four corner edges, the pocket height set by a parameter | analytic | pass |
| fillets/2341-pattern-of-chamfered-bosses | [tangency-labs/solidcraft#2341](https://github.com/tangency-labs/solidcraft/issues/2341) [tangency-labs/solidcraft#2774](https://github.com/tangency-labs/solidcraft/issues/2774) [tangency-labs/solidcraft#2775](https://github.com/tangency-labs/solidcraft/issues/2775) [tangency-labs/solidcraft#2342](https://github.com/tangency-labs/solidcraft/issues/2342) | a 2 x 2 grid made by a feature pattern of a boss and its two chamfers (a concave root chamfer and a convex tip chamfer) | analytic | pass |
| fillets/237-fillet-concave-edge-between-two-cylinders | [tangency-labs/solidcraft#237](https://github.com/tangency-labs/solidcraft/issues/237) [tangency-labs/solidcraft#238](https://github.com/tangency-labs/solidcraft/issues/238) | an R6 round on the vertical edge where two cylinder walls meet (the concave corner of two merged discs), the two walls meeting at an angle | analytic | pass |
| fillets/2498-fillet-tiny-end-edges-rounded-rectangle | [tangency-labs/solidcraft#2498](https://github.com/tangency-labs/solidcraft/issues/2498) [tangency-labs/solidcraft#2506](https://github.com/tangency-labs/solidcraft/issues/2506) | an R2 round of the top loop of a 26.4x8.6x8.4 rounded rectangle whose end edges are only 0.02 mm long (corner radius 4.29) | analytic | pass |
| fillets/2672-chamfer-one-pick-large-plate | [tangency-labs/solidcraft#2672](https://github.com/tangency-labs/solidcraft/issues/2672) [tangency-labs/solidcraft#3295](https://github.com/tangency-labs/solidcraft/issues/3295) | one pick on a stadium boss top rim chamfers the whole tangent loop, also when the part is more than 200 mm across | analytic | pass |
| fillets/2708-fillet-curvature-continuous-angled-ends | [tangency-labs/solidcraft#2708](https://github.com/tangency-labs/solidcraft/issues/2708) [tangency-labs/solidcraft#2739](https://github.com/tangency-labs/solidcraft/issues/2739) | a curvature-continuous (G2) fillet of size 5 on a straight edge that ends on two slanted planar faces | analytic | **FAIL**: volume_mm3 11867.72421 (want 11854.052069) |
| fillets/2719-chamfer-as-wide-as-corner-round | [tangency-labs/solidcraft#2719](https://github.com/tangency-labs/solidcraft/issues/2719) | a 1 mm chamfer round a bottom loop whose corners are R1 rounds: each corner cone closes to a point on the bottom face | analytic | **FAIL**: step 3 (solid.chamfer): SMLib chamfer: operation: SMLib failed (status 1001) |
| fillets/2752-fillet-rim-of-flat-cut-on-sphere | [tangency-labs/solidcraft#2752](https://github.com/tangency-labs/solidcraft/issues/2752) [tangency-labs/solidcraft#2787](https://github.com/tangency-labs/solidcraft/issues/2787) | an R1 round round the rim of a radius-2 sphere cut flat at z=1 | analytic | pass |
| fillets/2797-chamfer-two-distances-circular-rim | [tangency-labs/solidcraft#2797](https://github.com/tangency-labs/solidcraft/issues/2797) [tangency-labs/solidcraft#3300](https://github.com/tangency-labs/solidcraft/issues/3300) [tangency-labs/solidcraft#2893](https://github.com/tangency-labs/solidcraft/issues/2893) | a Two Distances chamfer (1 mm on the top face, 0.5 mm down the wall) on the circular rim between a plane and a cylinder | analytic | not supported yet: step 2 (solid.chamfer): invalid input: not supported yet: a chamfer with two different setbacks (two distances, or a distance and an angle) with the SMLib kerne |
| fillets/2811-fillet-rib-roots | [tangency-labs/solidcraft#2811](https://github.com/tangency-labs/solidcraft/issues/2811) | an R1.5 fillet of the 32 vertical root edges of 8 ribs between two walls of a grille tray (a performance case: the time must not blow up) | analytic | pass |
| fillets/2852-fillet-outer-round-concentric-with-inner | [tangency-labs/solidcraft#2852](https://github.com/tangency-labs/solidcraft/issues/2852) | an R18 round on the outside top edges of a 3 mm thick upside-down U, concentric with the R15 round of its inside edges | analytic | pass |
| fillets/2907-chamfer-two-end-outlines-rounded-top | [tangency-labs/solidcraft#2907](https://github.com/tangency-labs/solidcraft/issues/2907) [tangency-labs/solidcraft#3861](https://github.com/tangency-labs/solidcraft/issues/3861) | a 1.5 mm chamfer of both end outlines (sides, top and the two top arcs) of a prism with rounded top corners, bottom edges left alone | analytic | pass |
| fillets/324-fillet-over-hole-overlap | [tangency-labs/solidcraft#324](https://github.com/tangency-labs/solidcraft/issues/324) [tangency-labs/solidcraft#1885](https://github.com/tangency-labs/solidcraft/issues/1885) | a 4 mm fillet on a top edge whose round overlaps the rim of a through hole (the hole breaks into the round) | analytic | **FAIL**: step 6 (solid.fillet): SMLib fillet: operation: SMLib's result is not a closed solid |
| fillets/3276-chamfer-edge-of-1mm-protrusion-on-joined-l | [tangency-labs/solidcraft#3276](https://github.com/tangency-labs/solidcraft/issues/3276) | three extrudes joined into an L-shaped body with a 1 mm protrusion, then a chamfer on the protrusion's outer edge (the report: the corners are no longer 90 degrees and the chamfer fails) | analytic | pass |
| fillets/334-fillet-top-outline-after-concave-rounds | [tangency-labs/solidcraft#334](https://github.com/tangency-labs/solidcraft/issues/334) [tangency-labs/solidcraft#335](https://github.com/tangency-labs/solidcraft/issues/335) | an R2 round on the whole top outline of two merged cylinders after their two concave vertical edges were rounded R5 | analytic | pass |
| fillets/3369-fillet-edge-ends-on-tangent-seam | [tangency-labs/solidcraft#3369](https://github.com/tangency-labs/solidcraft/issues/3369) [tangency-labs/solidcraft#3922](https://github.com/tangency-labs/solidcraft/issues/3922) | an R2 round on a straight edge whose ends sit on the tangent seam between a flat top and a rounded end | analytic | **FAIL**: step 9 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/3435-fillet-larger-than-top-ring | [tangency-labs/solidcraft#3435](https://github.com/tangency-labs/solidcraft/issues/3435) [tangency-labs/solidcraft#3441](https://github.com/tangency-labs/solidcraft/issues/3441) | a fillet of radius 6.9 on a cylinder rim whose flat top ring (round the joined boss) is only 4.3 mm wide must be refused, not grow the part | invariants | pass |
| fillets/3655-chamfer-edge-order-box | [tangency-labs/solidcraft#3655](https://github.com/tangency-labs/solidcraft/issues/3655) [tangency-labs/solidcraft#3660](https://github.com/tangency-labs/solidcraft/issues/3660) | a plain box with all 12 edges chamfered, the edges listed in an order that was refused | analytic | pass |
| fillets/3753-circular-pattern-of-hole-and-its-rim-chamfer | [tangency-labs/solidcraft#3753](https://github.com/tangency-labs/solidcraft/issues/3753) | a circular pattern (6 copies about Y) of a through hole and the 1 mm chamfer on its rim (the report: the pattern is refused because the copied chamfer 'would grow the part'); rebuilt as a hole in a disc, the original design is not in the report | analytic | pass |
| fillets/3779-chamfer-all-spline-spans | [tangency-labs/solidcraft#3779](https://github.com/tangency-labs/solidcraft/issues/3779) [tangency-labs/solidcraft#3804](https://github.com/tangency-labs/solidcraft/issues/3804) | a 0.1 mm chamfer on all eight top-rim spans of a 20 x 20 pillow whose four sides are fit splines (two cubic spans each) | invariants | pass |
| fillets/3779-fillet-all-spline-spans | [tangency-labs/solidcraft#3779](https://github.com/tangency-labs/solidcraft/issues/3779) [tangency-labs/solidcraft#3804](https://github.com/tangency-labs/solidcraft/issues/3804) | a 0.1 mm fillet on all eight top-rim spans of a 20 x 20 pillow whose four sides are fit splines (two cubic spans each) | invariants | pass |
| fillets/3868-chamfer-concave-edge-adds-material | [tangency-labs/solidcraft#3868](https://github.com/tangency-labs/solidcraft/issues/3868) | a chamfer of an inside (concave) edge fills the corner and adds material, one on the outside edge removes it | analytic | pass |
| fillets/4055-chamfer-bar-edge-over-joined-pin | [tangency-labs/solidcraft#4055](https://github.com/tangency-labs/solidcraft/issues/4055) | a 3 mm chamfer on the bottom long edge of a bar joined on top of a pin, where the chamfer is wider than the 2 mm gap between that edge and the pin | analytic | pass |
| fillets/4101-chamfer-tapered-plug-corners | [tangency-labs/solidcraft#4101](https://github.com/tangency-labs/solidcraft/issues/4101) | the four edges of a block end face chamfered where the block sides are 1 degree off square: exact volume of the plane-clipped prism (the corner edges of about 0.0001 mm are real geometry) | analytic | pass |
| fillets/4141-fillet-corner-after-wedge-cut-beside-bspline | [tangency-labs/solidcraft#4141](https://github.com/tangency-labs/solidcraft/issues/4141) | an R5 round on the corner edge left by a wedge cut through a body vertex next to a B-spline face | invariants | pass |
| fillets/4143-fillet-notch-rim-on-bspline-ramp | [tangency-labs/solidcraft#4143](https://github.com/tangency-labs/solidcraft/issues/4143) | an R4 round on the rim of an R5 notch where its cylinder meets an extruded B-spline ramp, both ends running into a square wall | invariants | **FAIL**: step 13 (solid.fillet): SMLib fillet: operation: SMLib failed (status 1001) |
| fillets/485-fillet-d-prism-top-outline-arc-and-flat | [tangency-labs/solidcraft#485](https://github.com/tangency-labs/solidcraft/issues/485) [tangency-labs/solidcraft#604](https://github.com/tangency-labs/solidcraft/issues/604) | an R0.5 round on both top perimeter edges (the arc and the flat) of a D-shaped prism, the two edges meeting at sharp 90 degree corners | analytic | pass |
| fillets/556-fillet-edge-ending-on-curved-boss | [tangency-labs/solidcraft#556](https://github.com/tangency-labs/solidcraft/issues/556) [tangency-labs/solidcraft#646](https://github.com/tangency-labs/solidcraft/issues/646) | an R0.5 round on a single straight bottom edge of a box whose end runs out against a cylindrical boss wall | analytic | pass |
| fillets/783-fillet-pick-far-from-any-edge-refused | [tangency-labs/solidcraft#783](https://github.com/tangency-labs/solidcraft/issues/783) [tangency-labs/solidcraft#820](https://github.com/tangency-labs/solidcraft/issues/820) | a fillet whose edge pick is 15 mm from the nearest edge must be refused, not applied to some other edge | invariants | pass |
| fillets/814-chamfer-hex-hole-corners | [tangency-labs/solidcraft#814](https://github.com/tangency-labs/solidcraft/issues/814) [tangency-labs/solidcraft#1067](https://github.com/tangency-labs/solidcraft/issues/1067) | a 2 mm chamfer on the six vertical corners of a hexagonal hole: one bevel each, not a notch | analytic | pass |
| fillets/851-fillet-three-edges-at-knife-edge-arc-corner | [tangency-labs/solidcraft#851](https://github.com/tangency-labs/solidcraft/issues/851) [tangency-labs/solidcraft#854](https://github.com/tangency-labs/solidcraft/issues/854) [tangency-labs/solidcraft#926](https://github.com/tangency-labs/solidcraft/issues/926) [tangency-labs/solidcraft#935](https://github.com/tangency-labs/solidcraft/issues/935) [tangency-labs/solidcraft#1294](https://github.com/tangency-labs/solidcraft/issues/1294) | three edges meeting at the front corner of a plate with a concave arc wall that runs out in a knife-edge tip: top front edge, arc top edge and front upright, R2 together | invariants | pass |
| fillets/862-fillet-curvature-continuous-box-edge | [tangency-labs/solidcraft#862](https://github.com/tangency-labs/solidcraft/issues/862) | a curvature-continuous (G2) fillet of size 6 on one edge of a 20 mm cube | analytic | **FAIL**: volume_mm3 7902.559861 (want 7892.380952) |
| fillets/896-fillet-smooth-seam-refused | [tangency-labs/solidcraft#896](https://github.com/tangency-labs/solidcraft/issues/896) [tangency-labs/solidcraft#936](https://github.com/tangency-labs/solidcraft/issues/936) | a fillet picked on the seam where a rounded edge runs tangent into the flat top has no corner to round and is refused as an invalid pick | invariants | pass |
| import/1721-closed-bspline-tube-face | [tangency-labs/solidcraft#1721](https://github.com/tangency-labs/solidcraft/issues/1721) [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a cylinder r=10 h=30 whose side is a closed (rational B-spline) tube face wrapping all the way round a closed non-periodic surface: it must mesh and measure as the full tube | analytic | not supported yet: step 1 (file.insert_step): tests/kernel-cases/import/1721-closed-bspline-tube-face/input.step: the operation failed: STEP import: no bodies (solid #89: not impo |
| import/2043-outer-bound-opposing-surface-sense | [tangency-labs/solidcraft#1974](https://github.com/tangency-labs/solidcraft/issues/1974) [tangency-labs/solidcraft#2043](https://github.com/tangency-labs/solidcraft/issues/2043) | a block whose every plane's axis points into the part and whose faces say same_sense .F. while their FACE_OUTER_BOUND loops run counter-clockwise about the outward normal: the loops are outer bounds, not holes | analytic | pass |
| import/258-cone-point-vertex | [tangency-labs/solidcraft#258](https://github.com/tangency-labs/solidcraft/issues/258) | the same STEP cone with a VERTEX_LOOP at the apex: the mesh stopped 30 mm short of the apex | analytic | pass |
| import/258-cone-to-point | [tangency-labs/solidcraft#258](https://github.com/tangency-labs/solidcraft/issues/258) | a STEP cone 20 mm across coming to a point 30 mm up (no vertex at the apex): the cone face was meshed flat at its base, so the measured shape was far off | analytic | pass |
| import/258-tiny-pin | [tangency-labs/solidcraft#258](https://github.com/tangency-labs/solidcraft/issues/258) | a STEP pin 0.5 mm across, 2 mm long: meshed 1.16 mm off at a 0.5 mm tolerance | analytic | pass |
| import/3098-bspline-edges-over-tiny-knot-span | [tangency-labs/solidcraft#3098](https://github.com/tangency-labs/solidcraft/issues/3098) | a block whose 12 straight edges are degree-1 B-spline curves over a knot span of 1e-7 (as NX writes short edges); the faces must be kept | analytic | pass |
| import/3208-extruded-ellipse-face-over-parameter-seam | [tangency-labs/solidcraft#3120](https://github.com/tangency-labs/solidcraft/issues/3120) [tangency-labs/solidcraft#3208](https://github.com/tangency-labs/solidcraft/issues/3208) | a prism over a circular segment whose curved side lies on a SURFACE_OF_LINEAR_EXTRUSION of an ELLIPSE (a = b = 10) and spans the ellipse's parameter origin (-60 to +60 degrees): the face must cover only the narrow segment side, not wrap the ellipse | analytic | pass |
| import/3352-vertex-off-its-edge-curve | [tangency-labs/solidcraft#3351](https://github.com/tangency-labs/solidcraft/issues/3351) [tangency-labs/solidcraft#3352](https://github.com/tangency-labs/solidcraft/issues/3352) | a 300 mm square surface whose corner vertex sits 0.19 mm off the end of its edge's curve (the file declares 0.01 mm accuracy): the face must be kept, the vertex snapped onto the curve | analytic | pass |
| import/3359-iges-trim-pieces-written-end-to-start | [tangency-labs/solidcraft#3358](https://github.com/tangency-labs/solidcraft/issues/3358) [tangency-labs/solidcraft#3359](https://github.com/tangency-labs/solidcraft/issues/3359) | a box of six trimmed planes whose composite trim curves have their 2nd and 4th pieces written end to start: every loop must still close | analytic | pass |
| import/3730-void-oriented-shell-false | [tangency-labs/solidcraft#3730](https://github.com/tangency-labs/solidcraft/issues/3730) [tangency-labs/solidcraft#3872](https://github.com/tangency-labs/solidcraft/issues/3872) | a block with a closed cavity written as BREP_WITH_VOIDS whose void shell (outward-facing faces) is turned by ORIENTED_CLOSED_SHELL .F.; the cavity must be taken out, not added | analytic | pass |
| import/3806-iges-revolved-arc-spherical-cap-dome | [tangency-labs/solidcraft#3806](https://github.com/tangency-labs/solidcraft/issues/3806) [tangency-labs/solidcraft#3813](https://github.com/tangency-labs/solidcraft/issues/3813) | a dome: an IGES surface of revolution (120) of a 60-to-90 degree circular arc (100) of radius 50 centred on the axis, trimmed by a circle at the rim, over a flat base disc; the cap must be 50 mm across and 6.7 mm tall, not a whole sphere | analytic | pass |
| import/3845-iges-trim-pieces-miss-by-a-gap | [tangency-labs/solidcraft#3845](https://github.com/tangency-labs/solidcraft/issues/3845) [tangency-labs/solidcraft#3846](https://github.com/tangency-labs/solidcraft/issues/3846) | a box of six trimmed planes where the edge (0,0,0)-(0,20,0) stops 0.01 mm short of its end corner in both faces that use it: the small gap must be closed, giving a closed box instead of two dropped faces | analytic | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/3845-iges-trim-pieces-miss-by-a-gap/input.igs: the operation failed: STEP import: no bodies (solid 'Body1': |
| import/3871-cone-base-circle-with-vertex-loop | [tangency-labs/solidcraft#3871](https://github.com/tangency-labs/solidcraft/issues/3871) [tangency-labs/solidcraft#3901](https://github.com/tangency-labs/solidcraft/issues/3901) | the same cone with a VERTEX_LOOP at its point on the cone face: the point must still be reached, not read as a flat disc | analytic | pass |
| import/3871-cone-bounded-only-by-its-base-circle | [tangency-labs/solidcraft#3871](https://github.com/tangency-labs/solidcraft/issues/3871) [tangency-labs/solidcraft#3901](https://github.com/tangency-labs/solidcraft/issues/3901) [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a cone whose face is bounded only by its base circle (no vertex at the point) must reach its point, not come in as a flat disc | analytic | pass |
| import/3880-cylinder-seam-edge | [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a cylinder r=10 h=30 whose side face is written with a seam edge: one closed solid with 3 faces | analytic | pass |
| import/3880-nurbs-hemisphere-dome | [tangency-labs/solidcraft#3880](https://github.com/tangency-labs/solidcraft/issues/3880) | a hemisphere r=20 whose curved face is a rational B-spline surface, flat disc below | analytic | not supported yet: step 1 (file.insert_step): tests/kernel-cases/import/3880-nurbs-hemisphere-dome/input.step: the operation failed: STEP import: no bodies (solid #73: not importe |
| import/3886-iges-bspline-curve-over-tiny-knot-span | [tangency-labs/solidcraft#3885](https://github.com/tangency-labs/solidcraft/issues/3885) [tangency-labs/solidcraft#3886](https://github.com/tangency-labs/solidcraft/issues/3886) | a box of six trimmed planes with one edge written as a B-spline curve (126) over a knot span of 1e-7: both faces it bounds must be kept | analytic | pass |
| import/3912-iges-hole-trim-first-piece-reversed | [tangency-labs/solidcraft#3912](https://github.com/tangency-labs/solidcraft/issues/3912) | a 10 x 10 trimmed patch with a 4 x 4 square hole whose composite trim curve starts with a reversed piece: the hole stays a hole | analytic | pass |
| import/3913-iges-trim-curve-first-piece-reversed | [tangency-labs/solidcraft#3912](https://github.com/tangency-labs/solidcraft/issues/3912) [tangency-labs/solidcraft#3913](https://github.com/tangency-labs/solidcraft/issues/3913) | a box of six trimmed planes whose composite trim curves start with a piece written end to start (1st and 3rd pieces reversed): every loop must still close | analytic | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/3913-iges-trim-curve-first-piece-reversed/input.igs: the operation failed: STEP import: no bodies (solid 'B |
| import/3963-closed-spline-edge-vertex-past-start | [tangency-labs/solidcraft#3963](https://github.com/tangency-labs/solidcraft/issues/3963) | a 20 mm square face bounded by one closed degree-1 B-spline edge whose only vertex sits at parameter 2e-7, just past the curve's start: the face must be kept, not dropped or crashed on | analytic | pass |
| import/3972-iges-two-separate-closed-boxes | [tangency-labs/solidcraft#3928](https://github.com/tangency-labs/solidcraft/issues/3928) [tangency-labs/solidcraft#3972](https://github.com/tangency-labs/solidcraft/issues/3972) | an IGES file of twelve trimmed planes forming two separate closed boxes (10x20x30, one 100 mm along x): they must come in as two solids, not one open body | analytic | **FAIL**: smlib_check SMLib check: 4 failed tests: SmShell::Test #22 SmFaceuse_TYPE: sShellFaceuses and sFaceuses2 are equ (want ok); body_count 1 (want 2) |
| import/4005-cylinder-written-as-near-zero-cone | [tangency-labs/solidcraft#4005](https://github.com/tangency-labs/solidcraft/issues/4005) | a cylinder r=5 h=10 whose side is a CONICAL_SURFACE with a semi-angle of 8e-12 rad (a cylinder to within rounding, as the exporter wrote it): the face must be read, not refused as a 'bad cone' | analytic | pass |
| import/4006-plane-written-as-cone-of-nearly-right-angle | [tangency-labs/solidcraft#4006](https://github.com/tangency-labs/solidcraft/issues/4006) | an annular plate r 4..10, 3 thick, whose top face is a CONICAL_SURFACE of semi-angle pi/2 - 7e-12 (a plane to within rounding, as the exporter wrote it): the face must be read, not refused as a 'bad cone', and the body stays closed | analytic | **FAIL**: step 1 (file.insert_step): tests/kernel-cases/import/4006-plane-written-as-cone-of-nearly-right-angle/input.step: the operation failed: STEP import: no bodies ( |
| sheet-metal/1040-convert-a-1200-mm-strip-1-mm-thick | [tangency-labs/solidcraft#1040](https://github.com/tangency-labs/solidcraft/issues/1040) | a 1200 x 100 x 1 strip (diagonal over 1000 times its thickness) converted to sheet metal: refused with no outline on that face | analytic | pass |
| sheet-metal/1040-convert-a-990-mm-strip-keeps-its-1-mm-hole | [tangency-labs/solidcraft#1040](https://github.com/tangency-labs/solidcraft/issues/1040) | a 990 x 100 x 1 strip with holes of 10, 4, 2 and 1 mm: the 1 mm hole fell out of the outline when the mesh sagged by almost the thickness | analytic | **FAIL**: step 6 (sheet.convert): no outline on that face |
| sheet-metal/1092-convert-a-channel-with-its-bends-modelled | [tangency-labs/solidcraft#1092](https://github.com/tangency-labs/solidcraft/issues/1092) [tangency-labs/solidcraft#1314](https://github.com/tangency-labs/solidcraft/issues/1314) | a U channel modelled with its bend radii (R2 inside, R4 outside), a 6 mm hole in one wall and a label engraved 0.2 deep in its web, converted at the bends' outer arcs | analytic | pass |
| sheet-metal/1092-convert-an-L-with-a-modelled-bend-to-the-rules-radius | [tangency-labs/solidcraft#1092](https://github.com/tangency-labs/solidcraft/issues/1092) [tangency-labs/solidcraft#1314](https://github.com/tangency-labs/solidcraft/issues/1314) | an L section modelled with a bend of R2 inside and R4 outside, converted at that bend under a rule of R3: the bend becomes one bend of the rule's radius at the legs' virtual sharp | analytic | pass |
| sheet-metal/1092-convert-an-engraved-plate | [tangency-labs/solidcraft#1092](https://github.com/tangency-labs/solidcraft/issues/1092) [tangency-labs/solidcraft#1314](https://github.com/tangency-labs/solidcraft/issues/1314) | a 60 x 40 x 1 plate with a 20 x 10 x 0.1 engraving in its top face converted to sheet metal (refused as not a plate of even thickness; the engraving becomes a pocket of the sheet) | analytic | pass |
| sheet-metal/1095-refold-a-cutout-with-a-corner-on-the-sheets-edge-at-a-bend | [tangency-labs/solidcraft#1095](https://github.com/tangency-labs/solidcraft/issues/1095) | a flange unfolded, a triangular cut-out with a corner on the sheet's own edge at the middle of the bend zone, refolded: sew failed (this wire is not simple) | analytic | **FAIL**: step 11 (solid.extrude): SMLib export: the mapped B-rep does not validate: portable B-rep: a closed shell bounds two regions and encloses one |
| sheet-metal/1280-hole-square-to-a-45-degree-flange | [tangency-labs/solidcraft#1280](https://github.com/tangency-labs/solidcraft/issues/1280) | a 5 mm hole drilled square to the face of a 45 degree flange: the drill cap's certificate refused it by 1e-11 mm | analytic | pass |
| sheet-metal/1285-convert-a-bracket-whose-wall-covers-part-of-an-edge | [tangency-labs/solidcraft#1285](https://github.com/tangency-labs/solidcraft/issues/1285) [tangency-labs/solidcraft#1340](https://github.com/tangency-labs/solidcraft/issues/1340) | an 80 x 50 x 2 plate with a 40 wide, 30 high wall on part of its front edge, converted at the wall's outside bend edge: refused because the bend's setback used up an edge of a face | analytic | pass |
| sheet-metal/1295-a-slot-across-a-flange-leaves-the-rest-of-it-as-a-loose-piece | [tangency-labs/solidcraft#1295](https://github.com/tangency-labs/solidcraft/issues/1295) [tangency-labs/solidcraft#1338](https://github.com/tangency-labs/solidcraft/issues/1338) | a 100 x 60 sheet with a 45 degree 40 mm flange and a slot cut across the flange just past its bend: the rest of the flange keeps no material joining it to the base | analytic | pass |
| sheet-metal/1311-inside-flange-on-a-plate-turned-62-degrees | [tangency-labs/solidcraft#1311](https://github.com/tangency-labs/solidcraft/issues/1311) | a 100 x 60 plate turned 62 degrees about the origin with a 90 degree inside flange on one edge: the trimmed corner falls on the sew grid and the flange failed to close | analytic | pass |
| sheet-metal/1481-unfold-a-tray-whose-features-choose-their-own-corner-relief | [tangency-labs/solidcraft#1232](https://github.com/tangency-labs/solidcraft/issues/1232) [tangency-labs/solidcraft#1481](https://github.com/tangency-labs/solidcraft/issues/1481) | a 120 x 90 base with two edge flange features (bottom and left edges with a round relief, top and right edges with a square one) over a rule whose relief is a notch, unfolded | analytic | pass |
| sheet-metal/1797-tray-with-torn-corners-at-72-degrees-folded | [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a tray whose flanges lean at 72 degrees with the tear corner relief: the torn ends are helices over slanted bends | invariants | pass |
| sheet-metal/1979-every-cut-after-a-cut-machines-the-sheet | [tangency-labs/solidcraft#1979](https://github.com/tangency-labs/solidcraft/issues/1979) [tangency-labs/solidcraft#1980](https://github.com/tangency-labs/solidcraft/issues/1980) | on a folded sheet a rectangular cut-out and then twenty 4 mm holes in one sketch: a cut after a cut was dropped without a word, and many holes ran out of budget | analytic | pass |
| sheet-metal/262-fold-a-tab-just-inside-its-root | [tangency-labs/solidcraft#262](https://github.com/tangency-labs/solidcraft/issues/262) [tangency-labs/solidcraft#277](https://github.com/tangency-labs/solidcraft/issues/277) | a 20 x 20 tab folded 90 degrees on a line 1 mm inside its root, where the bend zone stays clear of the blank's outline | analytic | pass |
| sheet-metal/262-fold-at-a-tab-root-refused | [tangency-labs/solidcraft#262](https://github.com/tangency-labs/solidcraft/issues/262) [tangency-labs/solidcraft#277](https://github.com/tangency-labs/solidcraft/issues/277) | a fold exactly at a tab's root, where the bend zone (+-BA/2) would reach the blank's outline beside the tab, needs a bend relief | invariants | pass |
| sheet-metal/264-fold-one-of-two-collinear-tabs | [tangency-labs/solidcraft#264](https://github.com/tangency-labs/solidcraft/issues/264) [tangency-labs/solidcraft#279](https://github.com/tangency-labs/solidcraft/issues/279) | a 100 x 40 blank with two 15 x 7 tabs on one line, one tab folded 90 degrees on a line that the other tab also lies on | analytic | pass |
| sheet-metal/264-one-fold-across-two-collinear-tabs | [tangency-labs/solidcraft#264](https://github.com/tangency-labs/solidcraft/issues/264) | one fold line spanning both of two collinear tabs folds both | analytic | pass |
| sheet-metal/296-hole-in-a-base-with-two-adjacent-edge-flanges | [tangency-labs/solidcraft#296](https://github.com/tangency-labs/solidcraft/issues/296) [tangency-labs/solidcraft#355](https://github.com/tangency-labs/solidcraft/issues/355) | an 80 x 40 base with a 30 mm flange on the y = 0 edge and a 15 mm flange on the x = 80 edge, and a round hole through the base beside them: sew failed with a non-manifold edge contact | invariants | pass |
| sheet-metal/3078-flange-on-the-side-edge-of-a-flange | [tangency-labs/solidcraft#3078](https://github.com/tangency-labs/solidcraft/issues/3078) [tangency-labs/solidcraft#3274](https://github.com/tangency-labs/solidcraft/issues/3274) | an edge flange on the side edge of an existing wall, meeting a flange on the base across the existing bend with a round corner relief (not supported yet: a flange on the side of another flange) | invariants | pass |
| sheet-metal/3234-edge-flange-on-the-bend-line-refused | [tangency-labs/solidcraft#3234](https://github.com/tangency-labs/solidcraft/issues/3234) [tangency-labs/solidcraft#3273](https://github.com/tangency-labs/solidcraft/issues/3273) | a second edge flange picked on the bend line of an existing flange made a doubled flange with a gap and two shells in one body | invariants | pass |
| sheet-metal/3316-convert-a-plate-keeps-its-place | [tangency-labs/solidcraft#3316](https://github.com/tangency-labs/solidcraft/issues/3316) | a 100 x 60 x 2 plate converted from its top face moved down by one thickness (z -2..0 instead of 0..2) | analytic | pass |
| sheet-metal/3324-flat-pattern-refused-after-a-fillet-on-the-sheet | [tangency-labs/solidcraft#3324](https://github.com/tangency-labs/solidcraft/issues/3324) [tangency-labs/solidcraft#3325](https://github.com/tangency-labs/solidcraft/issues/3325) [tangency-labs/solidcraft#3418](https://github.com/tangency-labs/solidcraft/issues/3418) | a fillet on a sheet metal corner changes the body but not its sheet model, so the flat pattern would be a sharp rectangle: it must refuse | invariants | pass |
| sheet-metal/3353-mirrored-sheet-body-keeps-its-flat-pattern | [tangency-labs/solidcraft#3353](https://github.com/tangency-labs/solidcraft/issues/3353) [tangency-labs/solidcraft#3354](https://github.com/tangency-labs/solidcraft/issues/3354) | a sheet metal body mirrored into a new body must still be sheet metal (flat pattern, bend table): it was a plain solid | analytic | **FAIL**: step 13 (sheet.flat_pattern): invalid parameters for `sheet.flat_pattern`: `Body1 (2)` is not a sheet metal body |
| sheet-metal/3417-rhombus-with-a-flange-on-each-edge-and-square-reliefs | [tangency-labs/solidcraft#3417](https://github.com/tangency-labs/solidcraft/issues/3417) [tangency-labs/solidcraft#3421](https://github.com/tangency-labs/solidcraft/issues/3421) [tangency-labs/solidcraft#3280](https://github.com/tangency-labs/solidcraft/issues/3280) | a 60 mm rhombus (120 and 60 degree corners) with a 90 degree flange on each of its four edges and a square corner relief 8 mm across: the reliefs at the two 120 degree corners would overlap | invariants | pass |
| sheet-metal/349-unfold-a-tray-shrunk-by-a-parameter-72-degrees | [tangency-labs/solidcraft#349](https://github.com/tangency-labs/solidcraft/issues/349) | a 2000 x 2500 tray with four 38.6 mm flanges at 72 degrees whose sketch is driven by parameters W and H, shrunk to 400 x 300 and unfolded (the solver leaves 1e-13 mm residuals: the planar region arrangement failed) | analytic | pass |
| sheet-metal/349-unfold-a-tray-shrunk-by-a-parameter-90-degrees | [tangency-labs/solidcraft#349](https://github.com/tangency-labs/solidcraft/issues/349) | a 2000 x 2500 tray with four 38.6 mm flanges at 90 degrees whose sketch is driven by parameters W and H, shrunk to 400 x 300 and unfolded (the solver leaves 1e-13 mm residuals: the planar region arrangement failed) | analytic | pass |
| sheet-metal/405-tray-with-72-degree-flanges-folded | [tangency-labs/solidcraft#405](https://github.com/tangency-labs/solidcraft/issues/405) [tangency-labs/solidcraft#406](https://github.com/tangency-labs/solidcraft/issues/406) | a 120 x 90 tray with four 38.6 mm flanges at 72 degrees closed with the rule's gap: the corners used to stay open as a V | invariants | pass |
| sheet-metal/405-unfold-a-tray-with-72-degree-flanges | [tangency-labs/solidcraft#405](https://github.com/tangency-labs/solidcraft/issues/405) [tangency-labs/solidcraft#406](https://github.com/tangency-labs/solidcraft/issues/406) | a 120 x 90 tray with four 38.6 mm flanges at 72 degrees, closed at the corners with the rule's gap, unfolded | analytic | pass |
| sheet-metal/416-round-hole-and-slanted-slot-across-a-bend | [tangency-labs/solidcraft#416](https://github.com/tangency-labs/solidcraft/issues/416) [tangency-labs/solidcraft#425](https://github.com/tangency-labs/solidcraft/issues/425) [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a 160 x 100 plate with a 90 degree flange, unfolded, a 20 mm round hole and a 10 x 24 slot turned 30 degrees cut across the bend zone, refolded: the cut-out walls fold to curves on the bend's cylinder | analytic | pass |
| sheet-metal/436-edge-flanges-at-105-and-120-degrees-on-opposite-edges | [tangency-labs/solidcraft#436](https://github.com/tangency-labs/solidcraft/issues/436) [tangency-labs/solidcraft#447](https://github.com/tangency-labs/solidcraft/issues/447) | one edge flange feature with its own angle and height on each of two opposite edges: 105 degrees and 30 mm, 120 degrees and 25 mm | analytic | pass |
| sheet-metal/436-edge-flanges-with-their-own-height-on-opposite-edges | [tangency-labs/solidcraft#436](https://github.com/tangency-labs/solidcraft/issues/436) [tangency-labs/solidcraft#447](https://github.com/tangency-labs/solidcraft/issues/447) | one edge flange feature whose two edges carry their own heights (30 and 25 mm) over the feature's 20 mm default | analytic | pass |
| sheet-metal/436-unfold-a-tray-with-four-angles-and-heights | [tangency-labs/solidcraft#436](https://github.com/tangency-labs/solidcraft/issues/436) [tangency-labs/solidcraft#447](https://github.com/tangency-labs/solidcraft/issues/447) [tangency-labs/solidcraft#501](https://github.com/tangency-labs/solidcraft/issues/501) | one edge flange feature whose four edges carry 75, 90, 105 and 120 degrees and heights 38.6, 38.6, 30 and 25, with corners between unequal angles closed, unfolded | analytic | pass |
| sheet-metal/479-unfold-a-tray-with-round-relieved-corners | [tangency-labs/solidcraft#479](https://github.com/tangency-labs/solidcraft/issues/479) | a 120 x 90 tray with four 20 mm 90 degree flanges and corner relief shape round, unfolded | analytic | pass |
| sheet-metal/488-unfold-a-tray-with-square-relieved-corners | [tangency-labs/solidcraft#488](https://github.com/tangency-labs/solidcraft/issues/488) | a 120 x 90 tray with four 20 mm 90 degree flanges and corner relief shape rectangular, unfolded | analytic | pass |
| sheet-metal/514-refold-an-L-bracket-after-unfolding-it | [tangency-labs/solidcraft#514](https://github.com/tangency-labs/solidcraft/issues/514) | an L bracket unfolded and refolded: the refold must give the folded part back | analytic | pass |
| sheet-metal/514-unfold-an-L-bracket | [tangency-labs/solidcraft#514](https://github.com/tangency-labs/solidcraft/issues/514) | a 60 x 40 base with a 20 mm 90 degree flange on one edge, unfolded: the flat plate is the base, the bend allowance and the flange's straight | analytic | pass |
| sheet-metal/529-a-hundred-slots-and-four-folds | [tangency-labs/solidcraft#529](https://github.com/tangency-labs/solidcraft/issues/529) [tangency-labs/solidcraft#430](https://github.com/tangency-labs/solidcraft/issues/430) [tangency-labs/solidcraft#964](https://github.com/tangency-labs/solidcraft/issues/964) | a 200 x 300 panel with a hundred 4.4 x 20 slots and four 90 degree folds (one per side tab): the flat geometry ran out of its processing budget above 77 slots | analytic | pass |
| sheet-metal/541-box-cut-straight-through-a-flat-sheet | [tangency-labs/solidcraft#541](https://github.com/tangency-labs/solidcraft/issues/541) | a solid.box cut straight through a 100 x 60 x 2.5 sheet was refused, though the same rectangle as an extrude cut works | analytic | pass |
| sheet-metal/542-round-hole-in-a-flat-sheet-and-its-flat-pattern | [tangency-labs/solidcraft#542](https://github.com/tangency-labs/solidcraft/issues/542) [tangency-labs/solidcraft#552](https://github.com/tangency-labs/solidcraft/issues/552) | a 3.2 mm round hole cut through a 100 x 60 x 2.5 sheet, which the flat pattern must report as a circle | analytic | pass |
| sheet-metal/560-hole-through-a-sheet-metal-base | [tangency-labs/solidcraft#560](https://github.com/tangency-labs/solidcraft/issues/560) [tangency-labs/solidcraft#656](https://github.com/tangency-labs/solidcraft/issues/656) | solid.hole square to a flat sheet metal panel was refused as sheet machining that cannot be preserved | analytic | pass |
| sheet-metal/570-flange-refuses-thickness-it-would-ignore | [tangency-labs/solidcraft#570](https://github.com/tangency-labs/solidcraft/issues/570) [tangency-labs/solidcraft#594](https://github.com/tangency-labs/solidcraft/issues/594) [tangency-labs/solidcraft#572](https://github.com/tangency-labs/solidcraft/issues/572) | sheet.flange given thickness, k_factor and bend_radius, which the rule alone defines, used to ignore them silently and build the 2.5 mm default | invariants | pass |
| sheet-metal/601-return-lip-on-a-flanges-far-edge | [tangency-labs/solidcraft#593](https://github.com/tangency-labs/solidcraft/issues/593) [tangency-labs/solidcraft#601](https://github.com/tangency-labs/solidcraft/issues/601) | an edge flange stands on the far edge of another edge flange (a lip turned in over the base), both 90 degrees | analytic | pass |
| sheet-metal/634-flange-beside-the-leg-of-an-L-folded | [tangency-labs/solidcraft#634](https://github.com/tangency-labs/solidcraft/issues/634) | the same bar with its leg and a 15 mm inside flange on the bar's top edge, folded | analytic | pass |
| sheet-metal/634-unfold-a-flange-beside-the-leg-of-an-L | [tangency-labs/solidcraft#634](https://github.com/tangency-labs/solidcraft/issues/634) | a 160 x 30 bar with a 20 x 30 leg past its top edge at the left end, and a 90 degree 15 mm inside flange on the bar's top edge (x 20..160), unfolded: the flange's trim cut the leg away | analytic | pass |
| sheet-metal/638-fold-both-collinear-tabs-one-after-the-other | [tangency-labs/solidcraft#638](https://github.com/tangency-labs/solidcraft/issues/638) [tangency-labs/solidcraft#652](https://github.com/tangency-labs/solidcraft/issues/652) [tangency-labs/solidcraft#963](https://github.com/tangency-labs/solidcraft/issues/963) | two collinear tabs folded in two features on the same line; the second fold used to be refused as crossing a slanted edge | analytic | pass |
| sheet-metal/639-fold-tab-on-inside-edge-of-an-L-blank | [tangency-labs/solidcraft#639](https://github.com/tangency-labs/solidcraft/issues/639) [tangency-labs/solidcraft#653](https://github.com/tangency-labs/solidcraft/issues/653) [tangency-labs/solidcraft#963](https://github.com/tangency-labs/solidcraft/issues/963) | a tab (x 45..60, y 60..90) on an inside edge of an L-shaped blank folded 90 degrees at x = 59 with the fixed point on the other leg; refused as folding tabs that join again | analytic | pass |
| sheet-metal/659-ellipse-cutout-across-a-bend | [tangency-labs/solidcraft#659](https://github.com/tangency-labs/solidcraft/issues/659) [tangency-labs/solidcraft#692](https://github.com/tangency-labs/solidcraft/issues/692) | a 160 x 100 plate with a 90 degree flange, unfolded, a 24 x 12 ellipse cut across the bend zone and refolded: the cut's wall folds to a curve on the bend's cylinder | analytic | pass |
| sheet-metal/659-ellipse-cutout-in-a-flat-sheet | [tangency-labs/solidcraft#659](https://github.com/tangency-labs/solidcraft/issues/659) [tangency-labs/solidcraft#692](https://github.com/tangency-labs/solidcraft/issues/692) | a 20 x 12 ellipse cut through a 100 x 60 x 2.5 sheet: it became 0.001 mm chords, one face each | analytic | pass |
| sheet-metal/685-fold-with-the-fixed-point-on-the-top-face | [tangency-labs/solidcraft#958](https://github.com/tangency-labs/solidcraft/issues/958) | a large thin blank folded across its whole width with the fixed point exactly on the sheet's top face | analytic | pass |
| sheet-metal/702-flange-along-what-a-cutout-leaves | [tangency-labs/solidcraft#702](https://github.com/tangency-labs/solidcraft/issues/702) | a 200 x 100 plate whose bottom-left 100 x 60 is cut away, and a 90 degree 40 mm inside flange picked on what is left of the bottom edge (x 100..200) | analytic | pass |
| sheet-metal/723-tray-with-torn-corners-folded | [tangency-labs/solidcraft#723](https://github.com/tangency-labs/solidcraft/issues/723) [tangency-labs/solidcraft#809](https://github.com/tangency-labs/solidcraft/issues/809) [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a 120 x 90 tray with four 20 mm 90 degree flanges and the tear corner relief: each torn bend end is a helical cut across the bend | invariants | pass |
| sheet-metal/723-unfold-a-tray-with-torn-corners | [tangency-labs/solidcraft#723](https://github.com/tangency-labs/solidcraft/issues/723) [tangency-labs/solidcraft#809](https://github.com/tangency-labs/solidcraft/issues/809) [tangency-labs/solidcraft#1797](https://github.com/tangency-labs/solidcraft/issues/1797) [tangency-labs/solidcraft#1799](https://github.com/tangency-labs/solidcraft/issues/1799) | a 120 x 90 tray with four 20 mm 90 degree flanges and corner relief shape tear, unfolded | analytic | pass |
| sheet-metal/725-convert-a-shelled-tray-and-unfold-it | [tangency-labs/solidcraft#647](https://github.com/tangency-labs/solidcraft/issues/647) [tangency-labs/solidcraft#725](https://github.com/tangency-labs/solidcraft/issues/725) [tangency-labs/solidcraft#1285](https://github.com/tangency-labs/solidcraft/issues/1285) [tangency-labs/solidcraft#1340](https://github.com/tangency-labs/solidcraft/issues/1340) | a 100 x 60 x 30 box shelled to 2 mm, converted to sheet metal by its four bottom edges and unfolded | analytic | pass |
| sheet-metal/774-convert-a-plate-with-nine-round-holes | [tangency-labs/solidcraft#774](https://github.com/tangency-labs/solidcraft/issues/774) [tangency-labs/solidcraft#977](https://github.com/tangency-labs/solidcraft/issues/977) | a 30 x 30 x 2 plate with nine 4 mm holes converted to sheet metal (refused as not a plate of even thickness: the holes were read as polygons) | analytic | pass |
| sheet-metal/839-flange-on-a-plate-with-rounded-corners-unfolded | [tangency-labs/solidcraft#839](https://github.com/tangency-labs/solidcraft/issues/839) | a 200 x 100 plate with its corners rounded 8 and one 40 mm inside flange on its bottom edge, unfolded: the trim made the outline's arcs chords | analytic | pass |
| sheet-metal/955-hole-drilled-into-a-sheet-metal-rim | [tangency-labs/solidcraft#955](https://github.com/tangency-labs/solidcraft/issues/955) | a 2 mm hole drilled 10 mm deep into the rim of a 4 mm sheet, along the panel; it is a bore the panel keeps | analytic | pass |
| sheet-metal/978-edge-flange-beside-a-ledge-as-tall-as-its-setback | [tangency-labs/solidcraft#978](https://github.com/tangency-labs/solidcraft/issues/978) | a 90 degree inside flange of radius 1 on an edge that has a ledge beside it exactly as tall as the flange's setback (3 mm): sew failed with a degenerate edge | invariants | pass |
| shell/12-offset-one-split-face-piece | [tangency-labs/solidcraft#12](https://github.com/tangency-labs/solidcraft/issues/12) | Offset Face on one piece of a split face moves only that piece, not the coplanar neighbour | analytic | pass |
| shell/1494-shell-box-with-cylinder-on-edge-line | [tangency-labs/solidcraft#1494](https://github.com/tangency-labs/solidcraft/issues/1494) | a 47.5x45x30 box with a cylinder r7.5 joined on its side whose axis lies in the plane of the box's front face (y=0), shelled 1 mm open at the bottom | invariants | **FAIL**: step 3 (solid.shell): SMLib shell: operation: SMLib failed (status 1001) |
| shell/1525-shell-box-with-rounds-chamfer-and-fillet | [tangency-labs/solidcraft#1525](https://github.com/tangency-labs/solidcraft/issues/1525) | a 50x50x30 box with r10 vertical rounds, a 5 mm chamfer round the base and a 4 mm fillet where the chamfer meets the wall, shelled 2 mm open at the top | invariants | **FAIL**: step 4 (solid.fillet): SMLib fillet: SMLib's check refuses the result: 3 failed tests: SmBrep::Test #59 Tolerance: Edge tolerance relative to brep tolerance (of |
| shell/1972-shell-one-half-sphere-leaves-the-other | [tangency-labs/solidcraft#1972](https://github.com/tangency-labs/solidcraft/issues/1972) | a sphere split into two hemispheres; shelling the flat face of one must hollow that half only, the other half stays solid | analytic | pass |
| shell/2531-shell-point-pick-after-parameter-edit | [tangency-labs/solidcraft#2531](https://github.com/tangency-labs/solidcraft/issues/2531) | a shell opened by a point pick keeps opening only that face after a parameter edit moves the body under the stored point | analytic | **FAIL**: volume_mm3 17952 (want 22112) |
| shell/2939-offset-face-sphere | [tangency-labs/solidcraft#2939](https://github.com/tangency-labs/solidcraft/issues/2939) | Offset Face on a sphere's round face | analytic | pass |
| shell/3103-shell-tapered-cylinder | [tangency-labs/solidcraft#3103](https://github.com/tangency-labs/solidcraft/issues/3103) | a cone frustum (r20 at the base, r15 at the top, 30 tall) shelled 2 mm open at the top | analytic | pass |
| shell/3283-offset-face-cylinder-wall | [tangency-labs/solidcraft#3283](https://github.com/tangency-labs/solidcraft/issues/3283) [tangency-labs/solidcraft#3650](https://github.com/tangency-labs/solidcraft/issues/3650) | Offset Face on the outer cylindrical wall of a tube (the picker only accepted planar faces) | analytic | pass |
| shell/3468-offset-face-boss-wall-next-to-fillet | [tangency-labs/solidcraft#3468](https://github.com/tangency-labs/solidcraft/issues/3468) [tangency-labs/solidcraft#3898](https://github.com/tangency-labs/solidcraft/issues/3898) | Offset Face on a boss wall whose base has a 2 mm fillet: the boss grows to r 11 and the fillet follows | analytic | **FAIL**: step 4 (solid.offset_face): SMLib offset faces: SMLib's check refuses the result: 4 failed tests: SmBrep::Test #59 Tolerance: Edge tolerance relative to brep to |
| shell/3506-split-body-then-shell-both-halves | [tangency-labs/solidcraft#3506](https://github.com/tangency-labs/solidcraft/issues/3506) | a box split in two at z=10, then each half shelled 2 mm open on the mating face | analytic | pass |
| shell/3576-shell-tapered-box-rounded-corners | [tangency-labs/solidcraft#3576](https://github.com/tangency-labs/solidcraft/issues/3576) [tangency-labs/solidcraft#3573](https://github.com/tangency-labs/solidcraft/issues/3573) | a 120x80x40 box drafted 5 degrees with 4 mm rounds on the sloping corners, shelled 2 mm open at the top: the inner rounds' edges must lie on their faces (#3573 reports the same design) | invariants | **FAIL**: step 6 (solid.shell): SMLib shell: SMLib's check refuses the result: 12 failed tests: SmBSplineSurface::Test #5 Bad NonMonotonic CPts: SmBSplineSurface Control |
| shell/3669-shell-lofted-square-frustum | [tangency-labs/solidcraft#3669](https://github.com/tangency-labs/solidcraft/issues/3669) [tangency-labs/solidcraft#2990](https://github.com/tangency-labs/solidcraft/issues/2990) | a loft between a 40 mm and a 20 mm square 80 mm apart, shelled 2 mm open at the small end | analytic | pass |
| shell/391-deboss-text-on-flange-of-filleted-shelled-body | [tangency-labs/solidcraft#391](https://github.com/tangency-labs/solidcraft/issues/391) | text debossed 0.6 mm into the flat flange top of a filleted and shelled tapered housing, well away from the curved walls | invariants | not supported yet: step 8 (solid.extrude): not supported yet: SMLib draft extrusion with a straight foot |
| shell/4009-closed-shell-internal-void | [tangency-labs/solidcraft#4009](https://github.com/tangency-labs/solidcraft/issues/4009) | shell with no face removed: a closed hollow body with a sealed internal void | analytic | **FAIL**: step 5 (solid.shell): invalid parameters for `solid.shell`: select 1…1000 faces |
| shell/4010-shell-open-at-through-hole-wall | [tangency-labs/solidcraft#4010](https://github.com/tangency-labs/solidcraft/issues/4010) | plate with a through hole shelled 2.5 mm with only the hole's wall removed | analytic | pass |
| shell/566-shell-swept-bar-with-bend | [tangency-labs/solidcraft#566](https://github.com/tangency-labs/solidcraft/issues/566) | a 8x5 bar swept along a line-arc-line path (quarter circle r30 between two 30 mm legs), shelled 0.5 mm open at its start | analytic | pass |
| shell/745-offset-face-on-body-with-distant-freeform-boss | [tangency-labs/solidcraft#745](https://github.com/tangency-labs/solidcraft/issues/745) [tangency-labs/solidcraft#3893](https://github.com/tangency-labs/solidcraft/issues/3893) | Offset Face on a planar end of a body that has a spline-outlined boss far from the moved face | invariants | pass |
| shell/745-offset-face-then-cut-boss-away | [tangency-labs/solidcraft#745](https://github.com/tangency-labs/solidcraft/issues/745) [tangency-labs/solidcraft#3893](https://github.com/tangency-labs/solidcraft/issues/3893) | the same end offset, then the boss and the box beyond x=24 cut away, which leaves an analytic body | analytic | pass |
| sweeps/1093-circular-pattern-of-a-lofted-join-blade | [tangency-labs/solidcraft#1093](https://github.com/tangency-labs/solidcraft/issues/1093) [tangency-labs/solidcraft#1107](https://github.com/tangency-labs/solidcraft/issues/1107) | a tapered lofted blade (6 x 3 root embedded 2 mm into a disk, 3 x 1.5 tip) joined to a disk and patterned 9 times round the axis as joins (31 minutes with eight retries, or "cavity ownership is ambiguous") | analytic | pass |
| sweeps/1140-loft-hollow-tube-bands-halved-and-joined | [tangency-labs/solidcraft#1140](https://github.com/tangency-labs/solidcraft/issues/1140) | two hollow lofted tube bands (outer r 30, bore r 18 on R100, 5 sections each, 45 degrees each), each cut in half through its axis plane z = 0 and the halves joined into one body ("no result" after ten minutes of fallbacks) | analytic | pass |
| sweeps/1184-loft-ring-sections-keep-the-hole | [tangency-labs/solidcraft#1184](https://github.com/tangency-labs/solidcraft/issues/1184) [tangency-labs/solidcraft#1254](https://github.com/tangency-labs/solidcraft/issues/1254) [tangency-labs/solidcraft#2435](https://github.com/tangency-labs/solidcraft/issues/2435) [tangency-labs/solidcraft#2447](https://github.com/tangency-labs/solidcraft/issues/2447) | a loft between two ring sections (outer r 20, inner r 12) 20 mm apart (the hole was dropped and a solid disc built) | analytic | not supported yet: step 9 (solid.loft): not supported yet: SMLib loft through sections with holes |
| sweeps/1269-sweep-parallel-orientation-oblique-cylinder | [tangency-labs/solidcraft#1269](https://github.com/tangency-labs/solidcraft/issues/1269) | a circle of radius 5 on XY swept with orientation parallel along a path rising 20 mm while leaning 20 mm in x (the profile does not turn: a sheared cylinder) | analytic | pass |
| sweeps/1269-sweep-twisted-square-ninety-degrees | [tangency-labs/solidcraft#1269](https://github.com/tangency-labs/solidcraft/issues/1269) | a 10 x 10 square swept 40 mm along a straight path while turning 90 degrees about the path | analytic | not supported yet: step 7 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/1391-flange-flush-on-the-end-of-a-bent-tapered-loft-20deg | [tangency-labs/solidcraft#1391](https://github.com/tangency-labs/solidcraft/issues/1391) [tangency-labs/solidcraft#1556](https://github.com/tangency-labs/solidcraft/issues/1556) | a half tube (6 mm wall, inner radius tapering 60 to 75 mm) lofted through 5 sections along an R300 bend of 20 degrees, with an 8 mm half-annulus flange (inner radius +3 into the wall, outer +25 beyond it) extruded from the end plane outward and joined: the flange face lies in the end plane ("Union: no result") | analytic | pass |
| sweeps/1391-flange-flush-on-the-end-of-a-bent-tapered-loft-40deg | [tangency-labs/solidcraft#1391](https://github.com/tangency-labs/solidcraft/issues/1391) [tangency-labs/solidcraft#1556](https://github.com/tangency-labs/solidcraft/issues/1556) | a half tube (6 mm wall, inner radius tapering 60 to 75 mm) lofted through 5 sections along an R300 bend of 40 degrees, with an 8 mm half-annulus flange (inner radius +3 into the wall, outer +25 beyond it) extruded from the end plane outward and joined: the flange face lies in the end plane ("Union: no result") | analytic | pass |
| sweeps/1411-coil-intersected-with-a-cylinder-holding-it | [tangency-labs/solidcraft#1411](https://github.com/tangency-labs/solidcraft/issues/1411) | a 4-turn coil (centre diameter 40, wire 3 mm, pitch 8) intersected with a cylinder of radius 25 and height 40 that holds it (crash report: unclean exit in solid.coil) | analytic | pass |
| sweeps/1490-loft-joined-into-a-window-of-a-wall-that-it-overhangs | [tangency-labs/solidcraft#1490](https://github.com/tangency-labs/solidcraft/issues/1490) | a wall 2.5 mm thick with a 30 x 20 window cut through it and a loft (34 x 24 growing to 38 x 28 over 3.5 mm) joined into the window so that its strips overhang the wall on both faces ("Union: no result" at some wall thicknesses) | analytic | pass |
| sweeps/1666-loft-zigzag-to-flat-rectangle | [tangency-labs/solidcraft#1666](https://github.com/tangency-labs/solidcraft/issues/1666) | a ruled loft from an 18-vertex zig-zag section to a flat 52 x 3 rectangle with 18 vertices (8 of them collinear), whose twisted ruled faces were exported as crossing triangles | analytic | pass |
| sweeps/1669-mirrored-window-and-loft-on-a-hollow-case | [tangency-labs/solidcraft#1669](https://github.com/tangency-labs/solidcraft/issues/1669) | a closed hollow box (60 x 60 x 40, 2.5 mm walls) with a window cut in one end wall and a loft joined into it, both mirrored about the middle plane x = 30 onto the far wall ("Union: no result" on the mirror only) | analytic | pass |
| sweeps/1853-revolve-cut-half-a-slot-about-its-centreline | [tangency-labs/solidcraft#1853](https://github.com/tangency-labs/solidcraft/issues/1853) [tangency-labs/solidcraft#1866](https://github.com/tangency-labs/solidcraft/issues/1866) | half a slot (r 3, centres 14 apart) revolved a full turn about its own centreline, which lies in the top face of a plate, as a cut (no result after about 10 s of retries) | analytic | pass |
| sweeps/1856-disk-and-36-twisted-lofted-blades-joined | [tangency-labs/solidcraft#2992](https://github.com/tangency-labs/solidcraft/issues/2992) [tangency-labs/solidcraft#1856](https://github.com/tangency-labs/solidcraft/issues/1856) | a disk joined to 36 patterned twisted lofted blades (each a loft of 9 rectangle sections turning 7.5 degrees apart, rooted 2 mm inside the disk): hang of minutes | analytic | **HANG**: no result after 180 s |
| sweeps/1866-revolve-half-slot-profile-180 | [tangency-labs/solidcraft#1866](https://github.com/tangency-labs/solidcraft/issues/1866) | half a slot (r 3, centres 14 apart; the segment before the axis edge comes back to the axis along an arc) revolved 180 deg about its centreline | analytic | pass |
| sweeps/1866-revolve-half-slot-profile-90 | [tangency-labs/solidcraft#1866](https://github.com/tangency-labs/solidcraft/issues/1866) | half a slot (r 3, centres 14 apart; the segment before the axis edge comes back to the axis along an arc) revolved 90 deg about its centreline | analytic | pass |
| sweeps/2005-closed-sweep-twisted-cut-inside-a-torus | [tangency-labs/solidcraft#2005](https://github.com/tangency-labs/solidcraft/issues/2005) [tangency-labs/solidcraft#2010](https://github.com/tangency-labs/solidcraft/issues/2010) | an 8 x 8 square swept a full turn round a circle of radius 30 with a 180 degree twist, cut from a torus (R 30, r 8) that holds it (no result, or minutes) | analytic | not supported yet: step 11 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/2005-closed-sweep-twisted-new-body | [tangency-labs/solidcraft#2005](https://github.com/tangency-labs/solidcraft/issues/2005) [tangency-labs/solidcraft#2010](https://github.com/tangency-labs/solidcraft/issues/2010) | an 8 x 8 square swept a full turn round a circle of radius 30 with a 90 degree twist, as a new body (the sweep that closes on itself) | analytic | not supported yet: step 7 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/201-loft-one-guide-rail-cone-frustum | [tangency-labs/solidcraft#201](https://github.com/tangency-labs/solidcraft/issues/201) [tangency-labs/solidcraft#3371](https://github.com/tangency-labs/solidcraft/issues/3371) | a loft from a circle of radius 5 to a circle of radius 10, 20 mm above, guided by one straight rail through (5,0,0) and (10,0,20) | analytic | not supported yet: step 10 (solid.loft): not supported yet: SMLib loft along guide rails |
| sweeps/2056-rib-grows-along-the-sketch-normal-to-the-part | [tangency-labs/solidcraft#2056](https://github.com/tangency-labs/solidcraft/issues/2056) [tangency-labs/solidcraft#2057](https://github.com/tangency-labs/solidcraft/issues/2057) | a rib drawn on a plane 20 mm in front of a block (parallel to XZ, a 40 mm line along X) with direction normal, growing toward the block | analytic | pass |
| sweeps/2183-revolve-profile-crosses-the-axis-refused | [tangency-labs/solidcraft#2453](https://github.com/tangency-labs/solidcraft/issues/2453) [tangency-labs/solidcraft#2183](https://github.com/tangency-labs/solidcraft/issues/2183) | a rectangle that straddles the revolve axis (x from -5 to 15 about the sketch y axis) | invariants | pass |
| sweeps/2295-revolve-cut-torus-by-an-overlapping-ring | [tangency-labs/solidcraft#2295](https://github.com/tangency-labs/solidcraft/issues/2295) | a torus (R 10, r 5) cut by a disc of radius 5 centred at (15,0) in the XZ plane revolved about Z (the disc overlaps the torus tube) | analytic | pass |
| sweeps/2435-loft-rectangular-ring-sections | [tangency-labs/solidcraft#2435](https://github.com/tangency-labs/solidcraft/issues/2435) [tangency-labs/solidcraft#2447](https://github.com/tangency-labs/solidcraft/issues/2447) | a loft between two rectangular ring sections (a rectangle with a rectangular hole), 24 mm apart, tapering outer 40 x 30 to 28 x 20 and hole 20 x 14 to 12 x 6 | analytic | not supported yet: step 9 (solid.loft): not supported yet: SMLib loft through sections with holes |
| sweeps/2516-revolve-about-a-named-construction-axis | [tangency-labs/solidcraft#3796](https://github.com/tangency-labs/solidcraft/issues/3796) [tangency-labs/solidcraft#3619](https://github.com/tangency-labs/solidcraft/issues/3619) [tangency-labs/solidcraft#2516](https://github.com/tangency-labs/solidcraft/issues/2516) | a rectangle revolved about a construction axis picked by name ("unknown sketch line `Axis1`") | analytic | **FAIL**: step 5 (solid.revolve): unknown sketch line `Axis1` |
| sweeps/2552-thread-groove-cut-by-a-square-coil-in-a-bore | [tangency-labs/solidcraft#2552](https://github.com/tangency-labs/solidcraft/issues/2552) | a square-wire coil (diameter 10, section 0.9 inside, pitch 1.5, height 10) cut as a helical groove into the wall of a bore of radius 4.1 in a 30 x 30 x 12 block (crash report: unclean exit in solid.coil) | analytic | **CRASH**: process exited (signal: 11 (SIGSEGV) (core dumped)) without a result: |
| sweeps/2570-loft-circle-to-a-non-star-shaped-comb | [tangency-labs/solidcraft#2570](https://github.com/tangency-labs/solidcraft/issues/2570) [tangency-labs/solidcraft#3670](https://github.com/tangency-labs/solidcraft/issues/3670) | a loft between a circle and a 20-edge comb outline (not star-shaped from its centroid: the teeth turn the vertex directions back on themselves), 40 mm apart (the circle was wound about ten times, the app froze) | invariants | **FAIL**: step 7 (solid.loft): invalid input: an arc turns more than once |
| sweeps/2607-revolve-axis-outside-the-sketch-plane-refused | [tangency-labs/solidcraft#3736](https://github.com/tangency-labs/solidcraft/issues/3736) [tangency-labs/solidcraft#2607](https://github.com/tangency-labs/solidcraft/issues/2607) | a profile on the XZ plane revolved about the world Y axis, which does not lie in the sketch plane | invariants | pass |
| sweeps/2667-revolve-half-disc-sphere | [tangency-labs/solidcraft#2667](https://github.com/tangency-labs/solidcraft/issues/2667) | a half disc of radius 6 on the axis revolved a full turn (mutation survivor: half_disc area factor) | analytic | pass |
| sweeps/2667-revolve-half-disc-three-quarters | [tangency-labs/solidcraft#2667](https://github.com/tangency-labs/solidcraft/issues/2667) | the same half disc revolved 270 degrees (mutation survivor: full_circle test of the sweep angle) | analytic | pass |
| sweeps/2667-sweep-hostile-end-scale-refused | [tangency-labs/solidcraft#2667](https://github.com/tangency-labs/solidcraft/issues/2667) | a sweep with an end scale of 500 (the engine allows 0.01 to 100): the option check (SweepControl::check) must refuse it | invariants | pass |
| sweeps/271-loft-cut-with-targets-keeps-the-bystander | [tangency-labs/solidcraft#271](https://github.com/tangency-labs/solidcraft/issues/271) [tangency-labs/solidcraft#286](https://github.com/tangency-labs/solidcraft/issues/286) [tangency-labs/solidcraft#299](https://github.com/tangency-labs/solidcraft/issues/299) | a loft cut limited by targets to one body while a second body lies inside the loft | analytic | pass |
| sweeps/2820-pipe-cut-oblique-hole-through-a-block | [tangency-labs/solidcraft#2820](https://github.com/tangency-labs/solidcraft/issues/2820) | a pipe of diameter 6 cut through a 40 x 40 x 20 block along a line leaning 30 degrees from the vertical | analytic | pass |
| sweeps/2820-pipe-hollow-with-a-wall-along-a-bend | [tangency-labs/solidcraft#2820](https://github.com/tangency-labs/solidcraft/issues/2820) | a hollow pipe (outer diameter 10, wall 2) along a path of two lines joined by a tangent R20 quarter arc | analytic | **FAIL**: step 6 (solid.pipe): SMLib sweep: SMLib failed (status 1001) |
| sweeps/2847-loft-rectangles-turning-through-half-a-turn | [tangency-labs/solidcraft#2847](https://github.com/tangency-labs/solidcraft/issues/2847) [tangency-labs/solidcraft#3452](https://github.com/tangency-labs/solidcraft/issues/3452) | a loft through 19 identical 6 x 4 rectangles on planes turning about the Z axis every 10 degrees from 0 to 180 degrees, centred 30 mm from the axis (volume came out 6 % of the expected at 180 degrees, no error) | analytic | **FAIL**: volume_mm3 -127.306602 (want 2261.946711); bbox.max [33, 33.208374, 2] (want [33, 33, 2]) |
| sweeps/2862-three-pipes-meeting-at-one-point | [tangency-labs/solidcraft#2862](https://github.com/tangency-labs/solidcraft/issues/2862) | three pipes of diameter 4.4 and length 20 along +X, +Y and +Z, all ending at the origin, joined (a non-planar tripod junction: kernel panics, then no result) | analytic | not supported yet: step 7 (solid.pipe): not supported yet: SMLib sweep along a path of points (a 3D sketch curve) |
| sweeps/2891-twisted-sweep-cut-through-a-tube | [tangency-labs/solidcraft#2891](https://github.com/tangency-labs/solidcraft/issues/2891) [tangency-labs/solidcraft#3695](https://github.com/tangency-labs/solidcraft/issues/3695) | a 20 x 20 square swept 250 mm along the axis of a tube (ID 20, OD 30, 250 long) with a 30 degree twist, cut from it (the twisted cut froze the app) | analytic | not supported yet: step 12 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/2947-revolve-300-degrees-intersected-by-a-plate | [tangency-labs/solidcraft#2947](https://github.com/tangency-labs/solidcraft/issues/2947) [tangency-labs/solidcraft#2948](https://github.com/tangency-labs/solidcraft/issues/2948) | a rectangle section revolved 300 degrees about Z, then intersected with a plate (slab /y/ <= 5) crossing the ring at the start/end gap side and the far side (boolean gave up: "loop not inside any face piece") | analytic | pass |
| sweeps/3006-second-sweep-from-a-plane-along-a-closed-path | [tangency-labs/solidcraft#3006](https://github.com/tangency-labs/solidcraft/issues/3006) | a circle of radius 3 on a plane at 0.5 of a closed circular path (R 30) swept round it, then a 5 x 5 square on a plane at 0.75 swept round the same path and joined (it did not follow the path) | analytic | **FAIL**: step 13 (solid.sweep): SMLib export: the mapped B-rep does not validate: portable B-rep: a closed shell bounds two regions and encloses one |
| sweeps/3088-coil-thread-joined-flush-with-a-cylinder | [tangency-labs/solidcraft#3088](https://github.com/tangency-labs/solidcraft/issues/3088) [tangency-labs/solidcraft#3758](https://github.com/tangency-labs/solidcraft/issues/3758) | a 4-turn square coil (4 mm wire, pitch 9, outer diameter 30.8, section inside) joined round a cylinder of radius 15 and height 40, its ends flush with the cylinder end faces (hang of several minutes, crash report) | analytic | pass |
| sweeps/3111-loft-rectangular-ring-to-circular-ring | [tangency-labs/solidcraft#3111](https://github.com/tangency-labs/solidcraft/issues/3111) | a loft from a rectangular ring (two nested rectangles) to a circular ring (two concentric circles) 30 mm above: a hollow transition piece | invariants | not supported yet: step 9 (solid.loft): not supported yet: SMLib loft through sections with holes |
| sweeps/3156-revolve-join-end-faces-flush-with-a-face | [tangency-labs/solidcraft#3156](https://github.com/tangency-labs/solidcraft/issues/3156) [tangency-labs/solidcraft#3224](https://github.com/tangency-labs/solidcraft/issues/3224) | a rectangle revolved plus and minus 90 degrees about an axis in a plate top face: both planar end faces lie in that face and the join needed a tool nudge | analytic | pass |
| sweeps/3191-revolve-cut-leaves-a-cone | [tangency-labs/solidcraft#3911](https://github.com/tangency-labs/solidcraft/issues/3911) [tangency-labs/solidcraft#3191](https://github.com/tangency-labs/solidcraft/issues/3191) | a triangle sharing the cylinder side and top rim revolved as a cut to leave a cone (the cut never completed) | analytic | **FAIL**: step 5 (solid.revolve): invalid input: the profile crosses the revolve axis |
| sweeps/3326-loft-20mm-square-to-a-circle | [tangency-labs/solidcraft#3326](https://github.com/tangency-labs/solidcraft/issues/3326) [tangency-labs/solidcraft#3402](https://github.com/tangency-labs/solidcraft/issues/3402) | a loft from a 20 mm square to a circle of radius 10 offset 20 mm (the loft tool symbol): the loft geometry looked wrong | invariants | pass |
| sweeps/3345-sweep-profile-mid-line-round-a-rounded-rectangle | [tangency-labs/solidcraft#3345](https://github.com/tangency-labs/solidcraft/issues/3345) | a 4 x 3 profile drawn at the middle of the bottom line of a closed 60 x 40 rounded-rectangle path (corner radius 8) and swept round the whole path (walls offset, fillets turned the wrong way) | analytic | **FAIL**: bbox.min [-46.165028, -36.165028, -1.5] (want [-32, -22, -1.5]); bbox.max [46.165028, 36.165028, 1.5] (want [32, 22, 1.5]) |
| sweeps/3412-loft-sections-in-one-plane-refused | [tangency-labs/solidcraft#3412](https://github.com/tangency-labs/solidcraft/issues/3412) | a loft through two circles drawn on the same plane (no volume between them; it built a flat zero-volume body and reported success) | invariants | pass |
| sweeps/3505-extrude-the-flat-wall-of-a-sweep-with-a-corner | [tangency-labs/solidcraft#3505](https://github.com/tangency-labs/solidcraft/issues/3505) | the inner side wall of the vertical leg of a mitred swept bar extruded outward by 3 mm (the wall is a B-spline net in a plane, "the selected planar face no longer exists") | analytic | not supported yet: step 8 (solid.sweep): not supported yet: SMLib sweep along a path with corners (SMLib's sweep follows smooth paths) |
| sweeps/3528-revolved-dome-cut-by-a-ball-on-its-seam | [tangency-labs/solidcraft#3528](https://github.com/tangency-labs/solidcraft/issues/3528) | a ball of radius 4 centred on the dome of a revolved mushroom cap (azimuth 15 degrees, across an internal seam of the revolved faces), cut from it: removed nearly the whole ball | analytic | **FAIL**: volume_mm3 48118.357835 (want 46424.505878) |
| sweeps/3541-loft-two-circles-into-a-cone-flipped-plane | [tangency-labs/solidcraft#3541](https://github.com/tangency-labs/solidcraft/issues/3541) | a loft from a circle of radius 8 to a circle of radius 20, 30 mm below it (sections given small first, the small one drawn on a plane turned over (normal pointing down)): "a horizontal narrowing is created" instead of a cone | analytic | pass |
| sweeps/3541-loft-two-circles-into-a-cone-same-sense | [tangency-labs/solidcraft#3541](https://github.com/tangency-labs/solidcraft/issues/3541) | a loft from a circle of radius 8 to a circle of radius 20, 30 mm below it (sections given small first, the small one drawn on a plane facing the same way): "a horizontal narrowing is created" instead of a cone | analytic | pass |
| sweeps/3832-coil-cut-with-negative-pitch-inside-a-cylinder | [tangency-labs/solidcraft#3832](https://github.com/tangency-labs/solidcraft/issues/3832) | a 7-turn coil (centre diameter 80, wire 1 mm, pitch -2 so it winds downward) cut from a cylinder that holds it entirely (boolean Cut: no result) | analytic | pass |
| sweeps/3862-coil-square-wire-outside-the-diameter | [tangency-labs/solidcraft#3862](https://github.com/tangency-labs/solidcraft/issues/3862) [tangency-labs/solidcraft#3915](https://github.com/tangency-labs/solidcraft/issues/3915) | a clockwise 5-turn coil of 4 mm square wire placed outside a 40 mm diameter, pitch 8 (the section, position and direction parameters) | analytic | pass |
| sweeps/3897-sweep-ring-along-a-short-arc-joined-to-a-collar | [tangency-labs/solidcraft#3897](https://github.com/tangency-labs/solidcraft/issues/3897) | a ring profile (radii 79.815 and 78.285) swept along a 22.5 degree arc of radius 94.815 whose start is at the ring centre, joined to a ring-shaped collar under the profile (froze at "Computing") | analytic | pass |
| sweeps/3936-loft-join-circle-to-rectangle-on-a-cylinder | [tangency-labs/solidcraft#3936](https://github.com/tangency-labs/solidcraft/issues/3936) | a loft from the circle on top of a cylinder (r 10, height 15) to a 40 x 30 rectangle 30 mm above, joined to the cylinder (builds as a new body in 2 ms, the join never returns) | invariants | pass |
| sweeps/396-loft-join-standing-on-a-box-face | [tangency-labs/solidcraft#396](https://github.com/tangency-labs/solidcraft/issues/396) [tangency-labs/solidcraft#577](https://github.com/tangency-labs/solidcraft/issues/577) | a conical loft standing on a box top face, joined to the box (one body reported, two touching shells in the result) | analytic | pass |
| sweeps/4007-revolve-half-disc-horn-torus-270-degrees | [tangency-labs/solidcraft#4007](https://github.com/tangency-labs/solidcraft/issues/4007) | the half disc of radius 14 on the far side of a diameter 14 mm from the axis (the full circle would touch the axis: a horn torus) revolved 270 degrees | analytic | pass |
| sweeps/4008-symmetric-revolve-cut-end-faces-in-the-side-face | [tangency-labs/solidcraft#4008](https://github.com/tangency-labs/solidcraft/issues/4008) | a 7 x 21 rectangle 2.6 mm from a block vertical edge revolved as a symmetric 180 degree cut about that edge: both end faces of the tool lie in the block left face (refused as "could not be computed reliably") | analytic | pass |
| sweeps/4056-surface-loft-rails-straight-section-in-a-rail-plane-bow-to-stern | [tangency-labs/solidcraft#4056](https://github.com/tangency-labs/solidcraft/issues/4056) [tangency-labs/solidcraft#4080](https://github.com/tangency-labs/solidcraft/issues/4080) | a surface loft between a vertical line on XZ (bow) and a slanted line in the plane x = 100 (stern), bow to stern, guided by a keel rail lying in the bow sketch plane and a sheer rail at z = 20 (refused: "a guide rail crosses section 2's plane") | analytic | pass |
| sweeps/4056-surface-loft-rails-straight-section-in-a-rail-plane-stern-to-bow | [tangency-labs/solidcraft#4056](https://github.com/tangency-labs/solidcraft/issues/4056) [tangency-labs/solidcraft#4080](https://github.com/tangency-labs/solidcraft/issues/4080) | a surface loft between a vertical line on XZ (bow) and a slanted line in the plane x = 100 (stern), stern to bow, guided by a keel rail lying in the bow sketch plane and a sheer rail at z = 20 (refused: "a guide rail crosses section 2's plane") | analytic | **FAIL**: step 13 (surface.loft): invalid input: a guide rail crosses section 2's plane 100.000 mm from its curves: a rail has to pass through every section |
| sweeps/443-loft-intersect-cone-meets-wall-below-top | [tangency-labs/solidcraft#443](https://github.com/tangency-labs/solidcraft/issues/443) | a cylinder (r 35, h 10) intersected with a conical loft (r 45 at z = -1 to r 33 at z = 11) that crosses its wall 1 mm below the top face (body came back unchanged) | analytic | pass |
| sweeps/450-revolve-spherical-shell-sketched-off-the-origin | [tangency-labs/solidcraft#450](https://github.com/tangency-labs/solidcraft/issues/450) [tangency-labs/solidcraft#452](https://github.com/tangency-labs/solidcraft/issues/452) | a half ring between two arcs (both radial lines on the axis) revolved a full turn from a sketch plane 10 mm above the origin (volume +34 %) | analytic | **FAIL**: shells Body1: 2 (want 1); record_valid the operation failed: lumps: cannot mesh a complete shell boundary (want ok); smlib_check the operation failed: lumps: cannot mesh a complete shell boundary (want ok); volume_mm3 294558.478017 (want 241560.724326) |
| sweeps/487-cut-disc-by-revolved-adjacent-profiles | [tangency-labs/solidcraft#487](https://github.com/tangency-labs/solidcraft/issues/487) [tangency-labs/solidcraft#490](https://github.com/tangency-labs/solidcraft/issues/490) | a disc cut by the body made from two adjacent profiles revolved on the axis, around the disc flat end | analytic | pass |
| sweeps/487-revolve-two-adjacent-profiles-on-the-axis | [tangency-labs/solidcraft#487](https://github.com/tangency-labs/solidcraft/issues/487) [tangency-labs/solidcraft#490](https://github.com/tangency-labs/solidcraft/issues/490) | two rectangles sharing an edge, both resting on the axis, revolved together (zero-area faces along the axis) | analytic | pass |
| sweeps/494-extrude-the-flange-face-of-a-fresh-revolve | [tangency-labs/solidcraft#726](https://github.com/tangency-labs/solidcraft/issues/726) [tangency-labs/solidcraft#494](https://github.com/tangency-labs/solidcraft/issues/494) [tangency-labs/solidcraft#2114](https://github.com/tangency-labs/solidcraft/issues/2114) | the flange top annulus of a freshly revolved hub (z = 6, r 18..30) picked by a point and extruded 5 mm (the pick found a third of the face: "the selected planar face no longer exists") | analytic | pass |
| sweeps/561-extrude-the-end-face-of-a-loft | [tangency-labs/solidcraft#561](https://github.com/tangency-labs/solidcraft/issues/561) [tangency-labs/solidcraft#677](https://github.com/tangency-labs/solidcraft/issues/677) | the small end face of a square-to-square loft (40 mm side to 20 mm over 40 mm) extruded 10 mm (loft faces had no attachable source) | analytic | pass |
| sweeps/561-extrude-the-end-face-of-a-sweep | [tangency-labs/solidcraft#561](https://github.com/tangency-labs/solidcraft/issues/561) [tangency-labs/solidcraft#677](https://github.com/tangency-labs/solidcraft/issues/677) | the end cap of a mitred swept bar (8 x 5 section, 30 up then 40 across) extruded 6 mm further along the path | analytic | not supported yet: step 8 (solid.sweep): not supported yet: SMLib sweep along a path with corners (SMLib's sweep follows smooth paths) |
| sweeps/561-extrude-the-start-face-of-a-coil | [tangency-labs/solidcraft#561](https://github.com/tangency-labs/solidcraft/issues/561) [tangency-labs/solidcraft#677](https://github.com/tangency-labs/solidcraft/issues/677) | the start face of a 3-turn square-wire coil (4 mm wire, pitch 8, centre diameter 40) extruded 5 mm | analytic | pass |
| sweeps/726-revolve-full-turn-planar-faces-whole | [tangency-labs/solidcraft#726](https://github.com/tangency-labs/solidcraft/issues/726) [tangency-labs/solidcraft#1687](https://github.com/tangency-labs/solidcraft/issues/1687) | a flanged hub profile (six edges, none on the axis) revolved a full turn: the planar faces must come out whole, not as three patches | analytic | pass |
| sweeps/726-revolve-partial-turn-planar-faces-whole | [tangency-labs/solidcraft#726](https://github.com/tangency-labs/solidcraft/issues/726) [tangency-labs/solidcraft#1718](https://github.com/tangency-labs/solidcraft/issues/1718) | the same flanged hub profile revolved 240 degrees: its planar faces (three annular sectors and two end faces) must come out whole | analytic | pass |
| sweeps/757-surface-loft-ruled-strip-between-two-lines | [tangency-labs/solidcraft#757](https://github.com/tangency-labs/solidcraft/issues/757) [tangency-labs/solidcraft#847](https://github.com/tangency-labs/solidcraft/issues/847) | a surface loft between the line (0,0,0)-(10,0,0) and the line (0,0,20)-(10,6,20): a ruled (bilinear) strip | analytic | pass |
| sweeps/757-surface-revolve-line-cone-frustum-sheet | [tangency-labs/solidcraft#757](https://github.com/tangency-labs/solidcraft/issues/757) [tangency-labs/solidcraft#824](https://github.com/tangency-labs/solidcraft/issues/824) | a line from (5,0) to (10,20) revolved a full turn into a surface body (a cone frustum wall, no caps) | analytic | pass |
| sweeps/757-surface-sweep-slanted-line-round-a-quarter-arc | [tangency-labs/solidcraft#757](https://github.com/tangency-labs/solidcraft/issues/757) [tangency-labs/solidcraft#843](https://github.com/tangency-labs/solidcraft/issues/843) | a slanted line (from (20,0,0) to (30,0,10)) swept as a surface round a quarter circle of radius 20 about Z | analytic | pass |
| sweeps/771-sweep-end-scale-cone-frustum | [tangency-labs/solidcraft#771](https://github.com/tangency-labs/solidcraft/issues/771) [tangency-labs/solidcraft#1269](https://github.com/tangency-labs/solidcraft/issues/1269) | a circle of radius 5 swept 30 mm along a straight path with end scale 2 | analytic | not supported yet: step 7 (solid.sweep): not supported yet: SMLib sweep with a twist or an end scale |
| sweeps/771-sweep-one-guide-rail-cone-frustum | [tangency-labs/solidcraft#771](https://github.com/tangency-labs/solidcraft/issues/771) [tangency-labs/solidcraft#1806](https://github.com/tangency-labs/solidcraft/issues/1806) | a circle of radius 5 swept 20 mm up a straight path with one guide rail from its point (5,0,0) to (10,0,20) | analytic | not supported yet: step 10 (solid.sweep): not supported yet: SMLib sweep along guide rails |
| sweeps/771-sweep-two-guide-rails-cone-frustum | [tangency-labs/solidcraft#771](https://github.com/tangency-labs/solidcraft/issues/771) [tangency-labs/solidcraft#1806](https://github.com/tangency-labs/solidcraft/issues/1806) | a circle of radius 5 swept 20 mm up a straight path between two guide rails from (5,0,0) to (10,0,20) and from (-5,0,0) to (-10,0,20) | analytic | not supported yet: step 11 (solid.sweep): not supported yet: SMLib sweep along guide rails |
| sweeps/793-coil-cut-by-a-box-above-a-plane | [tangency-labs/solidcraft#793](https://github.com/tangency-labs/solidcraft/issues/793) | the same coil trimmed flat by cutting away everything above z = 12.5 with a box (trimming a coil to length) | analytic | **FAIL**: step 3 (solid.combine): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([13.434874451541004, 13.434916434571074, 12.499999999999998]) to Some([13.43487445154 |
| sweeps/793-coil-split-by-a-plane-across-its-axis | [tangency-labs/solidcraft#793](https://github.com/tangency-labs/solidcraft/issues/793) | a 6-turn coil (centre diameter 40, wire 2 mm, pitch 4) split by the plane z = 12.5 square to its axis ("boolean Intersect: no result") | analytic | **FAIL**: step 2 (solid.split_body): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([13.434874451540997, 13.434916434571077, 12.499999999999998]) to Some([13.43487445 |
| sweeps/844-join-two-overlapping-swept-arc-walls | [tangency-labs/solidcraft#844](https://github.com/tangency-labs/solidcraft/issues/844) | two swept walls (12 mm thick, 60 mm high) along concentric half circles of radius 50 and 58 turned 90 degrees apart, overlapping in thickness by 4 mm over a quarter turn and sharing the planes z = 0 and z = 60 (join gave an error, minutes, or an open body) | analytic | **FAIL**: step 14 (solid.sweep): SMLib boolean: operation: SMLib failed (status 1006) |
| sweeps/881-loft-zigzag-pleat-vertex-pairing | [tangency-labs/solidcraft#881](https://github.com/tangency-labs/solidcraft/issues/881) [tangency-labs/solidcraft#956](https://github.com/tangency-labs/solidcraft/issues/956) | a ruled loft between two 18-vertex zig-zag sections with the same start vertex and winding, whose first-vertex direction is ambiguous from the section centroid | analytic | pass |
| sweeps/96-loft-cut-box-sections-pad-first | [tangency-labs/solidcraft#122](https://github.com/tangency-labs/solidcraft/issues/122) [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | a loft cut through a 100 x 60 x 30 block from its whole 100 x 60 outline at z = 20 (edges flush with the side faces) down to a 10 x 10 pad in a corner at z = 11, sections given pad first (the cut panicked for one order) | analytic | **FAIL**: step 8 (solid.loft): SMLib boolean: export: SMLib export: the mapped B-rep does not validate: portable B-rep: an open, wire or vertex shell lies in one region |
| sweeps/96-loft-cut-box-sections-top-first | [tangency-labs/solidcraft#122](https://github.com/tangency-labs/solidcraft/issues/122) [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | a loft cut through a 100 x 60 x 30 block from its whole 100 x 60 outline at z = 20 (edges flush with the side faces) down to a 10 x 10 pad in a corner at z = 11, sections given top first (the cut panicked for one order) | analytic | **FAIL**: step 8 (solid.loft): SMLib boolean: export: SMLib export: the mapped B-rep does not validate: portable B-rep: an open, wire or vertex shell lies in one region |
| sweeps/96-shallow-loft-cut-starting-in-the-top-face | [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | a loft cut from a 556.68 x 99 rectangle on the top face of a 900 x 480 x 160 slab down 4 mm to an 80 x 80 square (a kernel panic in healing; the sides are about 0.9 degrees from horizontal) | analytic | pass |
| sweeps/96-sweep-rectangle-round-a-mitred-corner | [tangency-labs/solidcraft#96](https://github.com/tangency-labs/solidcraft/issues/96) | an 8 x 5 rectangle swept along a path of a 30 mm vertical line and a 40 mm horizontal line meeting at a sharp corner (walls mitred) | analytic | not supported yet: step 8 (solid.sweep): not supported yet: SMLib sweep along a path with corners (SMLib's sweep follows smooth paths) |
| sweeps/968-loft-hollow-elbow-60deg-5sections | [tangency-labs/solidcraft#968](https://github.com/tangency-labs/solidcraft/issues/968) [tangency-labs/solidcraft#1084](https://github.com/tangency-labs/solidcraft/issues/1084) | a bent tube (circles r 30 lofted through 5 sections along an R100 arc turning 60 degrees) with a bore (r 18, sections running 5 mm of arc past both ends) cut out of it: a hollow elbow ("no result" for some section counts, not their neighbours) | analytic | pass |
| sweeps/968-loft-hollow-elbow-90deg-10sections | [tangency-labs/solidcraft#968](https://github.com/tangency-labs/solidcraft/issues/968) [tangency-labs/solidcraft#1084](https://github.com/tangency-labs/solidcraft/issues/1084) | a bent tube (circles r 30 lofted through 10 sections along an R100 arc turning 90 degrees) with a bore (r 18, sections running 5 mm of arc past both ends) cut out of it: a hollow elbow ("no result" for some section counts, not their neighbours) | analytic | pass |
| tessellation/1263-concave-arc-knife-edge-plate | [tangency-labs/solidcraft#1263](https://github.com/tangency-labs/solidcraft/issues/1263) | a plate with a concave quarter-round wall that meets the back face tangentially at a knife-edge tip (a box and a box less a cylinder, united): its display tessellation used to fail with 'boundary does not lie on the surface' before anything was filleted | analytic | pass |
| tessellation/1615-crossed-lofted-tubes | [tangency-labs/solidcraft#1615](https://github.com/tangency-labs/solidcraft/issues/1615) [tangency-labs/solidcraft#1653](https://github.com/tangency-labs/solidcraft/issues/1653) | two lofted tubes that cross and are joined (the bike-frame case): the trimmed loft faces along the intersection curves used to mesh with a flat sheet across the tube and slivers inside it | analytic | pass |
| tessellation/1648-sphere-touches-box-edge-union | [tangency-labs/solidcraft#1648](https://github.com/tangency-labs/solidcraft/issues/1648) [tangency-labs/solidcraft#1850](https://github.com/tangency-labs/solidcraft/issues/1850) | a sphere that touches a box's bottom edge at one point: the union leaves a sliver face pinched to zero height, whose loop touches itself within tolerance, and it must still mesh | analytic | pass |
| tessellation/1666-loft-18-gon-ruled-sides | [tangency-labs/solidcraft#1666](https://github.com/tangency-labs/solidcraft/issues/1666) [tangency-labs/solidcraft#1670](https://github.com/tangency-labs/solidcraft/issues/1670) | a loft between two 18-vertex polylines whose side faces are twisted ruled (bilinear) patches: each used to be exported as two flat triangles with crossing diagonals | analytic | pass |
| tessellation/1666-loft-twisted-square | [tangency-labs/solidcraft#1666](https://github.com/tangency-labs/solidcraft/issues/1666) [tangency-labs/solidcraft#1670](https://github.com/tangency-labs/solidcraft/issues/1670) | a loft from a 20x20 square to the same square turned 45 degrees, 30 mm higher: its four side faces are strongly twisted ruled patches, the case a two-triangle mesh gets visibly wrong | analytic | pass |
| tessellation/1753-bowl-rim-cut-by-cylinder | [tangency-labs/solidcraft#1753](https://github.com/tangency-labs/solidcraft/issues/1753) | a revolved bowl whose rim is cut by a large cylinder (R320, axis across the bowl): the cut edge is an intersection curve between the cylinder and the cone walls, whose two faces used to put different vertices on it, so the STL/3MF export had a 0.001 mm crack | analytic | pass |
| tessellation/1813-sphere-lens-thinner-than-tolerance | [tangency-labs/solidcraft#2712](https://github.com/tangency-labs/solidcraft/issues/2712) [tangency-labs/solidcraft#1813](https://github.com/tangency-labs/solidcraft/issues/1813) | a sphere whose centre lies on a box's top face, poking out of the box's side as a lens-shaped face thinner than the mesh tolerance; the face must still be meshed | analytic | pass |
| tessellation/2069-chamfered-ring-notch-moved-far | [tangency-labs/solidcraft#2069](https://github.com/tangency-labs/solidcraft/issues/2069) | a 210-degree ring with a chamfered outer edge, notched through its chamfer cone and then moved 1000 mm: where the notch meets the cone the mesh used to leave a crack, and the measured volume then grew with the distance from the origin | analytic | pass |
| tessellation/2528-stadium-joined-with-overlapping-cylinder | [tangency-labs/solidcraft#2528](https://github.com/tangency-labs/solidcraft/issues/2528) | a rounded slot (a box with a half-cylinder on each end) joined with a cylinder that overlaps one end: the cylinder walls meet along vertical seams and intersection edges, where wedge-shaped mis-tessellated facets showed up | analytic | pass |
| tessellation/311-ramp-cut-cylinder-blank | [tangency-labs/solidcraft#311](https://github.com/tangency-labs/solidcraft/issues/311) | an inclined cut across a round blank, which used to pinch the cylindrical wall inward (a 4.4 mm chord deficit) in the display and STL mesh | analytic | pass |
| tessellation/466-revolved-cone-tip-stays-smooth | [tangency-labs/solidcraft#466](https://github.com/tangency-labs/solidcraft/issues/466) | a six-line profile revolved a full turn about its first line, with a cone ending in a point: the tip came out with dents every 120 degrees instead of a smooth cone (rebuilt as a pencil-like profile with a collinear frustum and tip; the original design is not in the report) | analytic | pass |
| tessellation/784-stl-open-edges-filleted-and-drilled | [tangency-labs/solidcraft#784](https://github.com/tangency-labs/solidcraft/issues/784) [tangency-labs/solidcraft#811](https://github.com/tangency-labs/solidcraft/issues/811) | two bodies whose STL export used to have open edges where faces were meshed apart: a 40x30x20 box with all twelve edges rounded 2 mm, and a cylinder R15 x 20 with a coaxial 6 mm bore | analytic | **FAIL**: watertight RoundedBox: 0 open, 8 over-shared mesh edges (want no open edges); record_valid the operation failed: pcurve of loop 0 use 2 (Some([2.0, 30.0, 2.0]) to Some([0.0, 28.0, 2.0])): the (want ok); smlib_check the operation failed: pcurve of loop 0 use 2 (Some([2.0, 30.0, 2.0]) to Some([0.0, 28.0, 2.0])): the (want ok) |
| tessellation/818-blind-hole-splits-vertical-edges | [tangency-labs/solidcraft#818](https://github.com/tangency-labs/solidcraft/issues/818) | a blind hole cut into a ring whose six concave corners are filleted: the cut used to split every vertical edge (the outer seam and all twelve fillet tangent edges) at the hole's depth, and the fillet corners drew black | analytic | pass |
| tessellation/819-cup-pocket-splits-wall-seam | [tangency-labs/solidcraft#819](https://github.com/tangency-labs/solidcraft/issues/819) [tangency-labs/solidcraft#921](https://github.com/tangency-labs/solidcraft/issues/921) | a disc with a pocket that splits the outer cylinder wall's seam edges at the pocket floor: the wall used to be meshed with fans cutting through the disc, so the measured volume and the STL read too small | analytic | pass |
| threads/1250-external-m10x1.5-shaft-full-length | [tangency-labs/solidcraft#1250](https://github.com/tangency-labs/solidcraft/issues/1250) | a modelled external M10 thread over the whole length of a 10 mm shaft (8 turns) | analytic | **FAIL**: step 2 (solid.thread): SMLib boolean: SMLib's check refuses the result: 2 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partially |
| threads/1395-long-external-m6-thread-24-turns | [tangency-labs/solidcraft#1395](https://github.com/tangency-labs/solidcraft/issues/1395) | a long modelled external thread: M6 over a 24 mm shaft (24 turns), the kind that once ran out of depth in the boolean | analytic | **FAIL**: step 2 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([-1.738532668045337, 1.7385379467804876, -2.949029909160572e-17]) to Some([-1.73853839 |
| threads/1443-m5x0.7-thread-in-5mm-hole | [tangency-labs/solidcraft#1443](https://github.com/tangency-labs/solidcraft/issues/1443) [tangency-labs/solidcraft#3060](https://github.com/tangency-labs/solidcraft/issues/3060) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass |
| threads/1995-m8x1-thread-in-7mm-hole | [tangency-labs/solidcraft#1995](https://github.com/tangency-labs/solidcraft/issues/1995) | an M8x1 modelled thread in a 7 mm hole through a block (the report: the thread also changed the block's outer surface and made too many faces) | analytic | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([2.862740053704183, 2.0136333789738825, 1.4963877373859766]) to Some([-2.8627400537041 |
| threads/2038-cut-threaded-stud-from-bored-block | [tangency-labs/solidcraft#2038](https://github.com/tangency-labs/solidcraft/issues/2038) | cutting an externally threaded stud out of a block bored at the tap drill (to make the internal thread): the boolean found no result | analytic | **FAIL**: step 4 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([6.735685053790036, 6.735671302570509, -5.000000000000002]) to Some([4.018069973126635 |
| threads/2038-internal-then-external-thread-on-one-body | [tangency-labs/solidcraft#2038](https://github.com/tangency-labs/solidcraft/issues/2038) | two modelled threads on one body, an internal one then an external one (the second was refused: no cylindrical face there to thread) | analytic | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 4 (Some([-2.583065773355961, 6.236083486130154, -3.382710778154774e-17]) to Some([0.6966280122 |
| threads/2038-join-two-threaded-bodies | [tangency-labs/solidcraft#2038](https://github.com/tangency-labs/solidcraft/issues/2038) | joining a body with an internal modelled thread to one with an external modelled thread, touching in a plane (the join ran for over ten minutes) | analytic | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 4 (Some([-2.583065773355961, 6.236083486130154, -3.382710778154774e-17]) to Some([0.6966280122 |
| threads/2115-tapped-hole-drill-is-major-minus-pitch | [tangency-labs/solidcraft#3311](https://github.com/tangency-labs/solidcraft/issues/3311) [tangency-labs/solidcraft#2115](https://github.com/tangency-labs/solidcraft/issues/2115) [tangency-labs/solidcraft#2367](https://github.com/tangency-labs/solidcraft/issues/2367) [tangency-labs/solidcraft#2440](https://github.com/tangency-labs/solidcraft/issues/2440) [tangency-labs/solidcraft#2441](https://github.com/tangency-labs/solidcraft/issues/2441) | tapped holes (Hole with a thread size, no diameter) are drilled at the tap drill, not at the major diameter | analytic | pass |
| threads/2152-m3x0.2-thread-in-3mm-hole | [tangency-labs/solidcraft#2152](https://github.com/tangency-labs/solidcraft/issues/2152) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass |
| threads/2193-modelled-m33x3.5-thread | [tangency-labs/solidcraft#2193](https://github.com/tangency-labs/solidcraft/issues/2193) [tangency-labs/solidcraft#2263](https://github.com/tangency-labs/solidcraft/issues/2263) [tangency-labs/solidcraft#4153](https://github.com/tangency-labs/solidcraft/issues/4153) | a modelled M33x3.5 thread, a size the thread menu lacked (designation typed by hand), on a 33 mm shaft (4 turns) | analytic | **FAIL**: step 2 (solid.thread): SMLib boolean: SMLib's check refuses the result: 3 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partially |
| threads/2209-fine-m44x1-thread-on-shaft | [tangency-labs/solidcraft#2209](https://github.com/tangency-labs/solidcraft/issues/2209) | a fine modelled thread on a large shaft (M44x1 on a 44 mm shaft, 4 turns), which once cut about 9% too much | analytic | **FAIL**: step 2 (solid.thread): SMLib boolean: SMLib's check refuses the result: 1 failed tests: SmFace::Test #34 Face has partially Coincident Edges: Face has partially |
| threads/2209-m44x1.5-thread-on-flange-hub | [tangency-labs/solidcraft#2209](https://github.com/tangency-labs/solidcraft/issues/2209) | a full-diameter M44x1.5 modelled thread on the hub of a flange, which once failed to rebuild a closed shell | analytic | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([17.993100249475514, 12.658923469723806, 12.61506452654108]) to Some([-17.993100249475 |
| threads/2369-m8-thread-in-6.3mm-hole-refused | [tangency-labs/solidcraft#2369](https://github.com/tangency-labs/solidcraft/issues/2369) [tangency-labs/solidcraft#2688](https://github.com/tangency-labs/solidcraft/issues/2688) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass |
| threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole | [tangency-labs/solidcraft#2406](https://github.com/tangency-labs/solidcraft/issues/2406) | an M8 modelled thread in a 6.8 mm pilot hole (the case where the thread 'was not visible') | analytic | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([-2.780947480741209, -1.9561009967174812, 1.2599347416400593]) to Some([2.780947480741 |
| threads/2526-three-modelled-threads-in-one-body | [tangency-labs/solidcraft#2526](https://github.com/tangency-labs/solidcraft/issues/2526) | three modelled threads, internal and external, in one body with a hub and a plain hole beside the bore (each thread used to facet the rest of the part and the next thread was refused) | analytic | **FAIL**: step 5 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([-3.4104950138828145, -2.089969146215104, 30.000000000000007]) to Some([-0.93378481328 |
| threads/2705-m14-thread-on-14.6mm-shaft-refused | [tangency-labs/solidcraft#2705](https://github.com/tangency-labs/solidcraft/issues/2705) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a shaft that isn't the thread's size: refused with the size to use, never a silent change of the shaft | analytic | pass |
| threads/2822-modelled-thread-in-filleted-cube | [tangency-labs/solidcraft#2822](https://github.com/tangency-labs/solidcraft/issues/2822) | a modelled M3 thread in a hole through a block whose vertical edges are rounded (the fillets showed as black lines after the thread) | analytic | **FAIL**: step 7 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([11.022407162037219, 10.719154778204942, 0.24820214174911687]) to Some([8.994053254378 |
| threads/2969-m48x0.75-thread-in-48mm-hole | [tangency-labs/solidcraft#2969](https://github.com/tangency-labs/solidcraft/issues/2969) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass |
| threads/3311-two-tapped-holes-both-modelled-threaded | [tangency-labs/solidcraft#3311](https://github.com/tangency-labs/solidcraft/issues/3311) | a second modelled thread on the same body (the first thread faceted every other hole), over each hole's full length | analytic | **FAIL**: step 4 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([10.956692141520428, 12.309678320897202, 2.0383000842727483e-17]) to Some([9.043311931 |
| threads/3366-m20-thread-in-20mm-hole | [tangency-labs/solidcraft#3366](https://github.com/tangency-labs/solidcraft/issues/3366) [tangency-labs/solidcraft#3367](https://github.com/tangency-labs/solidcraft/issues/3367) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass |
| threads/3368-faceted-prism-pocket-cut-and-boss-join | [tangency-labs/solidcraft#3368](https://github.com/tangency-labs/solidcraft/issues/3368) | booleans of a finely faceted body (a 1200-sided prism, 1202 flat faces, the kind of body a modelled thread leaves) with box tools: they must finish in bounded time with the exact result, not run for minutes | analytic | pass |
| threads/3368-faceted-prism-with-bore-and-cross-hole | [tangency-labs/solidcraft#3368](https://github.com/tangency-labs/solidcraft/issues/3368) | a finely faceted body (a 1200-sided prism) with a curved partner: a vertical bore and a horizontal cross hole drilled through it (the case where the B-rep ladder is bounded but must still decide) | analytic | pass |
| threads/3368-two-faceted-prisms-cut-then-joined | [tangency-labs/solidcraft#3368](https://github.com/tangency-labs/solidcraft/issues/3368) | two finely faceted bodies (1000-sided prisms, flat faces only): a faceted stud cut out of a faceted disc, then a faceted cap joined on top touching in a plane; both booleans must finish in bounded time with the exact result | analytic | **HANG**: no result after 180 s |
| threads/3914-sketch-on-top-face-of-threaded-rounded-block | [tangency-labs/solidcraft#3914](https://github.com/tangency-labs/solidcraft/issues/3914) | Create Sketch on the top face of a block with a modelled thread and rounded corners, then a boss from it | analytic | **FAIL**: step 3 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([7.955185675925581, 8.561690443590084, 0.9964288343534452]) to Some([12.04481432407442 |
| threads/3952-modelled-thread-in-blind-hole-of-revolved-ring | [tangency-labs/solidcraft#3952](https://github.com/tangency-labs/solidcraft/issues/3952) | a modelled thread in a small blind hole drilled into a revolved ring, off its axis ('faceted boolean: inconsistent volumes') | analytic | **FAIL**: step 9 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([20.516265215511172, -1.0755765706655467, 22.0]) to Some([19.994014397500948, -0.74195 |
| threads/4149-internal-thread-below-counterbore-filleted-rim | [tangency-labs/solidcraft#4149](https://github.com/tangency-labs/solidcraft/issues/4149) | a modelled M10x1.5 internal thread, full length of the bore below a counterbore, in a cylinder with its rim rounded (stack overflow) | analytic | **FAIL**: step 4 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 0 (Some([1.9133830447635627, 4.619347644845553, -3.469446951953614e-18]) to Some([-1.913372921 |
| threads/602-fillet-hex-head-beside-modelled-thread | [tangency-labs/solidcraft#602](https://github.com/tangency-labs/solidcraft/issues/602) [tangency-labs/solidcraft#618](https://github.com/tangency-labs/solidcraft/issues/618) | rounding the top edges of a hex head on a shaft with a modelled thread (it froze the app) | analytic | **FAIL**: step 9 (solid.thread): SMLib export: pcurve: pcurve of loop 0 use 1 (Some([2.5000000000000018, -3.353876639995629e-15, 0.24997448866668603]) to Some([-0.9560955 |
| threads/995-m5-thread-in-5mm-hole | [tangency-labs/solidcraft#995](https://github.com/tangency-labs/solidcraft/issues/995) [tangency-labs/solidcraft#1018](https://github.com/tangency-labs/solidcraft/issues/1018) [tangency-labs/solidcraft#2853](https://github.com/tangency-labs/solidcraft/issues/2853) | a modelled thread on a hole that isn't the thread's size: refused with the size to use, never a silent change of the hole | analytic | pass |
## Sources
+80 -86
View File
@@ -1,117 +1,111 @@
# SMLib vs truck: sweeps, threads, shell and offset
# SMLib: sweeps, threads, shell and offset
A triage of the regression rig's sweeps, threads and shell cases, and of the ladder's tiers 03
(analytic profiles), 04 (spline profiles), 06 (threads) and 09 (shells and offsets): 169 cases,
each run on both kernels (`solidcraft-cli kernel-cases`, `SOLIDCRAFT_KERNEL` unset and `smlib`)
on `kernel-smlib` at 4b8953726. Each kernel is graded against the case's own answer
([kernel-cases.md](kernel-cases.md)), not against the other kernel. This page lists only the
cases where SMLib does not pass, grouped by what goes wrong, worst first; it is kept by hand as
fixes land.
each run on SMLib (`solidcraft-cli kernel-cases`) on `kernel-smlib` at 4b8953726 and graded
against the case's own answer ([kernel-cases.md](kernel-cases.md)). This page lists only the
cases that do not pass, grouped by what goes wrong, worst first; it is kept by hand as fixes
land.
| | Cases | truck passes | SMLib passes |
|---|---|---|---|
| sweeps | 83 | 55 | 51 |
| threads | 28 | 10 | 11 |
| shell | 18 | 5 | 11 |
| ladder 03, 04, 06, 09 | 40 | 28 | 26 |
| **all** | **169** | **98** | **99** |
SMLib passes 18 cases truck fails (shells of tapered and rounded bodies, offset faces next to
freeform faces, bent and hollow lofts, the 36 twisted blades). Truck passes 17 that SMLib does
not: 11 of them are sweeps SMLib has no path for yet (group G), 6 are below.
| | Cases | Pass |
|---|---|---|
| sweeps | 83 | 51 |
| threads | 28 | 11 |
| shell | 18 | 11 |
| ladder 03, 04, 06, 09 | 40 | 26 |
| **all** | **169** | **99** |
A thread off its hole's or shaft's size is refused on this branch (the owner's rule): those
cases pass on both kernels by refusing, and are not listed.
cases pass by refusing, and are not listed.
## A. Wrong geometry (worst)
| Case | truck | SMLib | SMLib's result |
|---|---|---|---|
| sweeps/2667-revolve-half-disc-three-quarters | pass | fail | a half disc on the axis turned 270°: SMLib makes a quarter ball turned inside out (V = -226, want 679) |
| sweeps/3528-revolved-dome-cut-by-a-ball-on-its-seam | pass | fail | the ball's cut is lost where it crosses the revolve's seam: V 48118, want 46425 |
| sweeps/2847-loft-rectangles-turning-through-half-a-turn | fail | fail | inside out (V = -127, want 2262); truck's is wrong too (V = 126) |
| sweeps/450-revolve-spherical-shell-sketched-off-the-origin | crash | fail | two shells where one is wanted, which the B-rep record can't close (truck's process dies) |
| Case | SMLib | SMLib's result |
|---|---|---|
| sweeps/2667-revolve-half-disc-three-quarters | fail | a half disc on the axis turned 270°: SMLib makes a quarter ball turned inside out (V = -226, want 679) |
| sweeps/3528-revolved-dome-cut-by-a-ball-on-its-seam | fail | the ball's cut is lost where it crosses the revolve's seam: V 48118, want 46425 |
| sweeps/2847-loft-rectangles-turning-through-half-a-turn | fail | inside out (V = -127, want 2262) |
| sweeps/450-revolve-spherical-shell-sketched-off-the-origin | fail | two shells where one is wanted, which the B-rep record can't close |
## B. Crash
| Case | truck | SMLib | SMLib's result |
|---|---|---|---|
| ladder/09-shells-and-offsets/011-part-shell | fail | crash | step 21 (solid.fillet) on the SMLib body: curve blend internal error "Two same vertices cannot construct an edge"; the fillet is the blends work's, not this page's |
| Case | SMLib | SMLib's result |
|---|---|---|
| ladder/09-shells-and-offsets/011-part-shell | crash | step 21 (solid.fillet) on the SMLib body: curve blend internal error "Two same vertices cannot construct an edge"; the fillet is the blends work's, not this page's |
## C. Threads: the groove's boolean fails SMLib's check
The groove (SMLib's screw sweep) cuts the body, and the result fails SMLib's own check: vertex
gaps of 1–6e-5 mm against vertex tolerances of 4–20e-6 mm (Test #0/#2 Bad Gap), an edge whose
geometry fails validation (Test #61), or a trim curve that does not lie on its edge when the
result is read back (SMLib export: pcurve). Truck's faceted groove fails SMLib's check on the
same cases with 6 to 752 failed tests.
result is read back (SMLib export: pcurve).
| Case | truck | SMLib | SMLib's result |
|---|---|---|---|
| ladder/06-threads/001-external-m10-full | fail | fail | Bad Gap (1.89e-5 > 8.6e-6) |
| ladder/06-threads/002-external-m10x1-fine | hang | fail | Test #61 bad edge |
| ladder/06-threads/003-external-m10-partial-length | pass | fail | Bad Gap (1.91e-5 > 8.9e-6) |
| ladder/06-threads/004-external-m10-to-shoulder | fail | fail | Bad Gap ×10 |
| ladder/06-threads/005-internal-m10-through | fail | fail | Bad Gap (3.6e-5 > 1.8e-5) |
| ladder/06-threads/006-external-m10-into-chamfer | fail | fail | Bad Gap |
| ladder/06-threads/007-external-m10-at-filleted-shoulder | fail | fail | Bad Gap |
| ladder/06-threads/010-part-threaded-boss | fail | fail | Bad Gap (2.26e-5 > 2.0e-5) |
| threads/1250-external-m10x1.5-shaft-full-length | fail | fail | Bad Gap ×9 |
| threads/1395-long-external-m6-thread-24-turns | fail | fail | Test #61 bad edge |
| threads/1995-m8x1-thread-in-7mm-hole | fail | fail | Bad Gap (1.5e-5 > 7.5e-6) |
| threads/2038-cut-threaded-stud-from-bored-block | fail | fail | Test #61 bad edge |
| threads/2038-internal-then-external-thread-on-one-body | fail | fail | pcurve off its edge |
| threads/2038-join-two-threaded-bodies | hang | fail | pcurve off its edge |
| threads/2193-modelled-m33x3.5-thread | fail | fail | Bad Gap |
| threads/2209-fine-m44x1-thread-on-shaft | fail | fail | Bad Gap ×7 |
| threads/2209-m44x1.5-thread-on-flange-hub | fail | fail | Bad Gap (6.2e-5 > 2.05e-5) |
| threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole | fail | fail | Bad Gap |
| threads/2526-three-modelled-threads-in-one-body | fail | fail | pcurve off its edge |
| threads/2822-modelled-thread-in-filleted-cube | fail | fail | pcurve off its edge |
| threads/3311-two-tapped-holes-both-modelled-threaded | fail | fail | pcurve off its edge |
| threads/3914-sketch-on-top-face-of-threaded-rounded-block | fail | fail | pcurve off its edge (0.86 mm) |
| threads/3952-modelled-thread-in-blind-hole-of-revolved-ring | fail | fail | pcurve off its edge |
| threads/4149-internal-thread-below-counterbore-filleted-rim | fail | fail | Bad Gap |
| threads/602-fillet-hex-head-beside-modelled-thread | fail | fail | Bad Gap |
| Case | SMLib | SMLib's result |
|---|---|---|
| ladder/06-threads/001-external-m10-full | fail | Bad Gap (1.89e-5 > 8.6e-6) |
| ladder/06-threads/002-external-m10x1-fine | fail | Test #61 bad edge |
| ladder/06-threads/003-external-m10-partial-length | fail | Bad Gap (1.91e-5 > 8.9e-6) |
| ladder/06-threads/004-external-m10-to-shoulder | fail | Bad Gap ×10 |
| ladder/06-threads/005-internal-m10-through | fail | Bad Gap (3.6e-5 > 1.8e-5) |
| ladder/06-threads/006-external-m10-into-chamfer | fail | Bad Gap |
| ladder/06-threads/007-external-m10-at-filleted-shoulder | fail | Bad Gap |
| ladder/06-threads/010-part-threaded-boss | fail | Bad Gap (2.26e-5 > 2.0e-5) |
| threads/1250-external-m10x1.5-shaft-full-length | fail | Bad Gap ×9 |
| threads/1395-long-external-m6-thread-24-turns | fail | Test #61 bad edge |
| threads/1995-m8x1-thread-in-7mm-hole | fail | Bad Gap (1.5e-5 > 7.5e-6) |
| threads/2038-cut-threaded-stud-from-bored-block | fail | Test #61 bad edge |
| threads/2038-internal-then-external-thread-on-one-body | fail | pcurve off its edge |
| threads/2038-join-two-threaded-bodies | fail | pcurve off its edge |
| threads/2193-modelled-m33x3.5-thread | fail | Bad Gap |
| threads/2209-fine-m44x1-thread-on-shaft | fail | Bad Gap ×7 |
| threads/2209-m44x1.5-thread-on-flange-hub | fail | Bad Gap (6.2e-5 > 2.05e-5) |
| threads/2406-modelled-m8-thread-in-6.8mm-pilot-hole | fail | Bad Gap |
| threads/2526-three-modelled-threads-in-one-body | fail | pcurve off its edge |
| threads/2822-modelled-thread-in-filleted-cube | fail | pcurve off its edge |
| threads/3311-two-tapped-holes-both-modelled-threaded | fail | pcurve off its edge |
| threads/3914-sketch-on-top-face-of-threaded-rounded-block | fail | pcurve off its edge (0.86 mm) |
| threads/3952-modelled-thread-in-blind-hole-of-revolved-ring | fail | pcurve off its edge |
| threads/4149-internal-thread-below-counterbore-filleted-rim | fail | Bad Gap |
| threads/602-fillet-hex-head-beside-modelled-thread | fail | Bad Gap |
## D. Coils and other sweeps in booleans
| Case | truck | SMLib | SMLib's result |
|---|---|---|---|
| sweeps/793-coil-cut-by-a-box-above-a-plane | hang | fail | pcurve off its edge |
| sweeps/793-coil-split-by-a-plane-across-its-axis | fail | fail | pcurve off its edge |
| sweeps/2552-thread-groove-cut-by-a-square-coil-in-a-bore | hang | fail | the boolean's result is not a closed solid |
| sweeps/96-loft-cut-box-sections-pad-first | fail | fail | the boolean's result is not a closed solid |
| sweeps/96-loft-cut-box-sections-top-first | fail | fail | the boolean's result is not a closed solid |
| sweeps/844-join-two-overlapping-swept-arc-walls | fail | fail | boolean status 1006 |
| sweeps/3006-second-sweep-from-a-plane-along-a-closed-path | fail | fail | read back: a face no shell uses |
| Case | SMLib | SMLib's result |
|---|---|---|
| sweeps/793-coil-cut-by-a-box-above-a-plane | fail | pcurve off its edge |
| sweeps/793-coil-split-by-a-plane-across-its-axis | fail | pcurve off its edge |
| sweeps/2552-thread-groove-cut-by-a-square-coil-in-a-bore | fail | the boolean's result is not a closed solid |
| sweeps/96-loft-cut-box-sections-pad-first | fail | the boolean's result is not a closed solid |
| sweeps/96-loft-cut-box-sections-top-first | fail | the boolean's result is not a closed solid |
| sweeps/844-join-two-overlapping-swept-arc-walls | fail | boolean status 1006 |
| sweeps/3006-second-sweep-from-a-plane-along-a-closed-path | fail | read back: a face no shell uses |
## E. Shell and offset refused
| Case | truck | SMLib | SMLib's result |
|---|---|---|---|
| ladder/09-shells-and-offsets/006-shell-rounds-r1-thinner-than-t2 | pass | fail | shell status 1001 (rounds of r1 inside a 2 mm wall) |
| shell/1494-shell-box-with-cylinder-on-edge-line | fail | fail | shell status 1001 |
| shell/1525-shell-box-with-rounds-chamfer-and-fillet | fail | fail | shell status 1001 |
| shell/2939-offset-face-sphere | pass | fail | check: edge/surface gap 5.015e-6 > 5e-6 |
| shell/3468-offset-face-boss-wall-next-to-fillet | fail | fail | check: an edge tolerance of 2.0 mm |
| shell/2531-shell-point-pick-after-parameter-edit | fail | fail | V 17952, want 22112 (truck 17376): the shell's face pick after the edit, on both kernels |
| sweeps/2820-pipe-hollow-with-a-wall-along-a-bend | pass | fail | sweep status 1001 |
| Case | SMLib | SMLib's result |
|---|---|---|
| ladder/09-shells-and-offsets/006-shell-rounds-r1-thinner-than-t2 | fail | shell status 1001 (rounds of r1 inside a 2 mm wall) |
| shell/1494-shell-box-with-cylinder-on-edge-line | fail | shell status 1001 |
| shell/1525-shell-box-with-rounds-chamfer-and-fillet | fail | shell status 1001 |
| shell/2939-offset-face-sphere | fail | check: edge/surface gap 5.015e-6 > 5e-6 |
| shell/3468-offset-face-boss-wall-next-to-fillet | fail | check: an edge tolerance of 2.0 mm |
| shell/2531-shell-point-pick-after-parameter-edit | fail | V 17952, want 22112: the shell's face pick after the edit |
| sweeps/2820-pipe-hollow-with-a-wall-along-a-bend | fail | sweep status 1001 |
## F. Same answer on both kernels (engine or case)
## F. The engine or the case
| Case | truck | SMLib | Both kernels |
|---|---|---|---|
| sweeps/3345-sweep-profile-mid-line-round-a-rounded-rectangle | fail | fail | the same bbox (±46 × ±36, want ±32 × ±22): the profile's placement, not the kernel |
| sweeps/2516-revolve-about-a-named-construction-axis | fail | fail | unknown sketch line `Axis1` |
| sweeps/3191-revolve-cut-leaves-a-cone | fail | fail | the profile crosses the revolve axis |
| sweeps/4056-surface-loft-rails-…-stern-to-bow | fail | fail | a guide rail misses section 2 |
| sweeps/2570-loft-circle-to-a-non-star-shaped-comb | fail | fail | SMLib: an arc turns more than once; truck: a loop runs clockwise |
| shell/4009-closed-shell-internal-void | fail | fail | `solid.shell` needs 1…1000 faces (a closed shell has none) |
| ladder/06-threads/008-multi-start-thread | unsupported | unsupported | no start count yet |
| ladder/06-threads/009-thread-runout-length | unsupported | unsupported | no runout length yet |
| Case | SMLib | What |
|---|---|---|
| sweeps/3345-sweep-profile-mid-line-round-a-rounded-rectangle | fail | bbox ±46 × ±36, want ±32 × ±22: the profile's placement, not the kernel |
| sweeps/2516-revolve-about-a-named-construction-axis | fail | unknown sketch line `Axis1` |
| sweeps/3191-revolve-cut-leaves-a-cone | fail | the profile crosses the revolve axis |
| sweeps/4056-surface-loft-rails-…-stern-to-bow | fail | a guide rail misses section 2 |
| sweeps/2570-loft-circle-to-a-non-star-shaped-comb | fail | an arc turns more than once |
| shell/4009-closed-shell-internal-void | fail | `solid.shell` needs 1…1000 faces (a closed shell has none) |
| ladder/06-threads/008-multi-start-thread | unsupported | no start count yet |
| ladder/06-threads/009-thread-runout-length | unsupported | no runout length yet |
## G. No SMLib path yet ("not supported yet", never truck's in its place)
## G. No SMLib path yet ("not supported yet")
| What | Cases |
|---|---|
+20 -20
View File
@@ -1,28 +1,28 @@
# Kernel regression rig
Every geometry case the old kernel (truck) got wrong, recorded in an issue, a pull request or a
crash report, is a use case here with its own right answer. The rig holds every kernel to all of
crash report, is a use case here with its own right answer. The kernel, SMLib, is held to all of
them. `cargo xtask kernel-cases` runs them and writes [`docs/kernel-cases.md`](../../docs/kernel-cases.md).
```sh
cargo xtask kernel-cases # the default kernel
cargo xtask kernel-cases --kernel both --cli target/release/solidcraft-cli # and SMLib
cargo run -p solidcraft-cli -- kernel-cases tests/kernel-cases/booleans/<id> # one case
cargo run -p solidcraft-cli --features smlib -- kernel-cases --dumps=/tmp/dumps <case-dir> # failing SMLib calls leave replayable inputs
cargo xtask kernel-cases # every case
cargo xtask kernel-cases --cli target/release/solidcraft-cli --out /tmp/run # with a CLI already built
cargo run -p solidcraft-cli --features smlib -- kernel-cases tests/kernel-cases/booleans/<id> # one case
```
For the `smlib` column, build `solidcraft-cli` with `--features smlib` (after
`scripts/fetch-smlib.sh`). The rig sets `SOLIDCRAFT_KERNEL=smlib` for those runs.
The CLI needs `--features smlib` (after `scripts/fetch-smlib.sh`); without it every operation
answers that SMLib is not built. The run's output folder (`--out`, default `target/kernel-cases`)
gets `results.json`, every case's full result, and `dumps/<area>-<case>/`: the inputs of each
SMLib call a case failed in, for replay (the CLI's `--dumps=DIR`, which the rig always passes).
## Rules
- **The answer never comes from a kernel.** Not from truck's output, nor any commercial
kernel's. It comes from analysis or a hand calculation, or else from the invariants below.
- **Kernels are graded against the case, never against each other.**
- **No user designs.** A crash report or a repro design becomes a small synthetic recipe that
shows the same geometry. Check for private content before committing anything.
- **No workaround on SolidCraft's side.** A case that fails on a kernel stays failing until that
kernel is fixed. SMLib defects go to tangency-labs/solidcore as issues (`priority: high`,
- **No workaround on SolidCraft's side.** A case that fails stays failing until the kernel is
fixed. SMLib defects go to tangency-labs/solidcore as issues (`priority: high`,
`bug`), and the fix goes into the fork.
## Layout
@@ -83,7 +83,7 @@ the frozen truck-geometry PRs, a `kernel-paused` PR), for the report's coverage
| `source` | `analytic` (numbers worked out by hand; `method` gives the formulas) or `invariants` (no number is known: only the outcome, validity and counts are graded). |
| `method` | How the numbers were derived, or which invariants hold and why. |
| `outcome` | `solid` (default: the script succeeds), `refused` (the right answer is a clean error, never a panic or a hang), or `solid_or_refused` (either a clean error or a result graded as usual, where the geometry has no single manifold answer, such as two bodies touching along a curve only). |
| `valid` | Default `true`: every body is one closed shell (or `shells` in all) that passes the record's structure and geometry checks and, in builds with SMLib, SMLib's `check(All)`. `false` only where the result is legitimately not a solid (a sheet). Where SMLib can't take the record yet (a surface kind its conversion lacks), its check gives no verdict and is not graded. |
| `valid` | Default `true`: every body is one closed shell (or `shells` in all) that passes the record's structure and geometry checks and SMLib's `check(All)`. `false` only where the result is legitimately not a solid (a sheet). Where SMLib can't take the record yet (a surface kind its conversion lacks), its check gives no verdict and is not graded. |
| `shells` | The total number of shells, where it isn't one per body: a body with a sealed void (2), several lumps kept in one body. |
| `body_count`, `faces`, `edges`, `vertices` | Exact counts, where the geometry fixes them. Faces and edges count whole analytic surfaces and curves once (a full cylinder side is one face). |
| `volume_mm3`, `area_mm2`, `center_of_mass`, `bbox` | As in `tests/oracle`: totals over every body, relative tolerance 1e-3 for volume and area, 1e-3 of the box diagonal for positions. |
@@ -103,25 +103,25 @@ running part grows one tier at a time through `base`), so the last case carries
- `ladder/<NN-tier>/<NNN-name>/`: cases in the format above, each a test with its own answer.
- `ladder/ladder.json`: the tiers in order and, per tier, its cases in order (paths under
`tests/kernel-cases/`, so a tier may also list a rig case from another area).
- `ladder/golden.json`: per case and kernel the status, the commands' time and what the kernel
made (counts, volume, area). Runs compare with it and flag slowdowns (over twice the time and
- `ladder/golden.json`: per case the status, the commands' time and what was made (counts,
volume, area). Runs compare with it and flag slowdowns (over twice the time and
0.25 s more) and changed counts or statuses. It is re-recorded only with a reason.
- `tools/kernel-ladder/cases.py` writes the recipes and answers (standard-library Python; each
`method` gives the derivation).
```sh
cargo xtask kernel-cases --ladder --kernel both --cli target/release/solidcraft-cli
cargo xtask kernel-cases --ladder --kernel both --cli target/release/solidcraft-cli --record "why"
cargo xtask kernel-cases --ladder --cli target/release/solidcraft-cli
cargo xtask kernel-cases --ladder --cli target/release/solidcraft-cli --record "why"
```
Ladder runs measure one case at a time (unless `--jobs`); `--record` rewrites the golden and sorts each tier by the first
kernel's time, fastest first; commit both files. The report, `docs/kernel-ladder.md`, gives per
tier and kernel the counts per status and the **frontier**: the first case in ladder order the
kernel fails.
Ladder runs measure one case at a time (unless `--jobs`) and keep their output in
`target/kernel-ladder` (`--out`); `--record` rewrites the golden and sorts each tier by time,
fastest first; commit both files. The report, `docs/kernel-ladder.md`, gives per tier the counts
per status and the **frontier**: the first case in ladder order that fails.
## Results
Per case and kernel: **pass**; **fail** with the numbers; **not supported yet** (the kernel says
Per case: **pass**; **fail** with the numbers; **not supported yet** (the kernel says
so, or the case names a `missing` capability); **crash** (a panic caught by the guards, or the process died); **hang** (no result before
the timeout).
File diff suppressed because it is too large Load Diff
+56 -91
View File
@@ -1,9 +1,12 @@
//! `cargo xtask kernel-cases`: the kernel regression rig. Runs every case in
//! `tests/kernel-cases/<area>/<id>/` through `solidcraft-cli kernel-cases`, one process per case
//! (so a crash or a hang is that case's result, not the run's), with each kernel asked for, and
//! writes `docs/kernel-cases.md`: results per case and kernel, coverage per area and per source,
//! and the issues and PRs looked at and skipped. Each kernel is graded against the cases' own
//! answers, never against the other kernel.
//! `tests/kernel-cases/<area>/<id>/` through `solidcraft-cli kernel-cases` on SMLib, one process
//! per case (so a crash or a hang is that case's result, not the run's), and writes
//! `docs/kernel-cases.md`: results per case, coverage per area and per source, and the issues and
//! PRs looked at and skipped. Each case is graded against its own answer.
//!
//! The run's output folder (`--out`, default `target/kernel-cases`) holds `results.json`, every
//! case's full result, and `dumps/<area>-<case>/`, the inputs of each SMLib call a case's run
//! failed in (`solidcraft-cli kernel-cases --dumps`), for replay.
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
@@ -17,30 +20,33 @@ use crate::{cargo, root};
const DEFAULT_TIMEOUT_S: u64 = 180;
/// Per kernel, how many cases ended in each status.
type StatusCounts = BTreeMap<String, BTreeMap<String, usize>>;
/// How many cases ended in each status.
type StatusCounts = BTreeMap<String, usize>;
pub(crate) struct Options {
pub(crate) kernels: Vec<String>,
cli: Option<String>,
area: Option<String>,
timeout: Duration,
pub(crate) jobs: usize,
/// Where to keep every case's full result as JSON.
results: Option<String>,
/// The run's output folder: `results.json` and the SMLib dumps (`dumps/`).
out: PathBuf,
}
pub(crate) fn options(rest: &[&str]) -> Result<Options, String> {
/// The run's options; `out` is its output folder unless `--out` gives one.
pub(crate) fn options(rest: &[&str], out: &str) -> Result<Options, String> {
let arg = |name: &str| rest.iter().position(|a| *a == name).and_then(|i| rest.get(i + 1)).map(|s| s.to_string());
let kernels = match arg("--kernel").as_deref() {
None | Some("default") => vec!["default".to_string()],
Some("smlib") => vec!["smlib".to_string()],
Some("both") => vec!["default".to_string(), "smlib".to_string()],
Some(k) => return Err(format!("--kernel {k}: default, smlib or both")),
};
let secs = arg("--timeout").map(|t| t.parse::<u64>().map_err(|e| format!("--timeout: {e}"))).transpose()?.unwrap_or(DEFAULT_TIMEOUT_S);
let jobs = arg("--jobs").map(|j| j.parse::<usize>().map_err(|e| format!("--jobs: {e}"))).transpose()?.unwrap_or(4).clamp(1, 32);
Ok(Options { kernels, cli: arg("--cli"), area: arg("--area"), timeout: Duration::from_secs(secs), jobs, results: arg("--results") })
let out = arg("--out").map_or_else(|| root().join(out), PathBuf::from);
Ok(Options { cli: arg("--cli"), area: arg("--area"), timeout: Duration::from_secs(secs), jobs, out })
}
/// Every case's full result as JSON, into the run's output folder.
pub(crate) fn save_results(o: &Options, results: &[Value]) -> Result<(), String> {
std::fs::create_dir_all(&o.out).map_err(|e| format!("{}: {e}", o.out.display()))?;
let path = o.out.join("results.json");
let text = serde_json::to_string_pretty(results).map_err(|e| e.to_string())?;
std::fs::write(&path, text).map_err(|e| format!("{}: {e}", path.display()))
}
pub(crate) fn read(path: &Path) -> Value {
@@ -66,35 +72,32 @@ fn cases(dir: &Path, only: Option<&str>) -> Result<Vec<PathBuf>, String> {
Ok(out)
}
/// One case on one kernel, in its own process, killed after the timeout; `path` is the case's
/// directory under `tests/kernel-cases/`.
fn run_one(o: &Options, kernel: &str, case: &Path) -> Value {
let mut r = run_case(o, kernel, case);
/// One case, in its own process, killed after the timeout; `path` is the case's directory under
/// `tests/kernel-cases/`.
fn run_one(o: &Options, case: &Path) -> Value {
let mut r = run_case(o, case);
let base = root().join("tests/kernel-cases");
r["path"] = json!(case.strip_prefix(&base).unwrap_or(case).to_string_lossy().replace('\\', "/"));
r
}
fn run_case(o: &Options, kernel: &str, case: &Path) -> Value {
fn run_case(o: &Options, case: &Path) -> Value {
let rel = case.strip_prefix(root()).unwrap_or(case).to_path_buf();
let mut cmd = match &o.cli {
Some(bin) => Command::new(bin),
None => {
let mut c = cargo();
c.args(["run", "-q", "--release", "-p", "solidcraft-cli", "--"]);
c.args(["run", "-q", "--release", "-p", "solidcraft-cli", "--features", "smlib", "--"]);
c
}
};
cmd.current_dir(root()).args(["kernel-cases", "--json"]).arg(&rel).stdout(Stdio::piped()).stderr(Stdio::piped());
if kernel == "default" {
cmd.env_remove("SOLIDCRAFT_KERNEL");
} else {
cmd.env("SOLIDCRAFT_KERNEL", kernel);
}
let mut dumps = std::ffi::OsString::from("--dumps=");
dumps.push(o.out.join("dumps"));
cmd.current_dir(root()).args(["kernel-cases", "--json"]).arg(dumps).arg(&rel).stdout(Stdio::piped()).stderr(Stdio::piped());
let base = |status: &str, error: String| {
let area = case.parent().and_then(|p| p.file_name()).map(|n| n.to_string_lossy().to_string()).unwrap_or_default();
let id = case.file_name().map(|n| n.to_string_lossy().to_string()).unwrap_or_default();
json!({"case": id, "area": area, "kernel": kernel, "status": status, "error": error})
json!({"case": id, "area": area, "status": status, "error": error})
};
let mut child = match cmd.spawn() {
Ok(c) => c,
@@ -135,12 +138,11 @@ fn run_case(o: &Options, kernel: &str, case: &Path) -> Value {
}
pub(crate) fn run_all(o: &Options, list: &[PathBuf]) -> Vec<Value> {
let jobs: Vec<(String, PathBuf)> = o.kernels.iter().flat_map(|k| list.iter().map(move |c| (k.clone(), c.clone()))).collect();
let next = Arc::new(Mutex::new(0usize));
let results = Arc::new(Mutex::new(vec![Value::Null; jobs.len()]));
let results = Arc::new(Mutex::new(vec![Value::Null; list.len()]));
std::thread::scope(|s| {
for _ in 0..o.jobs.min(jobs.len().max(1)) {
let (next, results, jobs) = (Arc::clone(&next), Arc::clone(&results), &jobs);
for _ in 0..o.jobs.min(list.len().max(1)) {
let (next, results) = (Arc::clone(&next), Arc::clone(&results));
s.spawn(move || {
loop {
let i = {
@@ -149,13 +151,9 @@ pub(crate) fn run_all(o: &Options, list: &[PathBuf]) -> Vec<Value> {
*n += 1;
i
};
let Some((kernel, case)) = jobs.get(i) else { return };
let r = run_one(o, kernel, case);
println!(
"{:<11} {} [{kernel}]",
r["status"].as_str().unwrap_or("?").to_uppercase(),
case.strip_prefix(root()).unwrap_or(case).display()
);
let Some(case) = list.get(i) else { return };
let r = run_one(o, case);
println!("{:<11} {}", r["status"].as_str().unwrap_or("?").to_uppercase(), case.strip_prefix(root()).unwrap_or(case).display());
if let Ok(mut all) = results.lock()
&& let Some(slot) = all.get_mut(i)
{
@@ -241,13 +239,10 @@ fn source_kinds(dir: &Path, cited: &BTreeMap<String, Vec<String>>) -> Result<Str
Ok(md)
}
fn write_report(o: &Options, dir: &Path, list: &[PathBuf], results: &[Value]) -> Result<String, String> {
fn write_report(dir: &Path, list: &[PathBuf], results: &[Value]) -> Result<String, String> {
let key = |r: &Value| (r["area"].as_str().unwrap_or("").to_string(), r["case"].as_str().unwrap_or("").to_string());
let mut by_case: BTreeMap<(String, String), BTreeMap<String, Value>> = BTreeMap::new();
for r in results {
by_case.entry(key(r)).or_default().insert(r["kernel"].as_str().unwrap_or("").to_string(), r.clone());
}
// Coverage: per area, cases and their statuses per kernel; per source, its cases.
let by_case: BTreeMap<(String, String), &Value> = results.iter().map(|r| (key(r), r)).collect();
// Coverage: per area, cases and their statuses; per source, its cases.
let mut areas: BTreeMap<String, (usize, StatusCounts)> = BTreeMap::new();
let mut per_source: BTreeMap<String, Vec<String>> = BTreeMap::new();
let mut kinds: BTreeMap<String, usize> = BTreeMap::new();
@@ -258,55 +253,35 @@ fn write_report(o: &Options, dir: &Path, list: &[PathBuf], results: &[Value]) ->
let id = case.file_name().map(|n| n.to_string_lossy().to_string()).unwrap_or_default();
let entry = areas.entry(area.clone()).or_default();
entry.0 += 1;
let runs = by_case.get(&(area.clone(), id.clone()));
for k in &o.kernels {
let status = runs.and_then(|r| r.get(k)).and_then(|r| r["status"].as_str()).unwrap_or("not run").to_string();
*entry.1.entry(k.clone()).or_default().entry(status).or_default() += 1;
}
let run = by_case.get(&(area.clone(), id.clone())).copied();
let status = run.and_then(|r| r["status"].as_str()).unwrap_or("not run").to_string();
*entry.1.entry(status).or_default() += 1;
let sources = sources_of(&want);
for s in &sources {
per_source.entry(s.clone()).or_default().push(format!("{area}/{id}"));
}
*kinds.entry(want["source"].as_str().unwrap_or("?").split_whitespace().next().unwrap_or("?").to_string()).or_default() += 1;
let cells: Vec<String> = o.kernels.iter().map(|k| cell(runs.and_then(|r| r.get(k)))).collect();
rows += &format!(
"| {area}/{id} | {} | {} | {} | {} |\n",
sources.iter().map(|s| link(s)).collect::<Vec<_>>().join(" "),
want["what"].as_str().unwrap_or("").replace('|', "/"),
want["source"].as_str().unwrap_or("?"),
cells.join(" | ")
cell(run)
);
}
let mut md = String::from(
"# Kernel regression rig\n\nGenerated by `cargo xtask kernel-cases`. Every geometry case the old kernel (truck) got wrong, as an issue, a PR or a crash report recorded it, is a use case in [`tests/kernel-cases/`](../tests/kernel-cases/) with its own right answer: numbers from analysis or a hand calculation (**analytic**) where the geometry has them, and otherwise the invariants (**invariants**): the operation succeeds, or refuses cleanly where that is the right answer; each body is one closed shell that passes the record's structure and geometry checks and, in builds with SMLib, SMLib's own check; the expected face, edge and vertex counts. Never a kernel's output, and never a commercial kernel's.\n\nEach kernel is graded against the case, never against the other kernel. **default** is the kernel SolidCraft ships today; **smlib** runs with `SOLIDCRAFT_KERNEL=smlib`. A failing case stays failing until its kernel is fixed; there is no workaround on SolidCraft's side. See [`tests/kernel-cases/README.md`](../tests/kernel-cases/README.md) for the format.\n\n",
"# Kernel regression rig\n\nGenerated by `cargo xtask kernel-cases`. Every geometry case the old kernel (truck) got wrong, as an issue, a PR or a crash report recorded it, is a use case in [`tests/kernel-cases/`](../tests/kernel-cases/) with its own right answer: numbers from analysis or a hand calculation (**analytic**) where the geometry has them, and otherwise the invariants (**invariants**): the operation succeeds, or refuses cleanly where that is the right answer; each body is one closed shell that passes the record's structure and geometry checks and SMLib's own check; the expected face, edge and vertex counts. Never a kernel's output, and never a commercial kernel's.\n\nThe cases run on SMLib, SolidCraft's kernel. A failing case stays failing until the kernel is fixed; there is no workaround on SolidCraft's side. A failed SMLib call leaves its inputs for replay in the run's output folder (`target/kernel-cases/dumps/<area>-<case>/`). See [`tests/kernel-cases/README.md`](../tests/kernel-cases/README.md) for the format.\n\n",
);
md += "## Coverage\n\n| Area | Cases |";
for k in &o.kernels {
md += &format!(" {k} |");
}
md += "\n|---|---|";
md += &"---|".repeat(o.kernels.len());
md += "\n";
md += "## Coverage\n\n| Area | Cases | Results |\n|---|---|---|\n";
for (area, (n, statuses)) in &areas {
md += &format!("| {area} | {n} |");
for k in &o.kernels {
let s = statuses.get(k).map(|m| m.iter().map(|(s, c)| format!("{c} {s}")).collect::<Vec<_>>().join(", ")).unwrap_or_default();
md += &format!(" {s} |");
}
md += "\n";
md += &format!("| {area} | {n} | {} |\n", statuses.iter().map(|(s, c)| format!("{c} {s}")).collect::<Vec<_>>().join(", "));
}
md += &format!(
"\n{} cases from {} sources; answers: {}.\n\n## Results\n\n| Case | Sources | What went wrong | Answer |",
"\n{} cases from {} sources; answers: {}.\n\n## Results\n\n| Case | Sources | What went wrong | Answer | Result |\n|---|---|---|---|---|\n",
list.len(),
per_source.len(),
kinds.iter().map(|(k, v)| format!("{v} {k}")).collect::<Vec<_>>().join(", ")
);
for k in &o.kernels {
md += &format!(" {k} |");
}
md += "\n|---|---|---|---|";
md += &"---|".repeat(o.kernels.len());
md += "\n";
md += &rows;
md += "\n## Sources\n\n| Source | Cases |\n|---|---|\n";
for (s, cs) in &per_source {
@@ -344,32 +319,22 @@ fn write_report(o: &Options, dir: &Path, list: &[PathBuf], results: &[Value]) ->
md += "None yet.\n";
}
std::fs::write(root().join("docs/kernel-cases.md"), md).map_err(|e| format!("docs/kernel-cases.md: {e}"))?;
let summary: Vec<String> = o
.kernels
.iter()
.map(|k| {
let n = results.iter().filter(|r| r["kernel"] == k.as_str() && r["status"] == "pass").count();
format!("{k}: {n}/{} pass", list.len())
})
.collect();
Ok(format!("kernel-cases: {} → docs/kernel-cases.md ({skipped} skipped sources listed)", summary.join(", ")))
let pass = results.iter().filter(|r| r["status"] == "pass").count();
Ok(format!("kernel-cases: {pass}/{} pass → docs/kernel-cases.md ({skipped} skipped sources listed)", list.len()))
}
pub fn run(rest: &[&str]) -> Result<(), String> {
if rest.contains(&"--ladder") {
return crate::kernel_ladder::run(rest);
}
let o = options(rest)?;
let o = options(rest, "target/kernel-cases")?;
let dir = root().join("tests/kernel-cases");
let list = cases(&dir, o.area.as_deref())?;
if list.is_empty() {
return Err(format!("no cases (recipe.json + expected.json) under {}", dir.display()));
}
let results = run_all(&o, &list);
if let Some(path) = &o.results {
let text = serde_json::to_string_pretty(&results).map_err(|e| e.to_string())?;
std::fs::write(path, text).map_err(|e| format!("{path}: {e}"))?;
}
println!("{}", write_report(&o, &dir, &list, &results)?);
save_results(&o, &results)?;
println!("{}", write_report(&dir, &list, &results)?);
Ok(())
}
+56 -100
View File
@@ -2,22 +2,23 @@
//!
//! `tests/kernel-cases/ladder/ladder.json` lists tiers in order of complexity and, per tier, its
//! cases in order (paths under `tests/kernel-cases/`, so a tier may also list rig cases from other
//! areas). Each case is a test like any rig case, graded against its own `expected.json`. On top,
//! `tests/kernel-cases/ladder/golden.json` records per case and kernel the status, the commands'
//! time and what the kernel made (counts, volume, area): the run compares with it and flags
//! areas). Each case is a test like any rig case, graded against its own `expected.json`, on
//! SMLib. On top, `tests/kernel-cases/ladder/golden.json` records per case the status, the
//! commands' time and what was made (counts, volume, area): the run compares with it and flags
//! slowdowns and changes; cases run one at a time unless `--jobs` says otherwise, so the times are
//! not shared with other cases. `--record REASON` re-measures the golden and re-sorts each tier
//! by the first kernel's time, fastest first; both files are committed.
//! by time, fastest first; both files are committed. The run's output folder (`--out`, default
//! `target/kernel-ladder`) holds `results.json` and the SMLib dumps, as the rig's does.
//!
//! The report, `docs/kernel-ladder.md`, gives per tier and kernel the counts per status and the
//! robustness frontier: the first case, in ladder order, the kernel fails.
//! The report, `docs/kernel-ladder.md`, gives per tier the counts per status and the robustness
//! frontier: the first case, in ladder order, that fails.
use std::collections::BTreeMap;
use std::path::PathBuf;
use serde_json::{Value, json};
use crate::kernel_cases::{Options, cell, options, read, run_all};
use crate::kernel_cases::{cell, options, read, run_all, save_results};
use crate::root;
/// A case is flagged slower when it takes more than this many times its golden time…
@@ -126,123 +127,77 @@ fn secs(v: &Value) -> String {
v.as_f64().map(|s| format!("{s:.3}")).unwrap_or_else(|| "–".into())
}
fn write_report(o: &Options, tiers: &[Tier], results: &BTreeMap<(String, String), Value>, golden: &Value) -> Result<String, String> {
fn write_report(tiers: &[Tier], results: &BTreeMap<String, Value>, golden: &Value) -> Result<String, String> {
let mut md = String::from(
"# Kernel complexity ladder\n\nGenerated by `cargo xtask kernel-cases --ladder`. The ladder in [`tests/kernel-cases/ladder/`](../tests/kernel-cases/ladder/) orders kernel operations by complexity: each tier builds on the shapes of the tiers before it, so the last case carries everything. Every case is a test with its own right answer (analysis or invariants, as in the [regression rig](kernel-cases.md)); the golden (`tests/kernel-cases/ladder/golden.json`) records per kernel its time and what it made, orders each tier by time and flags slowdowns.\n\nThe **frontier** is the first case of a tier, in ladder order, that the kernel fails (fail, crash or hang).\n\n## Tiers\n\n| Tier | What | Cases |",
"# Kernel complexity ladder\n\nGenerated by `cargo xtask kernel-cases --ladder`. The ladder in [`tests/kernel-cases/ladder/`](../tests/kernel-cases/ladder/) orders kernel operations by complexity: each tier builds on the shapes of the tiers before it, so the last case carries everything. Every case is a test with its own right answer (analysis or invariants, as in the [regression rig](kernel-cases.md)); the golden (`tests/kernel-cases/ladder/golden.json`) records each case's time and what it made, orders each tier by time and flags slowdowns. The cases run on SMLib.\n\nThe **frontier** is the first case of a tier, in ladder order, that fails (fail, crash or hang).\n\n## Tiers\n\n| Tier | What | Cases | Results | Frontier |\n|---|---|---|---|---|\n",
);
for k in &o.kernels {
md += &format!(" {k} | {k} frontier |");
}
md += "\n|---|---|---|";
md += &"---|---|".repeat(o.kernels.len());
md += "\n";
let mut rows = String::new();
let mut totals: BTreeMap<String, BTreeMap<String, usize>> = BTreeMap::new();
let mut pass = 0;
for t in tiers {
md += &format!("| {} | {} | {} |", t.tier, t.what.replace('|', "/"), t.cases.len());
for k in &o.kernels {
let mut counts: BTreeMap<String, usize> = BTreeMap::new();
let mut frontier = None;
for c in &t.cases {
let status = results.get(&(c.clone(), k.clone())).and_then(|r| r["status"].as_str()).unwrap_or("not run").to_string();
if frontier.is_none() && matches!(status.as_str(), "fail" | "crash" | "hang") {
frontier = Some(c.rsplit('/').next().unwrap_or(c).to_string());
}
*totals.entry(k.clone()).or_default().entry(status.clone()).or_default() += 1;
*counts.entry(status).or_default() += 1;
let mut counts: BTreeMap<String, usize> = BTreeMap::new();
let mut frontier = None;
for c in &t.cases {
let status = results.get(c).and_then(|r| r["status"].as_str()).unwrap_or("not run").to_string();
if frontier.is_none() && matches!(status.as_str(), "fail" | "crash" | "hang") {
frontier = Some(c.rsplit('/').next().unwrap_or(c).to_string());
}
let counts = counts.iter().map(|(s, n)| format!("{n} {s}")).collect::<Vec<_>>().join(", ");
md += &format!(" {counts} | {} |", frontier.unwrap_or_else(|| "–".into()));
pass += usize::from(status == "pass");
*counts.entry(status).or_default() += 1;
}
md += "\n";
let counts = counts.iter().map(|(s, n)| format!("{n} {s}")).collect::<Vec<_>>().join(", ");
md += &format!("| {} | {} | {} | {counts} | {} |\n", t.tier, t.what.replace('|', "/"), t.cases.len(), frontier.unwrap_or_else(|| "–".into()));
for c in &t.cases {
let want = read(&root().join("tests/kernel-cases").join(c).join("expected.json"));
rows += &format!("| {} | {} | {} |", c, want["what"].as_str().unwrap_or("").replace('|', "/"), want["source"].as_str().unwrap_or("?"));
for k in &o.kernels {
let r = results.get(&(c.clone(), k.clone()));
let g = golden["cases"][c].get(k);
let f = r.map(|r| flags(r, g)).unwrap_or_default();
rows += &format!(
" {} | {} | {} | {} |",
cell(r),
r.map(|r| secs(&r["seconds"])).unwrap_or_default(),
g.map(|g| secs(&g["seconds"])).unwrap_or_else(|| "–".into()),
f.join("; ").replace('|', "/")
);
}
rows += "\n";
let r = results.get(c);
let g = golden["cases"].get(c);
let f = r.map(|r| flags(r, g)).unwrap_or_default();
rows += &format!(
"| {} | {} | {} | {} | {} | {} | {} |\n",
c,
want["what"].as_str().unwrap_or("").replace('|', "/"),
want["source"].as_str().unwrap_or("?"),
cell(r),
r.map(|r| secs(&r["seconds"])).unwrap_or_default(),
g.map(|g| secs(&g["seconds"])).unwrap_or_else(|| "–".into()),
f.join("; ").replace('|', "/")
);
}
}
// Cases whose bodies SMLib's check gave no verdict on (it can't take the record yet).
let unchecked: Vec<String> = o
.kernels
.iter()
.map(|k| {
let n = results
.iter()
.filter(|((_, kk), r)| {
kk == k && r["checks"].as_array().into_iter().flatten().any(|c| c["got"].as_str().is_some_and(|g| g.starts_with("no verdict")))
})
.count();
format!("{k}: {n}")
})
.collect();
let unchecked = results
.values()
.filter(|r| r["checks"].as_array().into_iter().flatten().any(|c| c["got"].as_str().is_some_and(|g| g.starts_with("no verdict"))))
.count();
md += &format!(
"\nCases where SMLib's check gave no verdict on a body (SMLib can't take the record yet), so only the record's checks graded validity: {}.\n",
unchecked.join(", ")
"\nCases where SMLib's check gave no verdict on a body (SMLib can't take the record yet), so only the record's checks graded validity: {unchecked}.\n"
);
md += "\n## Cases, in ladder order\n\nTimes are the commands' own, in seconds, from the case's process; **golden** is the recorded time.\n\n| Case | What | Answer |";
for k in &o.kernels {
md += &format!(" {k} | s | golden s | changes |");
}
md += "\n|---|---|---|";
md += &"---|---|---|---|".repeat(o.kernels.len());
md += "\n";
md += "\n## Cases, in ladder order\n\nTimes are the commands' own, in seconds, from the case's process; **golden** is the recorded time.\n\n| Case | What | Answer | Result | s | golden s | changes |\n|---|---|---|---|---|---|---|\n";
md += &rows;
std::fs::write(root().join("docs/kernel-ladder.md"), md).map_err(|e| format!("docs/kernel-ladder.md: {e}"))?;
let n: usize = tiers.iter().map(|t| t.cases.len()).sum();
let summary: Vec<String> = o
.kernels
.iter()
.map(|k| {
let pass = totals.get(k).and_then(|m| m.get("pass")).copied().unwrap_or(0);
format!("{k}: {pass}/{n} pass")
})
.collect();
Ok(format!("kernel ladder: {} → docs/kernel-ladder.md", summary.join(", ")))
Ok(format!("kernel ladder: {pass}/{n} pass → docs/kernel-ladder.md"))
}
/// The golden from this run's results (keeping what it holds for kernels not run), and the
/// manifest with each tier sorted by the first kernel's time.
fn record(
o: &Options,
reason: &str,
manifest: &Value,
tiers: &[Tier],
results: &BTreeMap<(String, String), Value>,
golden: &Value,
) -> Result<(), String> {
/// The golden from this run's results (keeping what it holds for cases not run), and the
/// manifest with each tier sorted by time.
fn record(reason: &str, manifest: &Value, tiers: &[Tier], results: &BTreeMap<String, Value>, golden: &Value) -> Result<(), String> {
let mut cases = golden["cases"].as_object().cloned().unwrap_or_default();
for t in tiers {
for c in &t.cases {
let entry = cases.entry(c.clone()).or_insert_with(|| json!({}));
for k in &o.kernels {
if let Some(r) = results.get(&(c.clone(), k.clone())) {
entry[k.as_str()] = golden_entry(r);
}
if let Some(r) = results.get(c) {
cases.insert(c.clone(), golden_entry(r));
}
}
}
let new_golden = json!({"reason": reason, "kernels": o.kernels, "cases": cases});
let new_golden = json!({"reason": reason, "cases": cases});
let mut m = manifest.clone();
let lead = o.kernels.first().cloned().unwrap_or_else(|| "default".into());
if let Some(list) = m["tiers"].as_array_mut() {
for (t, tier) in list.iter_mut().zip(tiers) {
let mut sorted: Vec<(f64, usize, &String)> = tier
.cases
.iter()
.enumerate()
.map(|(i, c)| (results.get(&(c.clone(), lead.clone())).and_then(|r| r["seconds"].as_f64()).unwrap_or(f64::INFINITY), i, c))
.map(|(i, c)| (results.get(c).and_then(|r| r["seconds"].as_f64()).unwrap_or(f64::INFINITY), i, c))
.collect();
// Fastest first; equal times keep the manifest's order.
sorted.sort_by(|a, b| a.0.total_cmp(&b.0).then(a.1.cmp(&b.1)));
@@ -252,7 +207,7 @@ fn record(
let pretty = |v: &Value| serde_json::to_string_pretty(v).map(|s| s + "\n").map_err(|e| e.to_string());
std::fs::write(golden_path(), pretty(&new_golden)?).map_err(|e| format!("golden.json: {e}"))?;
std::fs::write(manifest_path(), pretty(&m)?).map_err(|e| format!("ladder.json: {e}"))?;
println!("kernel ladder: golden recorded ({reason}); tiers re-sorted by {lead} time");
println!("kernel ladder: golden recorded ({reason}); tiers re-sorted by time");
Ok(())
}
@@ -263,7 +218,7 @@ pub fn run(rest: &[&str]) -> Result<(), String> {
Some(None) => return Err("--record needs a reason: --record \"why the golden changes\"".into()),
Some(Some(r)) => Some(r.to_string()),
};
let mut o = options(rest)?;
let mut o = options(rest, "target/kernel-ladder")?;
// Times are compared with the golden: cases run one at a time unless --jobs says otherwise,
// so they don't share the machine with each other.
if !rest.contains(&"--jobs") {
@@ -277,15 +232,16 @@ pub fn run(rest: &[&str]) -> Result<(), String> {
check_listed(&tiers)?;
let base = root().join("tests/kernel-cases");
let list: Vec<PathBuf> = tiers.iter().flat_map(|t| t.cases.iter().map(|c| base.join(c))).collect();
let results: BTreeMap<(String, String), Value> =
run_all(&o, &list).into_iter().map(|r| ((rel_of(&r), r["kernel"].as_str().unwrap_or("").to_string()), r)).collect();
let all = run_all(&o, &list);
save_results(&o, &all)?;
let results: BTreeMap<String, Value> = all.into_iter().map(|r| (rel_of(&r), r)).collect();
let golden = read(&golden_path());
if let Some(reason) = &reason {
record(&o, reason, &manifest, &tiers, &results, &golden)?;
record(reason, &manifest, &tiers, &results, &golden)?;
let tiers = self::tiers(&read(&manifest_path()))?;
println!("{}", write_report(&o, &tiers, &results, &read(&golden_path()))?);
println!("{}", write_report(&tiers, &results, &read(&golden_path()))?);
} else {
println!("{}", write_report(&o, &tiers, &results, &golden)?);
println!("{}", write_report(&tiers, &results, &golden)?);
}
Ok(())
}
+8 -6
View File
@@ -40,15 +40,17 @@ commands:
replay the reference tests (tests/oracle/*/recipe.json), compare with each
case's expected.json and write docs/oracle.md (--cli: a solidcraft-cli
already built, instead of cargo run --release)
kernel-cases [--kernel default|smlib|both] [--area AREA] [--cli BIN] [--timeout S] [--jobs N] [--results FILE]
the kernel regression rig: run every case in tests/kernel-cases/<area>/<id>/ (one
process each, killed after --timeout, default 180 s) with each kernel asked for,
grade it against the case's own answer and write docs/kernel-cases.md (--results:
every result as JSON too)
kernel-cases [--area AREA] [--cli BIN] [--timeout S] [--jobs N] [--out DIR]
the kernel regression rig: run every case in tests/kernel-cases/<area>/<id>/ on
SMLib (one process each, killed after --timeout, default 180 s), grade it against
the case's own answer and write docs/kernel-cases.md; DIR (default
target/kernel-cases) gets results.json and dumps/<area>-<case>/, the inputs of
each failing SMLib call (--cli: a solidcraft-cli built with --features smlib)
--ladder [--record REASON]: the complexity ladder instead
(tests/kernel-cases/ladder/ladder.json, tiers in order), graded and compared
with its timing golden (one case at a time unless --jobs), into
docs/kernel-ladder.md; --record re-measures the golden and re-sorts each tier by time
docs/kernel-ladder.md (DIR default target/kernel-ladder); --record re-measures
the golden and re-sorts each tier by time
action-matrix [--bless] [--results FILE] [--from DIR]
try every ordinary action on every face, edge, vertex and body of the design
corpus and compare with tests/action_matrix/baseline.json (--bless rewrites it;