Skip to content

Click approvals

The Click approvals page is the bot’s pause-step-debug button. When enabled, every sensitive action — taps, swipes, screen overrides — stops at this page and waits for an Approve / Skip / Reject decision before firing.

It’s the fastest way to author a new scenario: you write the DSL, flip approvals on, and watch each step pause with the screenshot the bot is acting against — including a highlight box around the region it intends to click.

Click approvals page with screenshot overlay
  • The exact screenshot the bot just captured, with the target region highlighted as a red bounding box. No more “I think it’s clicking the right thing” — the page shows literally where the tap will land.
  • Scenario chain — the path of nested steps that led here (e.g. while_match.button.page.back > while_match.button.tap_to_continue > …). Useful when the failure is “wrong sub-scenario fired,” not “right scenario, wrong tap.”
  • Step counter (Step 2/2) and metadata: priority, instance, current node, active player.
  • Target region + payload (the actual click / swipe arguments) + trace ID to correlate with logs.
  • Approve / Skip / Reject — the three outcomes.

The Screenshot dropdown picks how the canvas is fed:

SourceBackendNotes
Captured (request)bot-side screencapThe exact frame the bot acted on at approval time. Static — best for verifying “what did it see when it decided to tap.”
Live rollingrolling PNG on diskWorker overwrites a PNG every tick (~1–2 Hz); the UI cache-busts on mtime. Works with any backend.
Live video (WebCodecs)scrcpy over WebSocket~30 fps with ~50 ms latency — H.264 stream decoded in the browser via WebCodecs. Auto-enabled when the device’s input/screenshot backend is set to scrcpy and the browser supports WebCodecs (Chrome / Edge / Safari).

The live-video path is the most ergonomic for authoring: you see touches land in near real time, so a mis-clicked region or a slow popup is obvious in motion rather than from frame-by-frame refreshes.

ModeBehaviorBest for
OffAll taps fire automatically.Production runs.
Hold rollingPauses on every sensitive tap, you decide per step.Authoring a new scenario, debugging a misfire.
Auto-refreshEach new pending tap auto-loads the screenshot without you clicking refresh.Active debugging session.
Reset…Drops the current approval queue (skip everything pending).Got stuck in a chain, want to start over.
  • DSL runner — open the running scenario in the DSL runner with the same state, so you can step through the YAML side-by-side with the live execution.
  • Copy payload — get the raw click/swipe payload for posting in a bug report.
  • Labeling — jump to the region’s labeling page if the bounding box looks wrong (often the fix is in the region definition, not the scenario).
  1. Turn approvals on before your first run — saves the “I missed which step misfired” investigation by making each step explicit.
  2. Use Skip liberallySkip lets the scenario continue without firing the tap, so you can see what the next step would have evaluated against. Useful when the current screen is wrong but you want to verify the next match works.
  3. Reject = scenario abortReject fails the whole scenario, marking it as a UI-rejected task in the queue.
  4. Cross-check the highlight against the screenshot — if the red box isn’t where you expect, the issue is in area.json (re-label the region), not in your DSL.