blob: 703aee8fe8a728d4e362a751c30f6998210567e8 [file] [view]
# Computer Use Provider Evidence
This layer defines the evidence contract for real-model Computer Use runs. It
does not claim that any provider has completed a real run.
## Scenario Contract
The scenario library defines:
- an owned Electron fixture;
- the exact user prompt and expected state;
- forbidden effects;
- allowed actions and per-action budgets;
- required execution capabilities;
- deterministic state evaluation.
The fixture helper imports Electron only. It does not import Maka Runtime,
provider transports, or execution backends.
## Report Contract
Reports separate three evidence classes:
- `real-runtime`: a live provider model used the production Maka runtime;
- `fault-injection`: a live provider and Runtime exercised a named injected
failure, but the run cannot qualify as real host evidence;
- `hermetic-protocol`: a fake transport proved protocol behavior;
- `static-contract`: source or schema checks only.
Only `real-runtime` can satisfy a provider matrix cell marked `real`.
Policy-bypassed runs remain visibly labeled and cannot become an unqualified
pass.
Real reports also fail closed unless producer, transport, policy mode, model,
fixture PID/window ownership, latest-observation lineage, action budgets, and
dispatch provenance are explicit. Expected failures must be authorized by the
scenario; a report cannot authorize itself.
The sanitizer preserves action types, timing, result codes, aggregate state,
and allowlisted trace fields. It removes coordinates, typed text, raw UI
content, credentials, full URLs, and provider payloads.
## Consolidation Findings
Review found that the AppKit producer emitted `traces` while qualification read
`driverTraces`, and the Desktop launcher derived its fixture window allowlist
from the actions being judged. The first mismatch rejected valid AX evidence;
the second allowed circular ownership proof.
Both producers now emit one canonical schema. Desktop fixture identity is
collected independently from the launcher-owned PID and cua-driver window
inventory before model execution. Qualification waits for matching dispatch
traces and requires each target to belong to that independent identity.
Qualification also keeps three fail-closed invariants:
- restart recovery authorizes only the scenario-declared stale
`set_value / target_missing` result and budgets the required fresh retry;
- disallowed and over-budget model attempts are recorded as canonical failed
action evidence before the harness rejects them;
- the Desktop launcher and provider matrix call the same real-report validator,
so a launcher cannot exit successfully for a matrix-invalid report.
The old direct real-machine qualification runner was removed. The five-round
restart runner remains available as `e2e:computer-use-process-restart-soak`,
but is regression-only and cannot satisfy a provider matrix cell. There is one
qualification path rather than parallel evidence standards.
## Next Layer
A provider launcher must:
1. pin a scenario from this library;
2. run against the owned fixture and production Computer Use backend;
3. enforce the scenario action budget before dispatch;
4. emit a sanitized `real-runtime` report;
5. let the provider matrix validate fixture state and forbidden effects.
## First Real Run
The first qualifying run completed with:
- provider: OpenAI;
- model: `gpt-5.4`;
- evidence class: `real-runtime`;
- tool exposure: direct E2E, with only the production `maka_computer` tool;
- action: one app-scoped `observe`;
- tool latency: 1117 ms;
- total run latency: 7502 ms;
- terminal status: `complete / end_turn`;
- fixture oracle: verification code matched and interaction count remained zero.
The direct E2E tool exposure is deliberate. The default deferred `load_tools`
path remains a separate product contract; the launcher narrows provider
variables while still exercising the production tool implementation, permission
engine, Runtime, Desktop host, and cua-driver backend.
During this run, OpenAI Responses tool continuation exposed a product bug:
server-side storage generated an `item_reference` in the second request without
a `previous_response_id`, so custom Responses endpoints rejected the tool
result. OpenAI provider options now use `store:false`, matching the existing
Codex subscription boundary and keeping function calls/results inline.
The next run should perform one AX semantic mutation after executor hardening is
merged.
That L1 run has now completed:
- scenario: `l1-single-click`;
- provider/model: OpenAI `gpt-5.4`;
- actions: two observations and one `click_element`;
- no coordinate or compatibility input action was allowed;
- semantic click latency: 1445 ms;
- total run latency: 26023 ms;
- fixture oracle: primary click count 1, danger click count 0, over-click count
0;
- terminal status: `complete / end_turn`;
- result: pass.
The run initially failed closed when the user's foreground ChatGPT window
occluded the synthetic target. The fixture host now settles and raises its
layer-0 window with `showInactive()` and `moveTop()` before declaring readiness,
without focusing it or using an always-on-top overlay layer.