Actually, you can write code that goes exactly where you want. However, it’s just the same as with regular coding, you may write bugs that have to be fixed. But your INTENT can be exact.
in your case, it sounds like you have a step by step procedure you want to tell the user. This is just a series of gambits in order in a topic. And there are questions you can answer, independent of that. So you write a bunch of responders in that topic (or other topics but lets assume that topic). Then, with quibbles removed from the control script, you can know the flow of control is:
1. try to rejoinder on last thing said
2. try for responders in current topic…. we can actually change that to NAME the topic (~process) rather than even trust a notion of current topic.
3. try for responders in any other topic (not that you have any intended at present)
4. failing that, force a gambit from the ~process topic
5. failing that (meaning the process has been taught), do whatever you want to do.
Trial and error in this case is merely debugging that your responders and rejoinders correctly catch user responses or questions. And figuring out what questions they might ask that you don’t yet handle (which is sort of trial and error by testing with naïve users).