The diff_file does not need to contain a meta article listing all article to update or create. This list is already in the diff_file, this is the list of articles of the diff_file.
The diff_file should not only store the articles to create, but also the articles to update.
This makes no difference if an article should be updated or created, in both case diff_file should store the whole article.
Yes, diff_file should store as a "meta list", the list of articles to delete.
zimdiff and zimpatch should not work with "diffs" of text contents, this is too complicated to implement correctly and won't bring big advantages. At least in a first time.
diff_file should store the UID of the original ZIM file to allow zimpatch to check before applying if it works on the right file
Pseudocode seems to me to be wrong, everything should be done in one run (no temporary list of articles, except maybe for the list of article to delete).