Local run control plane for people and coding agents: launch, hot-reload, inspect, and capture evidence across Flutter and web apps.
Baton has 27 well-named tools with consistent verb_noun patterns (run_workflow, list_sessions, screenshot_session). Descriptions are present and substantive (avg ~150 chars), explaining WHAT each tool does and WHEN to use it. However, input schemas lack critical details: most parameters have type and description, but many lack enums for constrained values (e.g., 'until' in wait_for_session accepts 'running|stopped|url|log:<regex>' but is not declared as enum). Output schemas are not documented, LLMs cannot predict return structure. Error handling is minimal; tools do not guide recovery (e.g., 'session not found' should suggest list_sessions). Parameter relationships are undocumented (e.g., branch/checkout mutual exclusivity in run_target is stated but not formalized). No tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications. Overall: solid naming and descriptions, but schema completeness and error guidance lag.
Track another project.
Start a simulator or emulator.
Forget what has been captured for a session.
Search bounded log and network evidence across projects. Defaults to errors only and 20 findings. Pass a trace ID and errorsOnly=false to follow a request across Node services. Use exact session IDs to limit scope.
Remove stopped sessions from the list. Running sessions must be stopped first. Use all=true to clear every stopped session.
One captured request in full: headers, timeline events, and optionally the bodies.
Cheap structured overview: status, uptime, last reload, recent errors, network counts.
Output schemas not documented. LLMs cannot predict return structure for any tool, forcing them to guess at downstream field names and types. This breaks tool chaining and increases hallucination risk.
Constrained parameters not declared as enums. 'until' in wait_for_session accepts 'running|stopped|url|log:<regex>' but is a free-form string. 'appearance', 'textScale', 'locale' in run_proof are comma-separated strings with no enum constraint. LLMs will hallucinate invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Hot reload a session, keeping app state. Flutter only. Returns code 0 on success; a non-zero code carries the compile error.
Hot restart a session, dropping app state. For web dev servers and plain processes this reboots the process.
Write a launch.json from what is detected in the project.
Read fresh launch sources, configuration problems, nested projects and guidance file paths. Does not run commands or expose environment values. Use before choosing an environment, checkout and device; review screenshot evidence rather than treating capture as visual approval.
List git checkouts this project can run from: This checkout, linked worktrees, local branches, remotes.
List connected devices and bootable simulators/emulators.
List HTTP requests the app has made, newest last. One line each: id, method, status (… while in flight), duration in ms, response bytes, URI. Flutter debug/profile sessions only, while the app is running. Captures dart:io HttpClient traffic (package:http and dio with its default adapter) — NOT cupertino_http/cronet_http native clients, WebSockets or raw sockets. Traffic those make is invisible here, not absent.
List projects the Baton app knows about.
List past proof bundles.
List past and current runs persisted on disk -- survives daemon restarts. Each line is runId, name, status (live / exit N / ?), how long ago it started, and its log size. Pass a runId to read_logs to see its output.
List running sessions with their status, capabilities, URLs and device.
List everything runnable in a project: launch.json configs, package.json dev scripts, Flutter entrypoints.
Print summary.md for one proof bundle.
Read recent output from a session, newest last. Use filter to grep for an error. Works for a currently running session id, and for a past run (its own session id, or the runId from list_run_history) even after it has stopped or the daemon has restarted.
Verify a target across devices and appearances; outputs a zip with screenshots, network stats and logs.
Start a target by name. Returns the new session id to use with the other tools. Optional branch or checkout runs from a git worktree without moving the current folder.
Launch up to eight project targets in dependency order and wait for each to become ready, in one call. Stops launching dependents on failure. Returns compact session IDs, URLs and errors; retains sessions for debugging. Use browser/device tools next to validate the actual flow. Paths must be absolute.
Capture the screen of a running session. iOS simulator and Android emulator only.
Stop one session, or every running session with all=true.
Block until a session reaches a state: running, stopped, url available, or a log line matches a regex.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk classification in metadata but not exposed to LLM via schema annotations. Agents cannot infer which tools are safe to retry or have side effects.
Error handling lacks recovery guidance. No tool description explains what to do if a session is not found, a target does not exist, or a device is offline. Errors should suggest next steps (e.g., 'Session not found. Call list_sessions() to see available sessions.').
Parameter relationships undocumented. run_target has mutually exclusive 'branch' and 'checkout' params; hot_reload and hot_restart have mutually exclusive 'session' and 'all' params. These constraints are not formalized in schema or descriptions, forcing LLMs to guess.