Common issues in CAD design reviews
These mistakes recur in printed parts and assemblies. The list comes from real projects, and each entry links the lesson that recorded it. Every review walks this list, whoever wrote the design and however small the change:
- Run
cad-agent all. Every row in the report must pass. A row that fails, is stale or did not run is a finding, never a footnote. - Then go through the Review rows below. No automatic check covers them yet, so look at the model, the renders and the sources yourself. Say in the review which ones you checked and how.
Drawing diagram…
Scroll sideways to see the full diagram →
Diagram source
flowchart TD
A["cad-agent all"] -->|"every row passes"| R["walk the Review rows<br/>model, renders, sources"]
A -->|"fails, stale<br/>or did not run"| F["finding"]
R -->|"something is off"| F
R -->|"all checked, said how"| P["review can pass"]
F --> N["new kind of mistake? add it here<br/>with the check that would catch it"]
classDef here fill:#fffdf5,stroke:#173d3c,color:#173d3c
classDef near fill:#eef1e4,stroke:#6f8a80,color:#173d3c
classDef out fill:#ffe1cc,stroke:#bd3a12,color:#173d3c
class A,R here
class N near
class F,P out
When a review finds a new kind of mistake, add it here, in the same PR or in an issue, with the check that would catch it. Once a check exists, move the entry from "review" to the check.
Geometry and modelling

