Kernel rig: fillet cases for the open fillet issues, each with its exact answer

New: an r5 curvature corner at a box corner (its patch must seam G2), an
edge running tangentially into a round left out (refused: continues
tangentially), a convex r10.01 round 0.01 past a 10 mm face (built by
subtraction: V = 7139.875, A = 2585.140). The bar and boss arc rounded
together say their crease (15.6 deg r2, 13.1 deg r1); 1390 expects SMLib's
unsupported-corner refusal, the honest reason today; past a full round
the exact fit's refusal names the largest radius that fits, 7.5 mm.

KNOWN_FAILING lists the 18 of 89 fillet cases failing today, each with
its cause.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jyviko
2026-10-28 19:25:31 -04:00
committed by Irakli Kourtis
parent 39bf63b16a
commit 52339b7ec3
12 changed files with 188 additions and 13 deletions
@@ -2,7 +2,7 @@
"sources": [
"tangency-labs/solidcraft#1207"
],
"what": "the bar's top edge and the partial base arc of a boss standing out over the bar's side, rounded r1 together: they meet at a vertex whose third edge (the boss's line on the side face) is concave",
"what": "the bar's top edge and the partial base arc of a boss standing out over the bar's side, rounded r1 together: the corner patch where they meet must join the bar's round at least G1 (today a 13.1° crease)",
"source": "analytic",
"method": "bar 100x30x10 (y -15..15) joined with a diameter 40 boss 20 tall at the origin, standing out over both sides (V0 = 49756.1794, as 1207-fillet-concave-arc-at-boss). The bar's front top edge (y=-15, z=10) and the boss's base arc over the bar (its two edges, split at the cylinder's seam: the tangent chain) rounded r1 together meet at (13.229, -15, 10), where the third edge, the boss's line on the front face, is concave and runs down. Away from that corner the body is V0 plus the arc round's spandrel strip ending on y=+-15 (integral over rho of [r - sqrt(r^2-(20+r-rho)^2)] rho 2 asin(15/rho) = 7.2537, Simpson) less the front round's spandrel out to the boss wall (integral over y of [r - sqrt(r^2-(y+15-r)^2)] (100 - sqrt(400-y^2)) = 18.5684); the corner patch lies within the cube of side 2r about the vertex, so V is graded as V0 + add - removed with (2r)^3 as its tolerance",
"body_count": 1,
@@ -13,4 +13,4 @@
"continuity": {
"order": "g1"
}
}
}
@@ -2,7 +2,7 @@
"sources": [
"tangency-labs/solidcraft#1207"
],
"what": "the bar's top edge and the partial base arc of a boss standing out over the bar's side, rounded r2 together: they meet at a vertex whose third edge (the boss's line on the side face) is concave",
"what": "the bar's top edge and the partial base arc of a boss standing out over the bar's side, rounded r2 together: the corner patch where they meet must join the bar's round at least G1 (today a 15.6° crease)",
"source": "analytic",
"method": "bar 100x30x10 (y -15..15) joined with a diameter 40 boss 20 tall at the origin, standing out over both sides (V0 = 49756.1794, as 1207-fillet-concave-arc-at-boss). The bar's front top edge (y=-15, z=10) and the boss's base arc over the bar (its two edges, split at the cylinder's seam: the tangent chain) rounded r2 together meet at (13.229, -15, 10), where the third edge, the boss's line on the front face, is concave and runs down. Away from that corner the body is V0 plus the arc round's spandrel strip ending on y=+-15 (integral over rho of [r - sqrt(r^2-(20+r-rho)^2)] rho 2 asin(15/rho) = 28.9190, Simpson) less the front round's spandrel out to the boss wall (integral over y of [r - sqrt(r^2-(y+15-r)^2)] (100 - sqrt(400-y^2)) = 74.0736); the corner patch lies within the cube of side 2r about the vertex, so V is graded as V0 + add - removed with (2r)^3 as its tolerance",
"body_count": 1,
@@ -13,4 +13,4 @@
"continuity": {
"order": "g1"
}
}
}
@@ -0,0 +1,10 @@
{
"sources": [
"tangency-labs/solidcraft#1207"
],
"what": "an edge that runs on tangentially into a round left out of the blend (tangent chain off) is refused saying so: a blend cannot end where its edge continues smoothly",
"source": "invariants",
"method": "cube 20, its top back edge (y=20, z=20) rounded r3; the end face's top edge (x=0, z=20, y 0..17) then rounded r1 alone, tangent_chain false: at (0, 17, 20) it continues tangentially into the round's end arc, which is not blended with it. A round has no end there (SMLib blends a tangent chain as one sequence), so the right answer is a clean refusal naming that; with the tangent chain on it builds",
"outcome": "refused",
"refusal": "continues tangentially"
}
@@ -0,0 +1,40 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 20,
"width": 20,
"height": 20,
"body_name": "Cube"
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
10,
20,
20
]
],
"radius": 3
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
0,
8,
20
]
],
"radius": 1,
"tangent_chain": false
}
}
]
}
@@ -4,9 +4,9 @@
"tangency-labs/solidcraft#1574",
"tangency-labs/solidcraft#1428"
],
"what": "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",
"what": "a 3 mm chamfer on the rim of a hole tangent to the bottom face runs off that face: refused, today because SMLib's blends have no corner of the kind where the rim meets the bottom tangentially (never material added below the part)",
"source": "invariants",
"method": "cube 20 with a diameter 10 hole along -Y from the back face, its axis at z=5 so the hole wall touches the bottom face z=0 along one line. The hole rim on the back face has no face material between it and the bottom edge there, so a 3 mm setback cannot lie on the face: no chamfer of that size exists. The right answer is a clean refusal (a chamfer of a convex edge only ever removes material; building it grew the part by 1067 mm3 below the bottom face).",
"method": "cube 20 with a diameter 10 hole along -Y from the back face, its axis at z=5 so the hole wall touches the bottom face z=0 along one line. The hole rim on the back face has no face material between it and the bottom edge there, so a 3 mm setback cannot lie on the face: no chamfer of that size exists. The right answer is a clean refusal (a chamfer of a convex edge only ever removes material; building it grew the part by 1067 mm3 below the bottom face). SMLib refuses it today at the vertex where the rim runs tangentially into the bottom edge: no blend corner it builds handles that, and the refusal says so (the honest reason today; a too-large refusal would need the corner first).",
"outcome": "refused",
"refusal": "larger than the faces beside its edges allow"
"refusal": "meets a corner of this kind"
}
@@ -2,9 +2,9 @@
"sources": [
"tangency-labs/solidcraft#4782"
],
"what": "both vertical edges of a 15 mm wide box end rounded r10, past the full round (7.5): refused",
"what": "both vertical edges of a 15 mm wide box end rounded r10, past the full round (7.5): refused naming the largest radius that fits, 7.5",
"source": "invariants",
"method": "each round's rail on the end face lies 10 from its edge, past the other's (15 - 10 = 5): the rounds would cross on the face; refused as too large (the largest that fits is the full round, 7.5, which fit reduce finds)",
"method": "box 80x15x20, the two vertical edges at x=80 rounded r10 with the exact fit (the default): the two rounds meet at r = 15/2 = 7.5, where they use up the 15 mm end face (a full round, as 199-fillet-uses-up-end-face); past it no round fits, so the right answer is a clean refusal that names 7.5 mm, the largest radius that fits (fillet_max, three significant digits: 7.50)",
"outcome": "refused",
"refusal": "larger than the faces beside its edges allow"
}
"refusal": "the largest radius that fits is 7.5 mm"
}
@@ -0,0 +1,13 @@
{
"sources": [
"tangency-labs/solidcraft#5158",
"tangency-labs/solidcraft#4782"
],
"what": "a convex r10.01 round on an edge whose top face is 10 mm deep, 0.01 past it: it must build by subtraction (the round on the extended faces cut from the body), not be refused",
"source": "analytic",
"method": "box 40x10x20, the top front edge (y=0, z=20) rounded r = 10.01: axis at (y, z) = (10.01, 9.99), tangent to the front face at z = 9.99 and to the top face's plane at y = 10.01, past the back face y = 10. Convex blends overflow by subtraction (owner, 2026-10-25): the section removed is A = integral over y in [0, 10] of (r - sqrt(r^2 - (r - y)^2)) = r (r - 0.01) - [F(r) - F(0.01)], F(u) = (u sqrt(r^2 - u^2) + r^2 asin(u / r)) / 2, = 21.5031255 (midpoint rule, 2e5 steps: the same). V = 40 (200 - A) = 7139.874981. The round meets the back face at z = 9.99 + sqrt(r^2 - 0.01^2) = 19.999995 (the top face is used up); area = front 40*9.99 + back 40*19.999995 + bottom 400 + round 40 r (pi - acos(-0.01 / r)) + ends 2 (200 - A) = 2585.1404. Faces: front, back, bottom, two ends, the round = 6",
"body_count": 1,
"volume_mm3": 7139.874981155627,
"area_mm2": 2585.1403984396748,
"faces": 6
}
@@ -0,0 +1,26 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 10,
"height": 20,
"body_name": "Box"
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
20,
0,
20
]
],
"radius": 10.01
}
}
]
}
@@ -2,7 +2,7 @@
"sources": [
"tangency-labs/solidcraft#9"
],
"what": "three r1 rounds at a box corner with the curvature (g2) corner at its default setback 1.5 r",
"what": "three r1 rounds at a box corner with the curvature (g2) corner at its default setback 1.5 r: the corner patch must meet the rounds and faces G2 (today it is G1 at the corner point)",
"source": "invariants",
"method": "as ladder 07-fillets/015 at r1: the corner set back 1.5 and filled with one patch; no closed-form volume: one valid body, 6 faces + 3 rounds + the patch, within the box",
"body_count": 1,
@@ -23,4 +23,4 @@
"order": "g2",
"edges": "corner"
}
}
}
@@ -0,0 +1,26 @@
{
"sources": [
"tangency-labs/solidcraft#9"
],
"what": "three r5 rounds at a box corner with the curvature (g2) corner at its default setback 1.5 r: the corner patch must meet the rounds and faces G2 (today it is G1 at the corner point)",
"source": "invariants",
"method": "as ladder 07-fillets/015: box 60x40x20, the three edges at the corner (60, 40, 20) rounded r5 with corner g2, the corner set back 7.5 and filled with one patch built G2 to the three rounds and the three faces; no closed-form volume: one valid body, 6 faces + 3 rounds + the patch, within the box; every seam of the patch G2, measured as Continuity Analysis measures it",
"body_count": 1,
"faces": 10,
"bbox": {
"min": [
0,
0,
0
],
"max": [
60,
40,
20
]
},
"continuity": {
"order": "g2",
"edges": "corner"
}
}
@@ -0,0 +1,38 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 60,
"width": 40,
"height": 20,
"body_name": "Part"
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
60,
20,
20
],
[
30,
40,
20
],
[
60,
40,
10
]
],
"radius": 5,
"corner": "g2",
"tangent_chain": false
}
}
]
}
+22
View File
@@ -0,0 +1,22 @@
# The fillet cases that fail today, one a line: `<case> <why it fails today>`. Sorted. The fillet
# rig gate (.github/workflows/fillet-rig.yml) fails on a case that fails and is not listed here,
# and on a listed case that passes: a fix removes its line in the same pull request.
# Baseline: develop 30dc4c860 (SMLib 5afca53), aarch64 Linux, 2026-10-28: 71 of 89 pass.
1207-fillet-bar-top-edge-after-boss-arc-round-no-tangent-chain SMLib status 1001 instead of the "continues tangentially" refusal (refused before SMLib on branch fillet-remaining-cases)
1207-fillet-bar-top-edge-after-boss-arc-round-r0-5 SMLib's check refuses the round: internal coincident control points in a B-spline curve (an internal pole)
1207-fillet-bar-top-edge-and-boss-arc-together continuity g0: the corner patch meets the bar's round with a 15.6° crease
1207-fillet-bar-top-edge-and-boss-arc-together-curvature-corners continuity g0: the corner patch meets the bar's round with a 15.6° crease (as the rolling corner)
1207-fillet-bar-top-edge-and-boss-arc-together-r1 continuity g0: the corner patch meets the bar's round with a 13.1° crease
1207-fillet-bar-top-edge-and-boss-arc-together-reduce-fit continuity g0: the corner patch meets the bar's round with a 15.6° crease (as the exact fit)
1207-fillet-bar-top-edge-and-boss-arc-together-taper-fit continuity g0: the corner patch meets the bar's round with a 15.6° crease (as the exact fit)
1207-fillet-box-end-edge-into-unblended-round-refused SMLib status 1001 instead of the "continues tangentially" refusal (refused before SMLib on branch fillet-remaining-cases)
1390-chamfer-hole-rim-touching-bottom SMLib status 1001 instead of naming the unsupported corner (SMLIB_ERR_CORNER_UNSUPPORTED on branch fillet-open-cases)
4782-fillet-bar-edge-wider-than-both-faces SMLib status 1001: a convex round past both its faces is not yet built by subtraction
4782-fillet-two-end-verticals-past-a-full-round SMLib's result is not a closed solid, where a refusal naming 7.5 mm (fillet_max for the exact fit) is right
4782-fillet-two-end-verticals-past-a-full-round-reduce-fit SMLib's result is not a closed solid at r10, so the reduce fit never searches down
5158-fillet-round-just-past-a-10mm-face SMLib status 1001: a convex round 0.01 past its face is not yet built by subtraction (10.0001-10.04 open)
896-fillet-smooth-seam-refused SMLib SM_ERR_INVALID_INPUT instead of the "is smooth" refusal (refused before SMLib on branch fillet-remaining-cases)
9-fillet-corner-curvature-with-reduce-fit not supported yet: solid.fillet builds corner g2 with the exact fit only
9-fillet-corner-curvature-with-taper-fit not supported yet: solid.fillet builds corner g2 with the exact fit only
9-fillet-corner-r1-curvature-default-setback continuity g1: the g2 corner patch seams G1 at the corner point, not G2
9-fillet-corner-r5-curvature-default-setback continuity g1: the g2 corner patch seams G1 at the corner point, not G2