saveRevision(RevisionSlotsUpdate) aka doEditContent() to create update a page by creating a new revision
The method would need more than RevisionSlotsUpdate, at least as it was last I looked. User, edit summary, etc. It might make most sense to put that data into the same object, in which case "PageEditData" might make more sense as a name than "RevisionSlotsUpdate".
(or not, in case of a null-edit).
That has a separate entry point.
we may also want a version of saveRevision that directly takes a RevisionRecord, leaving PST to the caller.
That would follow the same path as the "Null rev" dark-green arrow. It could potentially be exactly the same as that path, depending on the exposed interface.
saveDummyRevision() aka null revision: like saveRevision(), but with no (changed) content.
Not really "like saveRevision()", but as noted above might be the same as the version of saveRevision() that takes a RevisionRecord.
renderRevision() takes a (saved?) RevisionRecord and returns output for it. Similar to preview(). Used for plain views, history views, diff views, etc.
I see no reason to require it be saved. Maybe we'll discover one later, but until then there seems to be no point in restricting it.
Either way it might also be used with a RevisionArchiveRecord.
purge() re-generate any derived data. Re-parsing is optional.
If we go by the diagram, you'd need to get a ParserOutput. That might be able to be taken from ParserCache, I suppose, although the common on-wiki use case I'm aware of is usually specifically refreshing the ParserCache data.
check user permissions, tokens, limits, etc
Tokens are a very UI-level thing, often handled by HtmlForm or ApiMain. Permissions and (probably) limits are more directly related and reusable.
construct an unsaved RevisionRecord from RevisionSlotsUpdate, while apply PST and slot inheritance (and making use of cached data). This component should also provide access to rendered output for the full revision (as well as individual slots). Such output should be created on-demand, and should be cached aggressively.
No, providing the rendered output should be a separate component. In the diagram, "PST, make rev" is the first sentence, and "Render Revision" is the second sentence.
This separation is mainly because various entry points need the latter without the former.
write secondary data to the database.
That's not really a "functionality". The functionality is taking the rendering (i.e. the ParserOutputs) to collect the updates/jobs and scheduling them, while the actual writing of the data is the responsibility of each individual update/job.