What I would expect from Pwb:
- manual mode (y/n) => async
- always mode (a/-always) => sync
How Pwb behaves mostly:
- manual mode => sync (omg why?)
- always mode => async
How Pwb behaves sometimes (replace.py):
- manual mode => async working not so async as it should
- always mode => sync
Cannot really reproduce it. But I re-implemented cached output from compat in https://gerrit.wikimedia.org/r/#/c/pywikibot/core/+/282818/ and discarded all these callback changes in replace.py (which does not work properly especially for other messages than saving hints) to use the default BaseBot's behaviour. In addition I introduce a saving delay for -simulate option with https://gerrit.wikimedia.org/r/#/c/pywikibot/core/+/607072/ and awaiting put threads beeing done during BaseBot.exit() in https://gerrit.wikimedia.org/r/#/c/pywikibot/core/+/607170/. With these concepts I do not find a sticking async behaviour. A good simulating command could be:
py -3 pwb.py replace -simulate a b -start:! -summary:"Bot: Tests"
Confirm several changes with [y]es and stop with [q]uit then.