I guess it's caused by the frequently auto sync.
How about hiding the Completed/Failed message if network errors(or other errors with shim.fetchRequestCanBeRetried() == true) occur? Users won't "be trained to ignore errors" if so, and they won't be mislead by the Completed message. Specifically, the network errors message could be shown in a few seconds then disappear.
Otherwise we can separate the sync operations into the user requested ones and the auto-triggered ones. For the former, users are expected to know the details so all error information should be shown. For the latter, Joplin can only show Completed when the sync is successful. If the temporary errors occur, then the message should be hided.