This is a problem with the map format itself.
The VMF format stores brushes by their faces. Each face is an infinite plane that’s clipped by adjacent intersecting faces on the brush and the vertices on the brush are generated from that. This wouldn’t be a huge deal if it was properly implemented, but like with everything Valve does, they fucked it up. This is also why you can’t have concave brushes because the clipping algorithm stops working properly.
The problem is that the VMF format doesn’t have enough decimal precision so when a brush is saved, pretty significant rounding happens and corrupts the face planes, and therefore the vertices. The end result is that even though you may have a technically valid brush, the VMF format can’t accurately represent it and it will get corrupted to something else. I had hell with this on my lavagiant port and it took me about two weeks longer to remake hundreds of brushes that were corrupted into different brushes that didn’t get corrupted from the precision issues.
Here’s an example of the corruption I had to deal with:
VMF corruption after save:
Unlike the corruption you experienced where the vertices just move around, my brushes were shaped in such a way that the three intersecting planes that made a corner couldn’t figure out where exactly to create a vertex. So it decides to create one vertex for each plane plus a few extra floating vertexes that aren’t attached to anything. So I’ve seen anywhere from 3-14 vertices on one corner all bundled together like above.
It’s extremely difficult to select the individual vertexes because 2D mode treats the entire group of vertices as one, which only leaves the 3D view to manipulate them. If you actually take the time, you can peel the corner of a brush apart like a banana and it looks quite odd.
Oh and you absolutely don’t want to compile a map with corrupt brushes like this because it absolutely fucks up visleaf creation. You end up with mangled leaves or micro leaves that players can get stuck in or fall through the world.
There is no fix for this problem other than working around it by not creating such complicated brushes and instead using models in their place.