# `StatifierUI.Kino.TraceStepper`
[🔗](https://github.com/riddler/statifier-ui/blob/v0.11.0/lib/statifier_ui/kino.ex#L525)

The persisted inspector's render loop (`sui-2uz`): a `GenServer` holding
one immutable message list and the point in it the panes are showing.

`StatifierUI.Kino.Updater` is its live sibling. The two differ in
exactly one thing - where the messages come from. The updater re-reads
a `StatifierUI.Trace.Subscriber` on every render because the stream is
still growing; a persisted trace is complete when the widget is built,
so this holds the list and re-renders only when the selection moves.
Both ask `StatifierUI.Inspector` where a move lands and what each pane
should say, so the stepping vocabulary is one definition rather than
two.

Started via `Kino.start_child/1`, so re-evaluating the cell terminates
it. There is nothing to detach: no session, no subscriber, no monitor.

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `refresh`

```elixir
@spec refresh(GenServer.server()) :: :ok
```

Renders every pane now.

# `scrub`

```elixir
@spec scrub(GenServer.server(), :live | :first | :prev | :next) :: :ok
```

Moves the selection one scrubber step (`:first`, `:prev`, `:next`,
`:live`) and re-renders. On a persisted trace `:live` is the end of the
recording rather than a tip that moves.

# `select`

```elixir
@spec select(GenServer.server(), non_neg_integer()) :: :ok
```

Jumps straight to macrostep `n` - what the "Jump to" select does, and
what a scrubber alone cannot do on a long recording.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
