Agreed - I think it's an impossible task to define 'failure' for a runner or exec module, except in the base sense of 'It exited with a non-0 exit code', and I don't think that would fit enough use cases for scenarios where you may say 'I ran successfully, but wasn't able to do what you wanted me to'.
If the runner or exec mod returns the same structure as the state mods do, I think that should be good enough. It'd be nice to key the runner or exec mod into the fact that it's running via the orchestrate - then a mod/runner author could return from the function differently depending on execution context. Then just keep the current process that if the runner/execmod doesn't return the correct structure, just assume it worked.