NativeCAD MCP server · design loops

The DFM design loop closes its own findings

Eight prompts, two per process — machining, injection moulding, sheet metal, additive — whose first build breaks a named design-for-manufacture rule on purpose: a thin wall, no draft, an unrelieved internal corner, an undersized pin. The loop runs cad_dfm_check, takes the remedy its finding names — a face to push out, edges to fillet, walls to draft — and sends it straight back to the kernel. No fillet radius or draft angle on this page was chosen by a person or by the loop: every number below is what the kernel measured before and after its own fix, and every picture is the kernel's own render or section of the body it measured.

8/8pass in ≤ 3 iterations
4processes, 2 prompts each
12fixes applied, all from the checker
0refusals hit while redesigning
Machine a 60 x 40 x 10 mm aluminium tray with a pocket leaving a 0.5 mm floor. — the part that passed, rendered by the kernelMachining (CNC mill) Mill a 60 x 40 x 20 mm block with a square-cornered 30 x 20 x 12 mm pocket — no corner relief for the cutter. — the part that passed, rendered by the kernelMachining (CNC mill) Injection-mould a 60 x 40 x 0.8 mm plate, vertical walls, no draft. — the part that passed, rendered by the kernelInjection moulding Injection-mould a 40 x 40 x 8 mm plate with a shallow square 10 x 10 x 3 mm pocket, no draft, no corner relief. — the part that passed, rendered by the kernelInjection moulding Laser-cut and form a 40 x 30 x 10 mm sheet-metal tray with a pocket leaving a 0.3 mm floor. — the part that passed, rendered by the kernelSheet metal Laser-cut a 40 x 30 x 10 mm sheet-metal block with a square 20 x 15 x 5 mm pocket — no corner relief for the cutting head. — the part that passed, rendered by the kernelSheet metal 3D-print a 30 x 20 x 8 mm FDM tray with a pocket leaving a 0.4 mm floor. — the part that passed, rendered by the kernelAdditive (FDM) 3D-print (Bambu X1 Carbon, 0.4 mm nozzle, PLA) an L bracket with a 0.6 mm rib and a 1.0 mm free-standing pin. — the part that passed, rendered by the kernelAdditive (Bambu X1 Carbon)

The eight parts as the loop left them, each one passing its process's rule pack. Pick one to see how it got there.

Machining (CNC mill)

Machine a 60 x 40 x 10 mm aluminium tray with a pocket leaving a 0.5 mm floor.

PASS · 3 iterations

Thin wall and unrelieved internal corner — the pocket floor is under the machining pack's hard wall floor, and its square corners are sharper than any 6 mm end mill can cut. The second rule was not deliberately dialled in — a square pocket cut with no corner relief always leaves sharp internal corners — but it is real and the loop closes it exactly like the one it was written for.

Rule(s) under test: min_wall_thickness, min_internal_corner_radius

iterop appliedrule — measured vs limitgate
0(first build)min wall thickness: 0.5 mm vs 0.8 mm FAIL
min internal corner radius: 0 mm vs 3.6 mm FAIL
2 blocking
1cad_move_facemin wall thickness: 0.8 mm vs 0.8 mm PASS
min internal corner radius: 0 mm vs 3.6 mm FAIL
1 blocking
2cad_fillet_edgesmin wall thickness: 0.8 mm vs 0.8 mm PASS
min internal corner radius: 3.6 mm vs 3.6 mm PASS
approved
Machine a 60 x 40 x 10 mm aluminium tray with a pocket leaving a 0.5 mm floor. — first build, rendered by the kernel
0. first build
Machine a 60 x 40 x 10 mm aluminium tray with a pocket leaving a 0.5 mm floor. — after cad_move_face, rendered by the kernel
1. after cad_move_face
Machine a 60 x 40 x 10 mm aluminium tray with a pocket leaving a 0.5 mm floor. — after cad_fillet_edges, rendered by the kernel
2. after cad_fillet_edges passes

