from Row
Rebuild a DriftReport from a returned node's property map, checking on the way that the two halves of its scope still agree.
The scope is stored twice: as contextId, absent when global, and as the never-null contextKey the natural key merges on. Reads and writes use different halves — a scoped read matches contextId, a save merges on contextKey. A node where the two disagree would answer to one scope when read and another when re-saved, so the row is refused.