Files
sanderling/docs/manual/inspect.md
pj f572c8ba66 WIP: docs: refresh after iOS + web support (#50)
* docs: README covers iOS + web, surface both example apps

* docs(cli): document --ios-device and per-platform doctor

* docs: tighten README, fold examples into Docs list

* docs(runs): correct --clear-data lifecycle wording

Default behavior no longer wipes app data between runs; --clear-data is now opt-in.

* docs(getting-started): add iOS path, separate folio and folio-web

Document just test-ios under examples/folio, and distinguish the KMP
sample from the React + Vite folio-web sample.

* docs(inspect): document the eight panels

Lists Screenshot, ActionList, Timeline, ViolationsPanel, HierarchyPanel,
SnapshotTable, MetricsChart, ExceptionsPanel. Cross-links HierarchyPanel
to the spec language reference.

* docs(writing-specs): document setup export, flag noLogcatErrors as android-only

Mirrors pkg/spec/README.md so the manual covers the runner's setup-first
fall-through. Marks noLogcatErrors as Android-only so iOS/web spec
authors know it silently no-ops.

* docs(folio): document web target and iOS sanderling test recipe

After the KMP refactor folio also runs on wasmJs and the justfile exposes
just web, just web-build, and just test-ios. Surface all three.

* docs(folio-web): add README

Covers prerequisites, demo credentials, just test recipe, and how the
React + Vite host exposes state to the sanderling spec via stable ids
and data-* attributes.

* docs: scrub driver-implementation name from user docs

Drop the implementation tool name from README, cli.md doctor table, and
spec-language.md. These docs should describe behaviour, not the specific
underlying tool the native sidecar wraps.

* docs(development): scrub driver-implementation name from dev docs

architecture, design-principles, decisions now describe the native
sidecar by role (gRPC surface over OS UI-test pipeline) rather than by
the specific tool it wraps.
2026-05-25 16:17:21 +05:30

2.1 KiB

title
title
sanderling inspect

sanderling inspect

Local web UI for exploring runs produced by sanderling test. Reads runs/<id>/meta.json and runs/<id>/trace.jsonl from disk.

sanderling inspect [run-or-runs-dir] [--port N] [--no-open] [--dev]

The positional argument can be a runs directory or a single run directory (auto-detected by meta.json). Defaults to ./runs.

sanderling inspect

Panels

Panel What it shows
Screenshot Device screenshot for the focused step, with the dispatched action's target spotlit.
ActionList Ordered list of steps with the verb and target for each action.
Timeline Per-property lane chart over the run; cells coloured by violated, pending, or holds.
ViolationsPanel Property statuses at the focused step with residual formulas for any that failed.
HierarchyPanel Filterable table of every UI element captured at the focused step; mirrors the selectors documented in Spec language reference.
SnapshotTable Flattened snapshots map for the focused step, with diffs against the previous step.
MetricsChart Heap and other host-side metrics sampled per step.
ExceptionsPanel Uncaught exceptions captured during the run, with a jump-to-first control.

Keyboard shortcuts

Key Action
j, Right Next step
k, Left Previous step
Shift+j, Shift+Right Jump 10 forward
Shift+k, Shift+Left Jump 10 back
g / G First / last step
. Next step with a violation

Arrow keys inside a tablist or listbox yield to those widgets. Use j/k when focus is on one.

/runs/:id/steps/:n links to a specific step. Use it in issues or PRs when pointing at a violation.

The run index auto-refreshes over SSE as new runs land, so sanderling inspect and sanderling test can run side by side.

Development

Two-process loop while iterating on the UI:

make web-dev      # bun + vite on http://127.0.0.1:5173
make inspect-dev  # sanderling inspect --dev, proxies non-API to 5173

Single binary with the bundle embedded:

make sanderling