Maestro CLI 2.7.0 is out. Leading the release: your AI agent can now debug a failing Cloud run on its own. Ask it why a run failed, and it pulls that run’s recording, logs, and failure-point view hierarchy itself, explains the root cause, and proposes a fix, all in one conversation. Plus a redesigned per-flow debug bundle and a broad wave of iOS, Android, and Web reliability fixes.

## Maestro MCP

**Ask your agent to explain a failed Cloud run** (new `describe_cloud_run` MCP tool). Give your AI agent (Claude, Cursor, etc.) a `run_id` and it fetches that run’s screen recording, `maestro.log`, and device logs (simulator, xctest, emulator) as short-lived signed URLs, plus, when your agent asks for it, a full artifacts archive that also holds a screenshot of every step and the failure-point view hierarchy. The agent reads them, explains the root cause, and proposes a fix. No dashboard trip. Requires Maestro CLI 2.7.0, works on finished runs, and returns files for runs recent enough to have Cloud-stored artifacts.

[Ask your agent to explain a failed Cloud run](https://www.youtube.com/watch?v=EMOhCgs7H8g)

**`maestro chat` is discontinued.** Use [Maestro MCP](https://docs.maestro.dev/get-started/maestro-mcp) instead, which plugs into your AI agent and covers everything the old chat command did. `maestro chat` now prints a local sunset message; `maestro chat --ask "…"` exits 1 so scripted CI usage surfaces the change.

* * *

## Per-flow debug artifacts

**One folder per flow with everything you need to debug a failure.** Each run produces a flat bundle with a typed, versioned `manifest.json`, `commands.json`, a screenshot of the failing step, the view hierarchy on failed and warned steps, device logs, and any crash or ANR report. Point one script or one agent at `manifest.json` and read a stable, documented structure.

**View hierarchy is now a separate artifact** rather than inlined into `commands.json`. One demo `commands.json` went from ~246 KB to ~4 KB, so the file stays readable.

**Human-readable step filenames.** Screenshots and hierarchy files are named like `step-003-tapOnElement-submit.png`, 1-based and slugged, so you can scan a folder and know which step is which.

**Device logs and crash/ANR reports are captured out of the box**, both locally and in Cloud. On iOS, Maestro now waits for the async `.ips` crash report to be written before collecting it, so `crash-report.txt` is actually there when the app crashed.

**`maestro.log` is no longer written empty on some setups.** On hosts with certain logging configurations the run log used to come out empty; it now captures as expected.

**`--test-output-dir` now contains the full bundle**, including `manifest.json`, not just screenshots.

* * *

## Android

**Type any Unicode text with `inputText`** (Arabic, Chinese, Japanese, Korean, emoji, mixed scripts), with no external APK. Maestro’s own IME is bundled inside `maestro-android`.

**A stalled WebView socket no longer hangs the flow.** On Android, a view-hierarchy read over a stalled Chrome DevTools socket is now bounded by a 10s timeout and falls back to a native-only hierarchy, instead of blocking the flow for minutes.

**Native (SIGSEGV) crashes are detected and reported.** React Native / Hermes crashes are now parsed from tombstones and attributed to the right package, and land in the run’s crash report instead of surfacing as a generic element-not-found.

**Cloud screen recordings on Android below API 34 run for the full flow duration.** They used to stop at exactly 180s; Maestro now records through the extended screenrecord binary on Cloud devices that carry it.

**A dropped connection is reported as a device error, not a test failure.** If the ADB connection dies mid-flow, Maestro now surfaces it as a device-connection error across `launchApp`, `clearState`, and `setPermissions`, so a dropped connection isn’t blamed on your test.

* * *

## iOS

**Taps right after `scrollUntilVisible` land on the settled element.**`tapOnElement` re-resolves the target until its position is stable when the driver can’t confirm scroll settling, so post-scroll taps don’t hit stale coordinates. The re-stabilisation only runs on taps that follow a scroll, so ordinary taps stay fast.

**Failed iOS UI checks tell you what actually went wrong.** When a query like `swipeV2` times out, Maestro now surfaces the real underlying message instead of a generic “Unknown error”, so you can see the cause and fix it.

**Long iOS flows stay reliable on busy screens.** Hierarchy handling on large screens keeps long runs from stalling.

**A transient iOS UI error mid-flow no longer aborts the run.** When an element goes stale during a screen read, Maestro recovers and keeps going instead of failing the flow.

**False crash detection on app launch is fixed.** An app sitting on its splash screen with no foreground hierarchy yet is no longer declared crashed.

**iPad and iOS 26 home screens are inspectable in Studio.**

**Region-specific locales load the right strings.** Run with a locale like `en_GB` and your app now shows British English instead of falling back to US English, so an assertion on “favourite” passes instead of unexpectedly seeing “favorite”.

**`setOrientation` no longer crashes on unsupported orientations.** Requesting `PORTRAIT_UPSIDE_DOWN` on a device that doesn’t allow it now fails gracefully instead of crashing the flow.

**`launchApp` honors its timeout when the app crashes on launch.** A missing-framework crash used to hang indefinitely; it now fails within the timeout.

**Simulator recording duration matches across players.** The `.mov` metadata is corrected in-place (no re-encode), so Chrome, QuickTime, and other players agree on the duration.

* * *

## Web / Flutter web

**`id:` selectors work in Flutter web.**`tapOn: { id: "login_button" }` now resolves against Flutter’s `flt-semantics-identifier` attribute set by `Semantics(identifier: ...)`, so you get a stable, code-defined selector for canvas-rendered UI.

**CSS selectors match elements with wrapper children.** A button wrapping two `<span>`s now matches, and selectors containing quotes no longer break.

**Remote browsers without screen recording no longer break the first command.** On drivers like Browserbase, a session that can’t set up recording used to fail on its first real step. Maestro now fails fast and clearly at recording setup, and empty (0-byte) recording files are dropped from the manifest instead of showing up as broken artifacts.

**More resilient web driving.** Transient JavaScript errors now retry automatically, and unusual element-position data during page navigation no longer trips up a flow.

* * *

## CLI & tooling

**AI HTML reports handle `/` in flow names.** A flow whose name contains a slash no longer crashes the run; the filename is sanitized.

**`--verbose` works consistently across commands** and no longer prints stray debug tokens.

**Concurrent Maestro runs don’t clobber each other’s debug logs.** Log archival at run start is race-safe, so one run’s cleanup can’t delete another run’s live working directory.

**Console output on Windows, and strings containing special markup characters such as `#`, print correctly.**

* * *

## For contributors

**Driver binaries are auto-updated on `main`** instead of gated on PRs, so you no longer need to commit rebuilt drivers with your change. E2E on macOS runs in ~3m on warm caches.

* * *

## Update to 2.7.0

Update the Maestro CLI to get everything above:

```bash
curl -fsSL "https://get.maestro.mobile.dev" | bash
```
