Well, something has changed in the calibre code
If I modify my plugin to include a check for device busy that exits after 15 iterations, I get different behaviour with 0.8.2 and the current source.
Using 0.8.2 if I run Book Sync's sync now (without auto creating collections) and then Run Kindle Collections Create as soon as I can click it, things stay busy until the maximum iterations are reached.
Using current calibre source if I run sync now and then run Create as soon as I can, the busy signal is there for a few iterations and then it continues ok. No change in my code/plugin between runs. And its seemed, subjectively that I could click on Kindle Collection's menu just a bit quicker with the new source, but that could just be me.
So lets ignore the forever busy aside, and get back to the main event.
I've added the print statements to the DeviceJob class for start/end. And if I run Book Sync with automatic collections what I see is that Create starts running before the Job is even queued so it never sees the device as busy and just keeps running.
I could add a delay to Create - but what would it be 5 seconds, 10? I think maybe the original suggestion of a callback that Book Sync uses to only call Kindle Collections Create when the sync is really done is the best approach.
I know that if users use send to device for a lot of books and run create too soon they'll miss books. But that seems reasonable since they started it they should monitor it. But if code or another plugin calls create, it should be done its updates before it makes the call. That doesn't mean to say I shouldn't look into changing the plugin to use jobs and check for queued device usage, but even with that it still wouldn't solve the Book Sync integration.