Can anybody help me figure out why Salesforce is saying the Campaign Member ContactId field is not writeable? 

I have Dedupe logic that runs on Contact after insertion, if it matches an existing Lead, any Campaign Member associated to the Lead is reparented to the new Contact.

The Campaign Member is queried via SOQL, and the ContactId is populated with the newly created Contact.Id, and the LeadId is nulled out.

This code was working fine up until this morning it seems.