Same seed, same counts, different mesh: where Blender's bevel changes under you

If you write a generator with a seed, you’ve probably done what I did: run it
on every Blender you support, compare the counts, and call it deterministic.

Here is the run that taught me the counts are not the thing to compare.

One 2 m cube, one seed, the same add-on, seven binaries. The counts come back
identical on all seven:

336 pieces, 217 chipped, 1249 verts, 2494 tris

The sorted vertex positions do not. They split into two families:

3.6.23, 4.2.23                              family A
4.5.12, 4.5.13, 5.0.1, 5.2.0, 5.2.1         family B

Nearest neighbour between 4.2.23 and 4.5.12, on a part 2000 mm across:

445 of 1249 vertices identical
median move   1.2362 mm
p95           5.7783 mm
worst        14.2038 mm

For comparison, 3.6.23 against 4.2.23 is 0.0010 mm across 3 vertices, which is
float noise and looks nothing like the above.

So something in bmesh.ops.bevel changed between 4.2 and 4.5. It isn’t the amount
of geometry it makes, and it isn’t the topology, because every count agrees. Where
it puts the vertices.

There’s a second half to this that I found separately and it is the same
boundary. Beveling the same mesh on 4.2 and on 4.5 also hands the faces back in
a different order, with the positions identical to nine decimal places. So one
version pair changes the order and not the positions, and another changes the
positions and not the counts, and if you happen to check the wrong one of those
two things you’ll conclude everything is fine.

What I would take from it, if you ship anything seeded:

Compare a digest of the sorted vertex positions, not the counts. Sorting is the
point: it says nothing about the order geometry comes back in, which is the
thing that legitimately varies, and everything about where it ended up.

Don’t key any of your own randomness on vertex index or on iteration order.
Key it on quantised position, so two vertices at the same place get the same
value no matter what order they arrive in.

And say the version boundary out loud in your docs rather than writing
“deterministic”. Mine now says identical from 4.5 up, and gives the millimetre
figures for below it, because “the same seed gives the same mesh” was a
sentence I couldn’t have defended on 4.2.

Numbers above are from seven binaries on one machine on 2026-08-29. If yours
disagree I’d like to know, particularly if you have a 4.3 or 4.4 to hand,
because I don’t have one and the boundary is somewhere inside that gap.