Printed hole test object

I am also a little confused, after some digging through the scad file and doing come calculations I have come to the conclusion that the inscribed diameter is:
Max( 0.8*dn+0.4 , dn-0.4)
where dn is the nominal diameter on the side.

Thus we can translate the holes to internal diameters as so:
2.40 → 2.32
2.60 → 2.48
2.80 → 2.64
2.90 → 2.72
3.00 → 2.80
3.10 → 2.88
3.20 → 2.96
3.40 → 3.12
3.60 → 3.28
3.80 → 3.44
4.00 → 3.60
4.20 → 3.80
4.40 → 4.00

For an M3 screw the outer diameter before cutting the thread is 3 mm. The pitch is 0.5, therefore a perfect thread would have an equilateral triangle cut out of each side 0.5*sqrt(3)/2 ~ 0.433. By convention as you can’t cut the full triangular profile from a screw 100% tap is 3/4 of the calculated triangle. So for 100% tap you would normally drill 3- 2*.433*(3/4) = 2.35 mm
For plastic you normally cut a 75% thread (3- 2*.433*(3/4) *.75) = 2.5 mm
50% threads are common for steel and will still hold will reduced strength, for m3 this is (3- 2*.433*(3/4) *.75) = 2.68

So from engineering I would believe holes with about 2.4-2.7 inscribed diameters would cut properly and hold. Based on Alex’s ( @vektor ) photo, the screws hold for holes with diameters 2.64 to 2.96, which implies that the holes are printing about .25mm smaller than they should be, which doesn’t sound unreasonable.

@rbowman It would make sense to me to change trylinder_selftap so that r is calculated as
(nominal_d + splodge)/2
where splodge is changeable based on a test object, but using Alex as an example it should probably be estimated as about 0.25. If we do this then a hole with nominal_d of 2.5 should tap for M3 which is consistent with the rest of the world’s engineering.