Kernel rig: the reason each refused sheet-metal, sweep, crash and ladder case must be refused for

Ten `refused` cases outside the fillets had no `refusal` since #8445 made one required. Each
was run; its refusal is the right answer for the reason its method gives, and that reason is
now its `refusal`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jyviko
2026-10-28 16:51:15 -04:00
committed by Irakli Kourtis
parent 97a31c0c0c
commit cfaf4ab557
10 changed files with 20 additions and 10 deletions
@@ -5,5 +5,6 @@
"what": "a snap fit 1e-9 mm thick on a box: it got past validation and panicked in the kernel ('tolerance must be no less than 1e-6')",
"source": "invariants",
"method": "a 1e-9 mm wall is no solid: the right answer is a clean refusal, never a panic",
"outcome": "refused"
"outcome": "refused",
"refusal": "the snap fit's thickness must be at least 0.01 mm"
}
@@ -3,5 +3,6 @@
"what": "rounds r5 and r3 on the two top edges at a corner, then r7 on the vertical edge under them: refused, the r7 cannot exist",
"source": "invariants",
"method": "the r7 runs on (tangent chain) up the side x=60 along its arc on the r5 round, a circle of radius 5 about the r5 axis: the r7's contact line on that face would be the arc offset 7 towards its centre, radius 5 - 7 < 0, so the blend passes through itself; and along the seam of the r5 and r3 rounds no ball over r3 fits the r3 round. No such round exists, so the right answer is a clean refusal (SMLib: no room for the rolling ball). 018 is the same corner with a radius that fits.",
"outcome": "refused"
"outcome": "refused",
"refusal": "the fillet is larger than the faces beside its edges allow"
}
@@ -6,5 +6,6 @@
"what": "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",
"source": "invariants",
"method": "the fold line y = 50 is the tab's root: its bend zone reaches the corners (40,50) and (60,50) of the outline, so a clean bend is impossible without a relief that fold does not cut; the right behaviour is a refusal that names the cause, not a panic, a hang or a malformed body (BA/2 = (pi/2)(0.8+0.352)/2 = 0.905 mm)",
"outcome": "refused"
"outcome": "refused",
"refusal": "the bend zone (1.810 mm wide) reaches a corner of the sheet's outline"
}
@@ -6,5 +6,6 @@
"what": "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",
"source": "invariants",
"method": "the base's edge at y = 5 (the setback R + T = 5 from the first flange) is the bend line of the existing flange, not a free edge; a flange there would stand on material the first bend already occupies. The right behaviour is a clean refusal that leaves the sheet unchanged",
"outcome": "refused"
"outcome": "refused",
"refusal": "that edge is the bend line of a flange; pick a free edge of the sheet"
}
@@ -7,5 +7,6 @@
"what": "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",
"source": "invariants",
"method": "after Fillet R10 on a corner of a 100 x 60 sheet the body has a round, and a flat pattern written from the sheet model would be the sharp 100 x 60 rectangle, a different part from the design; the right behaviour is a clean refusal naming the feature",
"outcome": "refused"
"outcome": "refused",
"refusal": "the flat pattern of `Body1` can't include Fillet1, which changed the body after its sheet metal features"
}
@@ -7,5 +7,6 @@
"what": "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",
"source": "invariants",
"method": "a base flange asked for a 0.8 mm sheet must either build 0.8 mm (V = 100*60*0.8 = 4800) or refuse; it must never succeed with another thickness. The engine's documented behaviour is the refusal (the rule is the only source of thickness, k-factor and radius), so the right answer here is a clean refusal",
"outcome": "refused"
"outcome": "refused",
"refusal": "`thickness` is not a sheet.flange parameter: the sheet metal rule sets it"
}
@@ -6,5 +6,6 @@
"what": "a rectangle that straddles the revolve axis (x from -5 to 15 about the sketch y axis)",
"source": "invariants",
"method": "a profile on both sides of the axis would sweep over itself, so no solid exists: the right behaviour is a clean refusal (invalid input), with no body made.",
"outcome": "refused"
"outcome": "refused",
"refusal": "the profile crosses the revolve axis"
}
@@ -6,5 +6,6 @@
"what": "a profile on the XZ plane revolved about the world Y axis, which does not lie in the sketch plane",
"source": "invariants",
"method": "the revolve axis must lie in the profile plane (the Y axis is perpendicular to the XZ plane): the right behaviour is a clean refusal, with no body made.",
"outcome": "refused"
"outcome": "refused",
"refusal": "the Y axis does not lie in the sketch plane"
}
@@ -5,5 +5,6 @@
"what": "a sweep with an end scale of 500 (the engine allows 0.01 to 100): the option check (SweepControl::check) must refuse it",
"source": "invariants",
"method": "a scale outside 0.01..100 is a hostile value for the sweep options: the right behaviour is a clean refusal with no body made.",
"outcome": "refused"
"outcome": "refused",
"refusal": "`scale` (the end scale) must be between 0.01 and 100"
}
@@ -5,5 +5,6 @@
"what": "a loft through two circles drawn on the same plane (no volume between them; it built a flat zero-volume body and reported success)",
"source": "invariants",
"method": "the two sections are coplanar, so no solid exists between them: the right behaviour is a clean refusal with no body left, never a zero-volume body.",
"outcome": "refused"
"outcome": "refused",
"refusal": "loft sections 1 and 2 lie in the same plane"
}