Once I actually started building stuff and writing tests I had my aha-moment. By putting most of my logic in a separate 'context' module, I could both use and test all that without having to do all the bootstrapping that was necessary to run the web-framework controller logic.
While this might seem obvious to some, for me it felt like a proper level-up as a developer, as I suddenly realized how the same principle could be applied in other contexts.
The other pattern we’ve found to work decently well is to ensure most operations are idempotent. It makes it easy to ensure the correct state.
For instance, if the interactor is in charge of onboarding a new account, we have it under something like this:
Account::SetupOnboarding
Note that we also have an Account model here and so anything namespaced under it will be assumed to take place in that context.