Thanks Thejus - Yes I am updating the feature when it changes in the attribute inspector...but your comment made me realize that maybe I wasn't doing it in time...
I think there is in fact a significant enough delay when the updateFeature object is revised with new edits that I am clicking 'Save' before the object is revised! If I click another field before clicking save then that gives the object enough time to update.
I confirmed this when I remembered that if I print an entire object to Chrome's console, Chrome keeps it "live" and updates it when values in the object change in the future.
In my original code I was printing the whole updateFeature object to the console. After the applyEdits failed I'd go to the console, and the correct feature object with updates was there! Baffling. But since the Chrome console keeps that reference to the whole object, even though there was a delay, by the time I checked the console it had revised the object in the console with the edits. So I thought the correct feature was being applied....but I changed the console output to be an actual attribute variable, which the Chrome console will not retroactively update, and in fact the edit wasn't there! So I need to create a Deferred or something to make sure a user cannot apply edits until the feature object is fully updated.
Code in main.js that updates with a delay:
arc.edit.variables.attInspector.on("attribute-change", function(evt) {
//store the updates to apply when the save button is clicked
arc.edit.variables.updateFeature.attributes[evt.fieldName] = evt.fieldValue;
});
code in editAttributes.js originally
saveClickFunction : function(feature, attIn) {
...
// !!! Chrome console was retroactively updating this object
// making it seem like edits had been applied
console.log('FEATURE',feature);
...
},
Edited code in editAttributes.js revealing the object not updating in time to be saved:
saveClickFunction : function(feature, attIn) {
...
// !!! Chrome console won't retroactively update this variable
// Revealed it was not updating quickly enough to be caught by the "Save" click
// therefore not applying any edits
console.log('FEATURE',feature.attributes.developer);
...
},