You have several factors working against you, that one need to take into account:
1 - a 3mm bit may not be 100% 3mm, it may be slightly undersized (most common)
2 - Tool deflection (a thin bit may flex from the side way forces applied during cutting
3 - System deflection, there is in every system a certain amount of “give”
Modern / industrial machines have compensation modes to account for these effects, an Xcarve or similar hobbyist machine do not and we need to “learn” our machine in order to make it produce the desired size.
I use Illustrator to draw the shapes. And export/import them as .SVG… While typing this, I come to think of the following. When I import the svg it NEVER imports on the right size. I always have the scale it all. I always type in the size and I just checked. Easel ignores the decimals I type in. Never noticed this before. this CERTAINLY should give me some error.
How could we xcarvers solve this? Measure the difference and use path offset?
The results a few hours later. A lot better, but stll 0,19 mm off.