when serializing, the normalized positions are not calculated, they were cached. So if the cached value is not the actuel position, the save get corrupted.
In ControlPointsController.cs replace GetNormalizedPositionList() like this:
public List<Vector3> GetNormalizedPositionList()
List<Vector3> list = new List<Vector3>();
list = GetPointsList().Select(s => (Vector3)s.GetNormalizedPostion(grid)).ToList();
And add this function inside ControlPoint.cs
public Vector3 GetNormalizedPostion(Grid grid)
The position will always be recalculated at save time.
By the way, I see that there is a small bug, when you click to create the control point, it gets moved/dragged, so it's no longer the snapped control point that was found when moving the mouse before clicking. to fix, remove the DragPoint() call line 304 of ControlPointsController:
else if ((cp == null || cp == ghostPoint) && IsDrawing)
cp = CreateControlPointBasedOnGhost();