An LLM figures out how to accomplish a goal against a live application surface once. The successful run compiles into a typed, versioned capability artifact. Afterwards the artifact replays deterministically, with no LLM in the loop — typed inputs and outputs, a declared business-outcome contract, and a human-in-the-loop escalation path that hands over the live session itself.
Discovery uses the LLM to produce a typed trace; the trace compiles
to an artifact; replay executes the artifact against any
PageSurface implementation with zero model calls. Everything
persisted is redacted.
PageSurface module knows a browser exists.
inputs | typed, with examples; {member_id} resolves anywhere. |
steps | goto / click / fill / press_enter only, each with rationale and an optional wait. |
outcomes | NOT_FOUND, INVALID_INPUT, PERMISSION_DENIED… with detect conditions; declared by a human at approval, never guessed. |
checkpoint | the final-state assertion for SUCCESS. |
outputs | regex-extracted caller values. |
approved status; drafts refused by default.
Business outcomes are answers, not failures; recoverable conditions are
engine policy; everything else is a hard failure. The matrix runs one
approved artifact against deliberate faults; every row is a committed
run under evidence/.
| success ×2 | members 1001 / 1002: checkpoint holds, outputs extracted. Same artifact, different params. SUCCESS |
| not-found | member 9999: declared outcome returns a message payload. BUSINESS_OUTCOME |
| bad input | member "401a": declared outcome, no crash. BUSINESS_OUTCOME |
| frozen acct | member 1005: teller role may not view it. BUSINESS_OUTCOME |
| slow page | member 1006 with a 2.5 s fault: the wait absorbs it, p50 3.27 s. SUCCESS |
| busy page | member 1002: one recorded reload, then done. SUCCESS · 1 recovery |
| server error | member 1003: HTTP 500 on the member page. HARD_FAILURE @ step 0 |
| session expiry | member 1002: escalated to an operator, run resumes and completes. ESCALATED → SUCCESS |
evidence/vet-guard/ is a real model told to freeze accounts; it navigates, is refused, declines..env is gitignored; caller outputs return intact in-process only.CUA_DATA_COLLECTION=deny routes model calls to zero-retention endpoints.The engine stops, writes intervention.json (expected vs observed, snapshot, screenshot), and hands over the session it was driving.
The operator drives the browser the engine holds, via an allowlisted protocol (goto/click/fill/look). Every action and control transition is recorded.
resume returns control; satisfied steps are skipped, the checkpoint re-asserted, the run completes. Actions fold into result.escalation.
evidence/replay-escalation-handoff/). The operator console
UI is deliberately not built.
Typed configuration (config/budgets.json), enforced, never
advisory: breaches are typed budget exceeded failures, every
result self-describes its envelope (test-asserted).
| replay ok | 742 ms p50 · 757 ms p95 |
| outcome exit | 607 ms p50 · 617 ms p95 |
| slow fault | 3.27 s p50 · 3.28 s p95 |
| busy reload | 742 ms p50 · 797 ms p95 |
| escalation | 4.75 s cycle |
| LLM call | 2.14 s p50 live |
| discovery | 9.0 s · $0.000821 · 4 calls |
| test suite | 82 tests · 21.6 s |
| jev stuck rule | 83% · Brier 0.075 |
| cost cap | $0.50 ≈ 600× observed run |
| discovery | 600 s · 40 steps · 60 calls |
| step wait | 3 s (slow faults use ~2.6 s) |
| act timeout | 10 s per browser action |
| run total | 180 s ≈ 55× slowest replay case |
| retries | 3 attempts · 0.5/1.0 s backoff · Retry-After ≤ 30 s |
| timeouts | connect 10 s · read 60 s · write 30 s |
| no retry | 4xx client errors raise at once |
Replay latency is local-CPU bound and scales with steps, not load. Discovery latency is LLM-RTT bound. Escalation latency is dominated by the human. Costs are bounded by configuration.
| Real | Engine, taxonomy, guardrails, redaction, escalation, budgets, retry ladder; 82 offline + browser tests. Live runs: discovery ($0.000821) and the guardrail refusal. |
| Scripted | The keyless demo's discovery stand-in, labeled in every artifact it produces. |
| Mock by design | Target app: a hostile credit-union console (no test IDs, non-semantic markup, JS-confirm on the irreversible action, fault injection). |
| Designed only | Multi-tenant canary fleet, desktop/AT-SPI driver, operator console UI (DESIGN.md §4, §8). |
| Not hidden | Every claim on this page cites a committed run under evidence/; anything without one is labeled designed. |
Every document opens on GitHub, where markdown, tables, and code blocks render in full. Source: github.com/aryaminus/cua.