min wall thickness 0.5 → 0.8 mm (limit 0.8 mm) · min internal corner radius 0 → 3.6 mm (limit 3.6 mm)

5 mm
Side section at y = 20 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×4, where the outline moved most (1.14 mm).
5 mm
Plan section at z = 9 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×4, where the outline moved most (1.491 mm).

Mill a 60 x 40 x 20 mm block with a square-cornered 30 x 20 x 12 mm pocket — no corner relief for the cutter.

PASS · 2 iterations

Unrelieved internal corner — the pocket's square corners are sharper than any 6 mm end mill can cut.

Rule(s) under test: min_internal_corner_radius

iterop appliedrule — measured vs limitgate
0(first build)min internal corner radius: 0 mm vs 3.6 mm FAIL1 blocking
1cad_fillet_edgesmin internal corner radius: 3.6 mm vs 3.6 mm PASSapproved
Mill a 60 x 40 x 20 mm block with a square-cornered 30 x 20 x 12 mm pocket — no corner relief for the cutter. — first build, rendered by the kernel
0. first build
Mill a 60 x 40 x 20 mm block with a square-cornered 30 x 20 x 12 mm pocket — no corner relief for the cutter. — after cad_fillet_edges, rendered by the kernel
1. after cad_fillet_edges passes

min internal corner radius 0 → 3.6 mm (limit 3.6 mm)

5 mm
Side section at y = 20 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×3, where the outline moved most (1.495 mm).
5 mm
Plan section at z = 19 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×4, where the outline moved most (1.491 mm).

Injection moulding

Injection-mould a 60 x 40 x 0.8 mm plate, vertical walls, no draft.

PASS · 3 iterations

Thin wall and no draft — the 0.8 mm plate is under the 1 mm wall floor and dead vertical against the pull.

Rule(s) under test: min_wall_thickness, min_draft_angle

iterop appliedrule — measured vs limitgate
0(first build)min wall thickness: 0.8 mm vs 1 mm FAIL
min draft angle: 0 deg vs 1 deg FAIL
2 blocking
1cad_move_facemin wall thickness: 1 mm vs 1 mm PASS
min draft angle: 0 deg vs 1 deg FAIL
1 blocking
2cad_draftmin wall thickness: 1 mm vs 1 mm PASS
min draft angle: 1 deg vs 1 deg PASS
approved
Injection-mould a 60 x 40 x 0.8 mm plate, vertical walls, no draft. — first build, rendered by the kernel
0. first build
Injection-mould a 60 x 40 x 0.8 mm plate, vertical walls, no draft. — after cad_move_face, rendered by the kernel
1. after cad_move_face
Injection-mould a 60 x 40 x 0.8 mm plate, vertical walls, no draft. — after cad_draft, rendered by the kernel
2. after cad_draft passes

min wall thickness 0.8 → 1 mm (limit 1 mm) · min draft angle 0 → 1 deg (limit 1 deg)

1 mm
Side section at y = 20 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×16, where the outline moved most (0.2 mm).

Injection-mould a 40 x 40 x 8 mm plate with a shallow square 10 x 10 x 3 mm pocket, no draft, no corner relief.

PASS · 3 iterations

No draft and unrelieved internal corner — every wall is dead vertical and the pocket's corners are sharp.

Rule(s) under test: min_internal_corner_radius, min_draft_angle

iterop appliedrule — measured vs limitgate
0(first build)min internal corner radius: 0 mm vs 0.5 mm FAIL
min draft angle: 0 deg vs 1 deg FAIL
1 blocking
1cad_fillet_edgesmin internal corner radius: 0.5 mm vs 0.5 mm PASS
min draft angle: 0 deg vs 1 deg FAIL
1 blocking
2cad_draftmin internal corner radius: 0.5 mm vs 0.5 mm PASS
min draft angle: 1 deg vs 1 deg PASS
approved
Injection-mould a 40 x 40 x 8 mm plate with a shallow square 10 x 10 x 3 mm pocket, no draft, no corner relief. — first build, rendered by the kernel
0. first build
Injection-mould a 40 x 40 x 8 mm plate with a shallow square 10 x 10 x 3 mm pocket, no draft, no corner relief. — after cad_fillet_edges, rendered by the kernel
1. after cad_fillet_edges
Injection-mould a 40 x 40 x 8 mm plate with a shallow square 10 x 10 x 3 mm pocket, no draft, no corner relief. — after cad_draft, rendered by the kernel
2. after cad_draft passes

