The GrowthExperiment structured task workflow is built on top of VisualEditor, and as a hack that saves a bunch of code duplication, we make VE save the page both when the user accepts a recommendation and when they reject it (or rejects every recommendation, in the case of Add Link). On rejection, this should result in a null edit, but sometimes it doesn't because Parsoid introduces small semantically-neutral changes to wikitext (a "dirty diff"). Some examples:
- T333673: 'Add links' saves 0 links, makes a dummy edit
- T340461: 'Add image' claims '1 image' was added, only dummy change saved
- T340170: Section-level images: Placeholder gets saved in wikitext on rejection (which is about a different bug but does include dirty diffs)
We should prevent the saving of such "fake" edits, either by undoing a hack and having a rejection process that does not rely on saving, or by preventing the save (without breaking the workflow too much - at the very least, we need the recommendation to be invalidated and removed from the queue, otherwise the user will just receive it again).
(Dirty diffs can also happen when accepting recommendations, but the only effect then is the edit becoming more confusing, so these have less negative impact; they are also harder to detect, and more disruptive to prevent, so it's less clear if it's worth doing something about them.)
