Time spent executing this step's browser actions + tool calls.
Results of executing each browser action
Browser actions the controller requested
OptionalBatchSet when a multi-action batch stopped before running every requested action — e.g. "executed 3/5 actions, stopped: url-changed". Surfaced to the next step's summary so the controller knows exactly what did NOT run.
OptionalCheckpointThe tour checkpoint the controller reported reaching this step, if any — telemetry, and the trigger for a scoped judge call this step.
OptionalControllerCorrelation id for the controller LLM invocation (e.g. an MJ AIPromptRun ID).
The controller's reasoning for this step
Browser diagnostics captured during this step (console errors, failed requests, crashes).
Total duration of this step in milliseconds
OptionalErrorError that occurred during this step (if applicable)
OptionalEvaluationController self-tracked state emitted this step: outcome eval, durable memory, plan checklist.
Interactive elements the extractor found this step when element grounding is on — role/name/selector/bbox for each. Empty when grounding is off. The raw material that makes ClickElement/TypeIntoElement traces replayable and self-healable.
Time spent in the judge (heuristic + LLM) this step.
OptionalJudgeCorrelation id for the judge LLM invocation, when the judge ran this step.
OptionalJudgeJudge verdict (if the judge was consulted this step)
Time spent in the controller LLM call.
OptionalMemoryOptionalPlanWhether the controller explicitly requested judgement this step. Such a step is a deliberate "am I done?" checkpoint, not a stuck/misconfigured empty step — the main loop must not count it toward the empty-step abort.
Screenshot captured at the start of this step (base64 PNG)
Perceptual (dHash) fingerprint of this step's screenshot. 16-char hex, or '' when the frame could not be hashed. Shared signal for loop/stagnation detection, screenshot dedupe, judge-call gating, and failure classification. App-agnostic — derived from pixels only.
Time spent capturing (and hashing) the screenshot.
Time spent waiting for the page to settle before perceiving (engine-side; not agent reasoning).
Why the settle loop stopped waiting this step — e.g. 'beacon-ready', 'stable', 'budget'.
Wall-clock epoch (ms) when this step began.
Step number (1-indexed)
Tool calls executed during this step
URL of the page at the START of this step (before this step's actions ran).
Retained as Url for back-compat; prefer UrlBefore/UrlAfter.
URL after this step's actions executed. Use this for loop detection and judge context.
URL at the start of the step (== Url).
Complete record of a single step in the engine's main loop. Captures everything that happened: screenshot, controller decision, actions executed, tool calls, judge verdict, and timing.
This is the primary data structure that flows through: