In our MEP models, for most floor plans we tag the rooms within the linked in Architectural Model except for the times we would like to place data also in those rooms. That's when we use Spaces.
Rooms/Spaces within Revit are containers for information that automatically take up the areas(and volumes if the feature is turned on) between the walls. By design, Rooms and Spaces can be added, deleted and modified the same. You can apply the name and number, add parameters with data, and apply color fill legends in views that are based on data from within them.
That is where the similarities between Room and Spaces end. Rooms are architecturally based and contain default parameters for finishes, whereas Spaces were created for MEP and contain calculations for lighting, heating and cooling loads. Rooms are almost always in the same model as the walls that confine them, so typically the reference "X" or centroid is updated with the walls due to the warnings that come up. Spaces, on the other hand, are only found in our MEP models and will only update shapes the next time you reload a model. When you do reload, you may find that rooms have been merged or moved, so your colored plans are no longer accurate with duplicate rooms in the same location, and worse yet the room names are now inaccurate. "Out of the box" Revit has a feature called Space Name Utility that will allow you to only update Space Name and Number by level or the entire model. Running Space Naming Utility blindly without making sure the spaces with all their information are in the correct location within the floorplan will make your model worse. Data that originally was correct for one room now has a new name and number that now is associated with wrong information.
These issues for updating Spaces based on Rooms is why we had to develop a workflow that would minimize the times that Spaces moved when architecture was updating and make us aware when they are Name and Number discrepancies before we ever run Space Naming Utility. To minimize this issue, we first created a dynamo script that when run periodically will make sure the "X" is always within the center of the Space, therefore, when architects move the wall 1', the Space would be less likely to be moved to the next area. I have since incorporated this into our company plugin, but the dynamo script is below.
Now to identify which Spaces/Rooms have been moved after the fact, a spaces schedule was create with the parameters Space Name, Space Number, Room Name, and Room Number along with a text parameter called Space Status. Since Revit schedules will not allow comparing the of 2 text values in a calculated value, I had to create another dynamo script that fill in the Space Status parameter with "Fix your Space" if the Room Name or Number did not match the Space Name or Number.
By using conditional formatting within the schedule, I had the cells that read "Fix Your Space" highlight red. I could use this to identify all the Spaces that moved and drag them to the right location, then when I realigned as much as I could, run Space Naming Utility. And for good measure, I would rerun the first script, so that I am ready for the next change from the architects.