Errors & dismissible
A step whose target never shows up within waitTimeout follows onMissing: "skip" (default) moves on in the same direction, "end" ends the run. A hook that throws or times out goes through onError, which picks an action:
"end"(default): ends the run, even when it is not dismissible."skip": next step in the same direction."retry": replays the transition once, then ends."stay": stays on the current step; without a current step, or when it is not dismissible, it ends instead.
Whatever happens, ending a run releases everything it holds: veil, scroll lock, keyboard listeners, observers, focus. Cleanup hooks that throw are reported, not rethrown.
dismissible: false (entry, guide or manager) removes the ways out: Escape, a click on the veil and end("dismissed") are refused, and the frame hides Skip. end("completed") is always possible.
All options resolve the same way: entry, then guide, then manager, then default.