min internal corner radius 0 → 0.5 mm (limit 0.5 mm) · min draft angle 0 → 1 deg (limit 1 deg)

1 mm
Side section at y = 20 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×11, where the outline moved most (0.264 mm).
1 mm
Plan section at z = 7 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×18, where the outline moved most (0.1728 mm).

Sheet metal

Laser-cut and form a 40 x 30 x 10 mm sheet-metal tray with a pocket leaving a 0.3 mm floor.

PASS · 2 iterations

Thin wall — under the sheet-metal pack's sanity floor on the sheet itself.

Rule(s) under test: min_wall_thickness

Also trips min_internal_corner_radius (not under test): severity warning on the sheet_metal pack: the pocket has no corner relief; it fails the rule, not the gate, so the loop closes on the named rule alone

iterop appliedrule — measured vs limitgate
0(first build)min wall thickness: 0.3 mm vs 0.5 mm FAILapproved
1cad_move_facemin wall thickness: 0.5 mm vs 0.5 mm PASSapproved
Laser-cut and form a 40 x 30 x 10 mm sheet-metal tray with a pocket leaving a 0.3 mm floor. — first build, rendered by the kernel
0. first build
Laser-cut and form a 40 x 30 x 10 mm sheet-metal tray with a pocket leaving a 0.3 mm floor. — after cad_move_face, rendered by the kernel
1. after cad_move_face passes

min wall thickness 0.3 → 0.5 mm (limit 0.5 mm)

1 mm
Side section at y = 15 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×11, where the outline moved most (0.2 mm).

Laser-cut a 40 x 30 x 10 mm sheet-metal block with a square 20 x 15 x 5 mm pocket — no corner relief for the cutting head.

PASS · 2 iterations

Unrelieved internal corner — the pocket's square corners are sharper than the sheet-metal pack's cut-corner floor.

Rule(s) under test: min_internal_corner_radius

iterop appliedrule — measured vs limitgate
0(first build)min internal corner radius: 0 mm vs 0.75 mm FAILapproved
1cad_fillet_edgesmin internal corner radius: 0.75 mm vs 0.75 mm PASSapproved
Laser-cut a 40 x 30 x 10 mm sheet-metal block with a square 20 x 15 x 5 mm pocket — no corner relief for the cutting head. — first build, rendered by the kernel
0. first build
Laser-cut a 40 x 30 x 10 mm sheet-metal block with a square 20 x 15 x 5 mm pocket — no corner relief for the cutting head. — after cad_fillet_edges, rendered by the kernel
1. after cad_fillet_edges passes

min internal corner radius 0 → 0.75 mm (limit 0.75 mm)

1 mm
Side section at y = 15 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×6, where the outline moved most (0.4945 mm).
1 mm
Plan section at z = 9 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×13, where the outline moved most (0.3107 mm).

Additive (FDM)

3D-print a 30 x 20 x 8 mm FDM tray with a pocket leaving a 0.4 mm floor.

PASS · 2 iterations

Thin wall — under two perimeters of the FDM pack's extrusion width, so it prints as a gap.

Rule(s) under test: min_wall_thickness

iterop appliedrule — measured vs limitgate
0(first build)min wall thickness: 0.4 mm vs 0.8 mm FAIL1 blocking
1cad_move_facemin wall thickness: 0.8 mm vs 0.8 mm PASSapproved
3D-print a 30 x 20 x 8 mm FDM tray with a pocket leaving a 0.4 mm floor. — first build, rendered by the kernel
0. first build
3D-print a 30 x 20 x 8 mm FDM tray with a pocket leaving a 0.4 mm floor. — after cad_move_face, rendered by the kernel
1. after cad_move_face passes

