ScenarioRunStep class

One captured step: what it is a picture of, its sibling legs on disk, and what the app did on the way to it.

Constructors

ScenarioRunStep({required int index, required String position, required bool auto, ScenarioStepKind kind = ScenarioStepKind.screen, String? image, String? format, int? width, int? height, String? tree, String? file, String? mimeType, int? bytes, ScenarioNotification? notification, int? ms, String? keys, List<String> texts = const [], String address = '', String root = '', String? semantics, int? parent, String? branch, String? name, List<String> tags = const [], String? statusBrightness, String? navBrightness, String? verb, String? target, ScenarioAim? aim, String? events, int? eventCount, Map<String, int>? eventChannels, List<String>? eventTitles, int? eventsDropped, String? frames, int? frameCount, int? frameWidth, int? frameHeight, int? frameIntervalMs, int? framesDropped, bool settled = true, bool waited = true, bool landed = true, int? guessed, List<String> stillTicking = const [], String? digest, int strayFrames = 0, double? keyboard, bool unchanged = false, String? failure})
ScenarioRunStep.fromJson(Map<String, Object?> json)
factory

Properties

action → String?
The verb and its target as one label — tap "Pay" — or null where nothing acted. What an unnamed step is labelled with, in place of its index.
no setter
address → String
The step's fw:// address. Empty on the harness's own record; the host that knows the worktree fills it in via locate.
final
aim → ScenarioAim?
Where the verb's finger went — the box it resolved, in the view's own logical pixels, measured on the frame it was about to act on. Null for a verb with nothing to point at (wait, screen, back), for one whose target had no box, and for every run written before this was recorded.
final
auto → bool
True when nothing named this capture — a collapsible detail step.
final
branch → String?
The split branch label when this step is a branch's first capture.
final
bytes → int?
How big file is, so a reader knows before opening it.
final
digest → String?
What this step captured, hashed — the pixels for a screen, the payload for a document. Null where the step wrote no bytes.
final
eventChannels → Map<String, int>?
final
eventCount → int?
How many, and on which channels — {platform: 3, print: 1}. The badge on the flow's arrow, and the part of the digest that survives filtering.
final
events → String?
What the app did on the way here — logs, prints, platform channel messages, and whatever the project's fakes reported through recordAppEvent. Relative like image; null when this transition was quiet, which is distinct from a run too old to have captured any.
final
eventsDropped → int?
Events dropped to stay inside the per-step or per-run cap. Reported rather than swallowed: a truncated transition that said nothing would read as an app that did nothing.
final
eventTitles → List<String>?
The one-line summaries, capped, system excluded — what a reader gets without opening events. POST /login → 401 is the part an agent reasons about; the payloads are what it fetches when it cares.
final
failure → String?
The error, when this is the step a scenario broke on. The frame is the state at the failure, and the message carries the split branch that reached it.
final
file → String?
The payload of a ScenarioStepKind.document, relative to the worktree root like image — a path rather than the bytes, for the reason the tree and the events beside it are: a run's report stays readable, and what a reader wants to do with a document is open it.
final
format → String?
png, or raw — bare rgba8888 rows, width×height×4 bytes. Raw is the fast capture (~5× at 1×, ~25× at device resolution) for hosts that can display pixels directly; png is the portable default the run action serves. Null wherever image is.
final
frameCount → int?
final
frameHeight → int?
final
frameIntervalMs → int?
Fake milliseconds between two frames — the speed a player runs at to show the animation as the app would have played it.
final
framePaths → List<String>
The recorded frames in order, spelled the way image is — so whoever reads them resolves them the same way, off a worktree's disk in the panel or over HTTP on an exported page.
no setter
frames → String?
The directory of numbered frames recorded on the way to this step — what the transition looked like, where the events say what it did. Relative like image; null on every run that did not record, which is every CLI run and every run older than the capture.
final
framesDropped → int?
Frames refused by the recorder's cap: the transition went on longer than the recording does, and the last frame is not where the app stopped.
final
frameWidth → int?
final
guessed → int?
The turn of the real event loop on which work nothing announced landed and was drawn into this step — the deepest, when several did — or null when nothing had to be guessed at.
final
hasEvents → bool
Whether anything happened on the way to this step.
no setter
hashCode → int
The hash code for this object.
no setterinherited
hasMotion → bool
Whether there is motion here to play. Two frames is the floor — one is the still the transition started from.
no setter
height → int?
final
image → String?
The captured image, in format, relative to the worktree root — the same convention the catalog's artifacts follow, so the value survives being read on another machine and an agent whose tools are scoped to the repo can open it.
final
index → int
1-based position in the scenario's capture sequence.
final
keyboard → double?
How tall the software keyboard was when this frame was taken, in logical pixels, or null when it was down — which is nearly every step.
final
keys → String?
The translation keys on this screen, and the words that belonged to no catalog — relative like image. Null when no catalog was wired up, which is every project that has not asked for this.
final
kind → ScenarioStepKind
What this step is a picture of. See ScenarioStepKind.
final
landed → bool
False when the shutter fell with an image decode or an asset read still in flight — the picture is of a screen that was still filling in, and the artwork it is missing turns up on the next step; true is the absence of a report rather than a claim that everything the screen wanted has arrived, and a step that is not a screen has nothing to land and reads true vacuously.
final
mimeType → String?
What the document is, when the scenario said — application/pdf. A viewer switches on this; absent means "offer it as a download".
final
ms → int?
A setup beat's wall-clock duration in milliseconds; null elsewhere.
final
name → String?
The Shot's name; null for an automatic capture.
final
final
notableEventCount → int
The events a reader will actually be shown — everything but system.
no setter
notification → ScenarioNotification?
The push a ScenarioStepKind.notification step is.
final
parent → int?
The index of the step this one follows; null for the scenario's first. split gives one parent several children — these are the flow graph's edges.
final
position → String
Where the step sits in the scenario's shape — the split choices taken to reach it by index, then the count since the last one: '#2' on the trunk, '0.1#3' two splits deep. Unlike index it shifts only within its own branch when a step is inserted.
final
root → String
The worktree the paths above are relative to, on this machine.
final
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
semantics → String?
The semantics-tree JSON — what a screen reader gets — relative like image. Null on artifacts from before the capture existed, and when the run had no semantics tree to read; a reader states the absence rather than inventing an empty screen.
final
settled → bool
False when frames were still scheduled at the shutter: something on this screen was still moving, and the capture is of a moving picture. Not a failure.
final
statusBrightness → String?
The SystemUiOverlayStyle icon brightness the app had declared at capture time (light/dark), if any — what the fake status bar and home indicator tint themselves with.
final
stillTicking → List<String>
What kept asking for frames when a settle that waited gave up on the way to this picture, one line each: CircularProgressIndicator (lib/src/orders/status_cell.dart:42) for a framework widget, by the line of the app that built it; _PulseState.initState (package:app/src/pulse.dart:18) for an animation the app started, by its own frame.
final
strayFrames → int
Frames drawn before this step that none of the scenario's verbs drew — the scenario reached for the raw tester, and whatever the app did in those frames is not in the flow. Zero is the healthy case.
final
tags → List<String>
final
target → String?
final
texts → List<String>
The visible texts — the projection an agent reads next to the pixels.
final
tree → String?
The widget-tree JSON captured at the same moment, relative like image. Null wherever image is — there was no tree to read.
final
unchanged → bool
True when this step's picture is byte-identical to its parent's: the verb acted and nothing on screen changed. A fact, not a verdict — a capture parked mid-flight with Settle.none is legitimately unchanged — but a run of these in a walking scenario is a stalled flow passing quietly, which is what the flag exists to make visible. Never set on the step a scenario failed at, nor on one that is not a screen — a document has no picture to be identical to anything.
final
verb → String?
The verb that produced this step and what it was aimed at — tap, "Pay". Together they name the transition into this step, which is what the events below happened during. Null on artifacts from before the capture existed, and on a step captured at a failure.
final
waited → bool
Whether this step's settle policy was one that waits for the app to go quiet — Settle.upTo and Settle.full, and not Settle.none, Settle.frames or Settle.elapse, which stop on a count or on the clock.
final
width → int?
final

Methods

locate({required String root, required String address, required String path(String)}) → ScenarioRunStep
This step, published: its artifact paths rewritten through path, its address assigned, its root recorded.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toJson() → Map<String, Object?>
toString() → String
A string representation of this object.
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited