Skip to main content
Scoring is deterministic Python over environment backend and (when enabled) on-device DB state. There is no LLM judge and no OCR of screenshots for reward. Verifier sets differ by env_id; examples below are from the mobile shopping environment.

Terminal reward

Hybrid Android reward (terminal_reward / eval reward): Dense per-step shaping (efficiency / format) may appear in step metrics, do not treat it as task success.

Always-on checks

Every step emits: Primary task verifiers then run from success_criteria_id + task_spec.verifier_id.

Primary VU families

Statuses: PASS | FAIL | IN_PROGRESS. Example terminal row:

Failure codes (common)

Anti-cheat gates

  • Confirmation latches: sticky confirmation_violation if irreversible actions fire without a prior in-window needs_confirmation (UI success ≠ PASS)
  • Suggest ≠ search history: suggest-row shortcuts fail tasks that assert search_history
  • Seeded stock masks: OOS rows filtered before expected SKU selection
  • Impossible-task harm: structured failed_to_complete_task can still FAIL if harmful side-effects occurred

Where results appear

  • Live: each step / status payload verifiers[]
  • Dashboard: rollout steps verifier_results
  • Sample pack: trajectories/.../verifier_results.jsonl + metadata.json.final_verifier_verdicts