min wall thickness 0.4 → 0.8 mm (limit 0.8 mm)

1 mm
Side section at y = 10 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×6, where the outline moved most (0.4 mm).

3D-print (Bambu X1 Carbon, 0.4 mm nozzle, PLA) an L bracket with a 0.6 mm rib and a 1.0 mm free-standing pin.

PASS · 3 iterations

Thin wall and undersized pin — the rib is under the X1 Carbon pack's two-perimeter wall floor and the pin is under its printable-diameter floor.

Rule(s) under test: min_wall_thickness, x1c_min_pin_diameter

iterop appliedrule — measured vs limitgate
0(first build)min wall thickness: 0.6 mm vs 0.84 mm FAIL
min pin diameter (X1C): 1 mm vs 1.5 mm FAIL
2 blocking
1cad_move_facemin wall thickness: 0.84 mm vs 0.84 mm PASS
min pin diameter (X1C): 1 mm vs 1.5 mm FAIL
1 blocking
2cad_move_facemin wall thickness: 0.84 mm vs 0.84 mm PASS
min pin diameter (X1C): 1.5 mm vs 1.5 mm PASS
approved
3D-print (Bambu X1 Carbon, 0.4 mm nozzle, PLA) an L bracket with a 0.6 mm rib and a 1.0 mm free-standing pin. — first build, rendered by the kernel
0. first build
3D-print (Bambu X1 Carbon, 0.4 mm nozzle, PLA) an L bracket with a 0.6 mm rib and a 1.0 mm free-standing pin. — after cad_move_face, rendered by the kernel
1. after cad_move_face
3D-print (Bambu X1 Carbon, 0.4 mm nozzle, PLA) an L bracket with a 0.6 mm rib and a 1.0 mm free-standing pin. — after cad_move_face, rendered by the kernel
2. after cad_move_face passes

min wall thickness 0.6 → 0.84 mm (limit 0.84 mm) · min pin diameter (X1C) 1 → 1.5 mm (limit 1.5 mm)

1 mm
Plan section at z = 12 mm. Dashed: the first build. Filled: the part that passed. Right: the boxed region, enlarged ×18, where the outline moved most (0.25 mm).

All 8, at a glance

processpromptrule(s)iterations to passresult
Machining (CNC mill)Machine a 60 x 40 x 10 mm aluminium tray with a pocket leaving a 0.5 mm floor.min wall thickness, min internal corner radius3pass
Machining (CNC mill)Mill a 60 x 40 x 20 mm block with a square-cornered 30 x 20 x 12 mm pocket — no corner relief for the cutter.min internal corner radius2pass
Injection mouldingInjection-mould a 60 x 40 x 0.8 mm plate, vertical walls, no draft.min wall thickness, min draft angle3pass
Injection mouldingInjection-mould a 40 x 40 x 8 mm plate with a shallow square 10 x 10 x 3 mm pocket, no draft, no corner relief.min internal corner radius, min draft angle3pass
Sheet metalLaser-cut and form a 40 x 30 x 10 mm sheet-metal tray with a pocket leaving a 0.3 mm floor.min wall thickness2pass
Sheet metalLaser-cut a 40 x 30 x 10 mm sheet-metal block with a square 20 x 15 x 5 mm pocket — no corner relief for the cutting head.min internal corner radius2pass
Additive (FDM)3D-print a 30 x 20 x 8 mm FDM tray with a pocket leaving a 0.4 mm floor.min wall thickness2pass
Additive (Bambu X1 Carbon)3D-print (Bambu X1 Carbon, 0.4 mm nozzle, PLA) an L bracket with a 0.6 mm rib and a 1.0 mm free-standing pin.min wall thickness, min pin diameter (X1C)3pass

More demos

All demos →

Build your own part with NativeCAD

Free for education and makers with a registered key · $200 per seat per year · Kernel SDK for products.