jev-mobile
Android control loops with Jev and Mobile MCP.
# jev-mobile
[](https://www.python.org/)
[](LICENSE)
[](#project-status)
An autonomous, durable Android sub-agent with [TypeSafe Jev](https://typesafe.ai/) as its System-One decision provider.
`jev-mobile` accepts a high-level task, persists it in SQLite, and lets one durable worker execute **observe → normalize → decide → mutate → verify** against a USB-connected Android device. Jev receives concise semantics and technically valid actions; it never generates coordinates, MCP calls, or arbitrary code.
> **Safety boundary.** Durable Core V1 has been hardware-validated for normal notes/checklists, text input, crash recovery, persistence verification and foreign-editor protection. It deliberately stops rather than clearing unrelated application state. Payments, account changes and other sensitive operations remain out of scope without explicit policy/approval work.
## Why this exists
Traditional mobile-agent stacks repeatedly involve a large model in every UI step:
```text
LLM → mobile tool → LLM → mobile tool → LLM
```
The high-frequency loop remains local and structured:
```text
High-level goal
│
▼
┌────────────────────────────────────────────────────┐
│ jev-mobile │
│ durable worker: observe → normalize → requirements │
│ → valid actions → Jev → journal → verify │
└────────────────────────────────────────────────────┘
│
├── Portal ADB / USB Android runtime
└── Escalation for uncertainty or risk
```
For example, Jev sees only this decision problem:
```text
Task: Create a note titled Shopping
Valid actions:
A1 Create entity
A2 Set title in title field
A3 Verify persisted result
Jev → A1
```
The worker maps `A1` to the backend through the DeviceAdapter. Invalid actio