Computer-use automation for regulated back-offices

Automating enterprise software
that has no API

An LLM works out how to accomplish a goal in an enterprise legacy application — once. That discovery is compiled into a typed, versioned capability artifact. From then on, it replays deterministically with no model in the loop.

Banks run a long tail of back-office applications with no API. When an AI agent needs to get real work done, the only way in is to drive the UI the way a human operator would. Doing that with an LLM on every invocation is slow, expensive, non-deterministic, and unauditable — and the last three are disqualifying in a regulated environment.

Design commitments

Each is enforced by an invariant test that fails the build if it stops holding.

Evidence

Figures from committed runs in the repository, not estimates. Every one is reproducible from the commands below.

6
Live model calls
One real LLM-driven discovery through an OpenAI-compatible gateway — 10,215 tokens. Each call records the gateway's own provider and request id, so the run can be checked against gateway logs rather than taken on trust. make verify-live re-checks any discovery run mechanically.
0.00
Drift on replay
The artifact compiled from that run replays for three members it never saw, including a closed account — no model, identical resolution strategies.
2,158
Tests passing
Including 1,800 edge-case tests and invariant tests that fail the build if the policy chokepoint, redaction, layering or fail-closed guarantees stop holding — and a mutation check proving each one goes red when broken on purpose.
14
Demo stages
Discovery, compile, replay, business outcome, bounded recovery, escalation, operator handoff and resume — each writing its own evidence directory.

Run it yourself

One command walks the whole scenario end to end, on your machine.

# venv, dependencies, headless Chromium
$ make setup
# all 14 stages — falls back to a recorded transcript when no model is configured, and says so
$ make demo
# optional: a genuine LLM-driven discovery (set OMNIROUTE_API_KEY, CUA_LLM_BASE_URL and CUA_LLM_MODEL in .env)
$ make discover
# check that run was a live model and not a script: model, tokens, request ids, latency
$ make verify-live
# Stage Observable Behavior Result
1 Mock back-office running Hostile frameset application, zero test IDs READY
2 LLM Discovery Agent drives live UI to goal, exploring paths TRACE
3 Capability compiled Typed I/O, semantic targets, content hash SEALED
4 Deterministic replay New member inputs, 0 model calls in the loop SUCCESS
5 Business outcome member_not_found — valid answer, not a crash EXIT 0
6 Injected 502 error Declared recovery rule remediates and retries SUCCESS
7 Fault past budget Recovery exhausted → escalates to human queue NEEDS_HUMAN
8 Malformed input Rejected by schema guard before dispatch FAILED
9 Undeclared screen Fails closed immediately and requests audit NEEDS_HUMAN
10 Human takeover Operator drives same session with Lease lock EPOCH 3
11 Re-anchor resume Resumes at step 4 without re-running past steps SUCCESS
12 Agent invocation Exposed to external agent as a typed tool call SUCCESS
13 Approval gate Integrity and review shown as separate axes; unattended replay gated on the second SUCCESS
14 Generated test A runnable Playwright test emitted from the artifact, carrying no CSS hint SUCCESS

Works completely offline without an API key — discovery falls back to a verified recorded transcript. Supply OMNIROUTE_API_KEY for a live LLM execution.

One path to the surface

Discovery, replay and a human operator all reach the browser the same way. Nothing dispatches without passing policy.

Action
click, type, navigate
→
TargetResolver
resolve or refuse
→
PolicyEngine
authorize
→
SurfaceDriver
dispatch

Read next

The design write-up answers the brief directly — architecture, determinism, the error taxonomy, escalation, and what was deliberately left out. The documentation goes a level down: component designs, ADRs, runbooks and the test strategy.

Design write-up Documentation Source on GitHub