I guess I'd expect no record to equal another, since they are value based rather than reference based, so unique. I suppose if an SHA1 hash of the bytes of a record's allocated memory matched the SHA1 hash of another record's memory, then they could be considered equal (?)
I've speculatively added:
class operator TProjectManager.=(a,b: TProjectManager): TProjectManager;
begin
Result := a;
end;
...and similar to the TProject definition, just to see whether I could get it to compile - but no joy yet. Perhaps I should switch back to using classes, but I like the tantalising glimpse of automatic life-cycle management that advanced records seem to offer, so thought I'd experiment, and hopefully learn something in the process.