Yes, this is exactly what's happening - I'm not sure if it's good etiquette to post a screenshot to this mailing list, but I'm happy to provide the results of dns/v1/changes/list to illustrate this is happening.
However, looking back at the documentation for replaceRecords, this is expected behaviour:
> Provide a record type that should be deleted and replaced with other records.
The problems here are two fold, one is my inability to comprehensively read documentation, two is my distrust of the way gcloud-node/google-cloud is structured, because the API (zone.record()) for retrieving a record is the same API as creating a record, and it's not clear how this works in the context of a changeset. Honestly, it seems like you're composing both a query for the API ("get me this record") and new object ("make me this record") with the same function, and that's slightly unsettling to me. I'm trying to treat this API from an object-orientated perspective, which doesn't seem to be how this library is structured.
I disabled the Cloud Function running replaceRecords last night, and now records are actually staying around. Thank you very much for your assistance in solving this, I really appreciate it!
Thanks,
Luke