cad-agent site, on a test fixture in this repo. Gates this table names, at work on the gate bench. The wall gate checks each part's minimum wall; connectivity, containment, fasteners, motion and assembly read one table of how every pair of parts relates. 144 checks, all pass, and each says physical fit is not verified.| Issue | How it shows up | Caught by | Lesson |
|---|---|---|---|
| A feature added after the holes refills them: a rib, boss, skirt or gusset unioned after the screw holes, counterbores, countersinks or insert bores were cut | The part is a valid watertight solid and every fit, strength and slice check passes, but a screw head will not seat and an insert will not go in. Found on a printed lid: stiffening ribs ran into the four socket-head counterbores | cad-agent holes (the "Holes clear" rows, run by all): every cylindrical hole and countersink cone in each part's STEP is probed for material inside. Fix the build order so every hole is cut last, after all the added features. Known misses, so look at these in a section view: a hole capped at one end reads as blind, and a counterbore blocked right across with a hole cut through the block reads as a ledge (listed in the result) |
mechanical rules |
| A rib or boss ends on air: it was placed over a vent slot or an opening cut later | It looks attached in a render, but FEA puts the peak stress at the joint. A rib that is fully detached prints as a loose piece | FEA, plus a section view at each rib end. The "Printed parts" rows (one solid) catch a rib that is fully detached | mechanical rules |
| Coplanar or flush unions | Faces that only touch leave seams: two solids, a non-manifold edge, or an open STL | The "Printed parts" rows (single solid, watertight). Overlap joined features by 1–2 mm | — |
| Parts collide, or a clearance was checked against a bounding box | It fits in the CAD assembly only because something was approximated or left out | Gates relation table; the project's clearance step. Investigate every hit; classify false positives explicitly | verification |
| Walls or ribs too thin to print or carry load | Weak parts; gaps in the slicer preview | The wall gate (gates); FEA for loaded parts |
simulation |
| Overhangs and unsupported bridges in the print orientation | Sagging or failed prints | cadagent.geometry.downward_area overhang screen; check in the slicer preview |
mechanical rules |
| Engraved or embossed text not fused before cutting | Floating islands; an open mesh | "Printed parts" rows (single solid, watertight) | enclosure features |
| Slender columns or insert bosses not tied into a wall | They crack or wobble when the screw is driven | Review: every boss and column has a load path; FEA | mechanical rules |
| One weak feature fixed, its siblings left as they were | The same failure on the other three corners | Review: survey all similar features when one is found | mechanical rules |
Why every hole is cut last: a rib unioned after the holes runs into the counterbore and the clearance hole, and cad-agent holes finds it inside both. An illustration of the counterbore plate in tests/test_holes.py, in section; the volumes match the hole check's.
Bought parts, sources and assumptions
| Issue | How it shows up | Caught by | Lesson |
|---|---|---|---|
| The wrong bought part: a similar model, a guessed size, another revision | A printed lid 15 mm too short for the cooler that was actually fitted | Review: identify the exact part (vendor, part number, datasheet, photos) before sizing anything around it; record it | simulation |
| A photo read in the wrong orientation, or a flow direction assumed | Features on the wrong side; a CFD with the fan blowing the wrong way | Review: record the user's observations (measurements, "the fan blows up") with the date, and check assumptions against them | verify from source |
| Connector windows sized from a bounding box or the board connector, not the mating plug | The cable's overmould does not fit | cadagent.mechanical.connectors: windows from the modelled mating plug, plus a sweep check |
mechanical rules, cables |
| A vendor model used as if it were measured data | Hidden errors in mounting holes or heights | Review: say which bodies are proxies | verify from source |
| Vendor files committed or redistributed | A licence problem; a leak that cannot be undone | Review the package and release include lists; fetch references with a script | agent workflow |
cadagent.mechanical.connectors sizes the window from the mated plug and sweeps the plug in along its mating axis. A window sized from the jack's bounding box is too short where the latch passes. An illustration of the RJ45 port in tests/test_connectors.py, in section; the swept volumes match the connector check's.
Fasteners and assembly
cadagent.review.gates.assembly, drawn by tools/motion_figures.py, on a test fixture in this repo. The assembly-access gate runs the steps in order. A module is checked on its own bench, then inserted into its parent as one rigid body, then withdrawn.| Issue | How it shows up | Caught by | Lesson |
|---|---|---|---|
| Screw length from the wrong datum, or too little thread engagement | Strips, or bottoms out | The fastener gate; compute the stack plus the engagement; print a coupon | fasteners |
| No tool access at the step where a fastener goes in | It cannot be assembled in the documented order | The assembly-access gate; the assembly-step renders | fasteners |
| Inserts, countersinks or D-holes sized without a test print | Loose inserts; bulkheads that turn | Coupons printed before the big parts | fasteners |
| Cable routes at an impossible bend radius, or tie anchors in the path | Cables that cannot be routed | Review: route from the real mating direction with a stated bend radius | cables |
Evidence, simulation and release
cadagent.simulation.fea, drawn by tools/fea_mesh_figure.py, on a worked example. A result that never converges. Refining the mesh at a steel L-bracket's sharp inside corner from 2 mm to 0.125 mm raises its peak stress from 443 to 1448 MPa; with an R1.5 fillet it stays between 432 and 447 MPa. Model the fillet the part will have, then refine until the peak settles.| Issue | How it shows up | Caught by | Lesson |
|---|---|---|---|
| Stale evidence: reports, renders or results from before the last change | A pass for geometry that no longer exists | Hash-bound results (slice report, hole check, gates, CI parameter check); rerun cad-agent all after every geometry change |
verification |
| Exports that change bytes on every rebuild | The slice report, hole check or fit review goes stale with no geometry change; noisy diffs | Reproducible 3MF writer; cadagent.geometry.export_step for part and assembly STEP (fixed header date or SOURCE_DATE_EPOCH, product named after the file, no uuids); review zips and report pages dated by SOURCE_DATE_EPOCH or the last commit (reproducible outputs); check git diff after a rebuild with no change |
verification |
| A simulation trusted before it converged, balanced and was calibrated | Confident but wrong temperatures or stresses | The project's simulation checks: steady, energy balance, calibrated, and inputs that match the design (fan axis and position) | simulation |
| Material savings judged on CAD volume | The slicer disagrees by tens of percent | cad-agent slice |
simulation |
| A render or report published without being looked at | Wrong colours, clipped views, a stale picture | Review: open every image before it is shown | verification |
| Claims stronger than the evidence | "No re-breathing", "fits", "strong enough" from a model only | Review: every claim names its evidence and its limits; nothing physical is claimed without a print | verification |