Manuvra
A Rust command-line tool that runs browser journeys for coding agents and keeps evidence of what it observed and did.
I built Manuvra for myself and my coding agents to run journeys through a real application. A job describes a start URL and ordered steps. Each step has a goal and a condition that says when it is done. Manuvra opens its own Chromium and returns a result with evidence the calling agent can inspect.
The caller owns the application fixture. It starts the app with synthetic data, says what effects are allowed, and checks the database afterward. Manuvra owns the browser and its evidence. A browser result alone cannot prove that the application saved a change.
TypeSafe Jev supplies typed judgments about what to do. Rust code decides whether the proposed operation may happen. It checks the current page and allowed origins before acting. Structured conditions, such as a field value or visible text, are checked in code. A model's confidence cannot turn a false structured check into a pass.
The tool can stop when it is uncertain and return the current evidence to the caller. Continuing requires a specific answer. The caller can authorize an offered operation or ask for another observation. Even after that authorization, Manuvra checks the page again. The control may have moved, or the step may already be complete.
A crash does not authorize another submit
One difficult case is losing the browser response after sending an operation. The application may have received it. Replaying the step could submit a form twice, even if the last saved checkpoint still looks unfinished.
I decided that a crashed run cannot resume by replay. Recovery retrieves the saved result and evidence. Starting again is a new run, and the caller must first work out what happened to the application's state. Manuvra preserves uncertainty when it cannot prove whether an operation was sent.
That requirement also shaped the browser integration. I maintain a narrow Chrome DevTools Protocol transport in Rust. A general browser driver would still need extra handling to distinguish an operation known not to have been sent from one whose result is unknown. Owning that part lets the run's lifetime and operation records follow the same rules, at the cost of maintaining the protocol integration.
What a passed run means
Manuvra runs on Linux and macOS. It supports keyboard input and controls that appear on hover, along with scrolling inside nested containers. Text and foreground-color checks can use structured assertions without asking a model to judge them.
Each run writes a manifest with artifact paths and hashes. The evidence includes observations and an action trace, with screenshots when masking can be verified. If it cannot verify screenshot masking, it withholds the image and blocks the run.
A passed run means the browser steps and final expectations passed with complete evidence. The caller still needs to inspect persistence and check for duplicate effects.