roveflow init installs a /roveflow slash command into your Claude Code project. Invoke it in any Claude Code session whose working directory is the Flutter project root.
Prerequisites
- The app is running in debug mode on a simulator.
.mcp.jsonpoints at a workingflutter_inspector_mcpbinary.docs/roveflow/scenarios.mdhas a validcold-setupand at least the scenarios you want to run.
Run configuration
Before the orchestrator relaunches the app, it resolves three values:| Value | How it’s resolved |
|---|---|
flutter_command | fvm flutter if .fvmrc / .fvm/ / fvm_config.json is present; otherwise flutter. |
flavor | The single subdirectory of ios/config/ if exactly one exists; otherwise omitted. |
vm_service_port | Parsed from --dart-vm-port=N in .mcp.json; defaults to 8181. |
docs/roveflow/config.yaml (all fields optional):
.mcp.json --dart-vm-port in sync).
Flags
Two independent axes plus an override.--mode=smoke|rove|all
Default
smoke. Picks which kind of scenario to run. rove walks the app and emits a screen graph; all runs both.--criticality=critical|all
Default
critical. Only applies to smoke scenarios. Set to all for nightly runs that include criticality: extended scenarios.--only=<ids>
Comma-separated scenario ids. Bypasses
--mode and --criticality. Cold-setup auto-prepends when needed.--no-record
Skip the full-run
.mov capture. Useful for CI or headless sims.Invocation matrix
| Command | Runs |
|---|---|
/roveflow | cold-setup + smoke critical |
/roveflow --criticality=all | cold-setup + all smoke |
/roveflow --mode=rove | cold-setup + all rove |
/roveflow --mode=all | cold-setup + all smoke + all rove |
/roveflow --only=rove-main | cold-setup + rove-main |
Recording the simulator
Every run also captures a full-length.mov of the simulator via xcrun simctl io booted recordVideo. It lands at docs/roveflow/runs/<run-id>/recording.mov alongside report.md.
Pass --no-record to skip it:
Invocation
In Claude Code:docs/roveflow/maps/<app>/.
What happens under the hood
- The orchestrator parses scenarios and filters by mode (and
--onlyif present). - It resets the simulator (shut down, erase, boot, relaunch the app in debug mode). That’s the only step that touches your system directly.
- It dispatches a
roveflow-runnersub-agent (Sonnet) forcold-setup. - If cold-setup passes, it dispatches one agent per remaining scenario, in declared order, collecting a structured result for each.
- Between scenarios it runs
reset_to_home; if that fails it has one fallback attempt before aborting withskipped: setup_lost. - It compacts working memory after every 5 scenarios or when the context estimate crosses 60%.
- It compiles the results into a markdown report.
The report
Manual mode
A markdown table to chat:Scheduled mode
Same table written todocs/roveflow/runs/YYYY-MM-DD-HHMM/report.md with no chat interaction.
Reading results
pass— the scenario’spasscondition was observable on screen.fail— the scenario’sfailcondition fired, or the flow was unreachable (crash, blank screen, unrecoverable error toast).skipped: no_data— environmental gap (e.g., no available slots today).skipped: setup_failed— cold-setup didn’t reach home; every later scenario inherits this.skipped: setup_lost— mid-run reset failed; remaining scenarios inherit it.
tap_at as a fallback surfaces "fragile": true in its notes. If you see fragility on a hot scenario, consider adding a ValueKey (Using ValueKeys).
Aborts
The orchestrator aborts when:- The app fails to boot or the VM service never responds.
cold-setupfails.- Mid-run reset-to-home fails and the one fallback attempt also fails.
skipped: setup_failed or skipped: setup_lost in the report.
Next
Authoring scenarios
Add more flows to the inventory.
Recording demos
Save polished playbacks of your runs.