reportTimeout
The scriptguard threw into the step that just ran and nothing reported it, so something swallowed it: the run carried on past an interruption and whatever it produced means nothing. End the eval with the watchdog's report, keeping what it had printed. Not always a swallow, though — a blocking call (Thread.sleep, a lock, IO) gives the guard no point to fire at, so the step can return intact; that value is dropped all the same, on purpose — handing it back is the one answer that leaves the caller no way to learn the tick stood frozen for the whole step.
stepNanos is how long this step itself ran. The budget is shared by every eval stepped in the tick, so a small value means another eval spent it and this one merely happened to be running when it ran out.
Tick thread only: EvalRender.stack reads the watchdog's frames off a thread-matched side channel.