First debugging session¶
Phone is paired with the robot. Time to actually use Scry. Five things to try, in order — each one demos a different capability.
1. "What's my robot's health?"¶
In the chat composer at the bottom of the Scry tab, type:
Tap Send. The agent will:
- Call the
robot_healthMCP tool on the connect - Get back a structured snapshot: nodes alive, topics publishing, battery if available, ROS_DOMAIN_ID, transient errors
- Render an inline health card (the green/yellow boxes)
- Add a short text conclusion above the card
Total time: 1–3 seconds. The data is live — every call hits your robot, no caching.
2. "What topics are publishing?"¶
The agent calls ros_topic_list and renders a table with each topic's
name, type, and publish rate (where measurable). Tap a topic to drill
into details.
3. Inspect a single topic¶
If /odom exists on your robot, the agent calls ros_topic_echo for
one message and renders the JSON inline. For high-frequency topics
(IMU, camera, lidar) it instead calls ros_topic_hz and gives you the
publish rate + std-dev.
4. Voice input¶
Tap the microphone icon in the composer (between the + and the
send button). Say:
What was the last warning in
/rosout?
Release. The transcript appears in the composer; tap send. Voice uses
the Android system SpeechRecognizer — Google's on-device model on
most phones, no audio leaves the device.
5. Image attachment¶
Take a screenshot of an RViz scene, a terminal showing an error, or a photo of the robot itself. In Scry:
- Tap the + icon in the composer
- Choose Gallery (or Take photo to capture fresh)
- Pick the image — it appears as a chip above the input
- Type a question, e.g.
what's wrong in this RViz scene? - Send
The agent uses your provider's vision model (Claude Sonnet, GPT-4o, Gemini Pro, etc.) to actually look at the image. Useful for "the robot is doing weird stuff and I don't even know how to describe it."
What just happened under the hood¶
Every message you send goes through the same loop:
You type → ChatViewModel
→ AiProxyLoop builds: system prompt + tier-0 tools (~10 core MCP tools)
→ AI provider streams response
→ If AI calls a tool:
- Read tool? → run immediately, send result back
- Write tool? → show approval dialog → wait for your tap → run
→ AI continues until it sends final text
→ save to local Room DB
The AI doesn't have a persistent connection to your robot. Each tool
call is a fresh HTTP request to scry-connect, scoped to that turn.
Nothing crosses the cloud except the AI inference itself (and that's
zero-retention with most providers).
When something breaks¶
Three places to look, in order:
- Look at the message in chat. If the AI says "I tried
ros_topic_listand got an error: …" — that's the connect's response. Usually means the robot's state changed (node crashed, topic stopped). - Check the connect logs on the robot:
journalctl --user -u scry-connect -f. Per-call audit logs are in/var/log/scry/audit.log. - File feedback via Settings → Feedback in the app, or on the specific reply. Both go to the operator's dashboard.
What's next¶
Now that you've kicked the tires:
- Use Scry — the full feature tour (monitors, fleet view, multi-robot, etc.)
- Architecture — how the pieces fit together if you want to extend or contribute
- MCP tools reference — every tool the agent can call, with what it returns