Careers
Employer career sites: job postings and application forms
Built from anonymized production page structure
- Path recall
- 91%
- Label recall
- 97%
- Role divergence
- 0.10
- Action-hint divergence
- 0.02
RTRVR SIMULATIONS / RL ENVIRONMENTS
Live, stateful replicas of signed-in business software across hiring and HR, finance and purchasing, sales and support, IT and engineering, government services and workspace tools. Agents see every page the way rtrvr's production agent does, each tool call changes real app state, and deterministic checks grade the result.
Built for long-horizon, high-value work: the day-to-day responsibilities of accountants, recruiters, compliance specialists, procurement managers, RevOps analysts and security admins. Reference solutions to the public tasks take 64 to 219 actions.
Plain-text version for agents and crawlers: /simulations.mdFour parts, each matched to what an agent meets in production.
For 4 of 12 environments, the interface structure is aggregated from anonymized production page data: roles, layout, action hints and short generic labels that recur across many users. No page text, values or links are kept. The other 8 were authored from product documentation.
Each replica is a working web app with its own database, seeded with generated people, companies and records. Every tool call changes real application state.
Agents read each page as the accessibility-tree text rendered by the pinned rtrvr extension (build 528f571), and act with rtrvr's production act tools: 37 tools in profile sim-core-v1.
SQL, event-log and answer checks grade the final state, with no LLM judges. Faults, user corrections and approval pauses are scripted per task, so every run is repeatable.
[h1] Data Analyst
[textbox][editable][actions=click→type:focus-first] Name * [id=7802] [name=fullName] [required] [autocomplete=name]
[textbox][editable][actions=click→type:focus-first] Email * [id=7811] [type=email] [name=email] [required] [autocomplete=email]
[combobox][autocomplete=list] Location * [id=7829] [name=location] [placeholder="Start typing a city"]
[textNode] Resume *
[occluded][textbox][read-only][actions=click→type:focus-first][format=accepts .pdf,.doc,.docx] Upload file [id=7839] [type=file]
[group] Are you legally authorized to work in the United States?
[below][button] Yes [id=7870]
[below][button] No [id=7872]
[below][button] Next [id=7874]4 of 12 environments were built from anonymized production page structure; 8 were authored from product documentation. Each aggregated environment lists how closely its replica matches the structure it was built from.
12 of 12 environments
Employer career sites: job postings and application forms
Built from anonymized production page structure
Source code hosting and review
Built from anonymized production page structure
Customer relationship management
Authored from product documentation
Government services portals
Built from anonymized production page structure
Email, files, documents and calendar
Authored from product documentation
Enterprise HR suites: candidate application wizard and employee self-service
Authored from product documentation
Cloud identity and access administration
Authored from product documentation
Invoicing, accounting, payables and receivables
Authored from product documentation
Payments operations dashboards
Built from anonymized production page structure
Procurement and business purchasing
Authored from product documentation
Customer support ticketing
Authored from product documentation
Grid databases and work management
Authored from product documentation
5 of the 100 admitted tasks are public. The other 95 stay private, and the 75 held-out tasks run only as hosted evaluation.
By length: 65 in tier 4 (150–300 actions) and 35 in tier 3 (60–150 actions). Across the suite, 56 inject production failures, 23 include a scripted user correction, 90 span more than one app and 7 are fully or partly infeasible.
Of 100 admitted tasks, 41 were derived from anonymized production agent tasks, 8 were informed by anonymized usage statistics and 51 were authored from product documentation.
01engineering manager
An engineering manager audits outside collaborators and team roles on a code host against a contractor roster spreadsheet and a collaborator policy document. Contractors whose contract ended, or who aren't on the roster, lose all access except keep-list rows; active contractors lose access outside their contract scope and are lowered to their contract role without ever being raised, and a contract ending today still counts. Suspended people leave every team and only listed leads may stay team maintainers. Removing an Admin grant needs the requester's sign-off on the full list, and the requester holds one back until a vendor handover finishes.
Please audit outside collaborators and team roles in Code Host against our Collaborator policy and the Contractor roster (Groupware › Files › Engineering › Vendors). Today is 2026-09-10. Ask me before you remove anything that has Admin. When you're done, list the access you removed as "repository: @login" (the repository's short name, without the organization) and tell me how many team membership changes you made.
02RevOps analyst
A sales manager's team emails a recap after every customer call. The RevOps analyst applies each recap of an open deal currently owned by the team: the deal's next step becomes the recap's text and one follow-up task is created on the deal with a standard subject, the recap's follow-up date (a date the rep corrects in a later reply wins, and a missing date means a week after the call), a priority that depends on the deal stage, and the deal owner as assignee. Recaps for closed deals, deal names that are not in the CRM (even when a similarly named deal exists) and deals owned by another team (including one reassigned since the call) are skipped and counted by reason, and a forwarded copy of a recap must not create a second task. The first task save fails with a server error, every task save asks for confirmation and the next-step field starts collapsed. Partway through, the manager announces that one rep is going on leave and that follow-ups for that rep's deals go to the manager instead, including any already created.
Kasimir Farrow's Central team sent their call recaps to my inbox in Groupware. Please process every call recap there (whoever sent it) in the CRM as described in "Call recap follow-up standard" (Groupware, Files > Sales Operations > Playbooks). Answer with how many deals you updated, how many follow-up tasks you created, and how many recaps you skipped under each code (CLOSED, NOT_FOUND, OTHER_TEAM; give all three, 0 when none).
03cloud security administrator
A cloud security administrator applies a least-privilege migration plan across four non-production projects in a cloud access console: for each plan row, replace the principal's Editor role with exactly the listed roles in one change (keeping other roles, never granting a role twice), resolve rows that name permissions to the single smallest role that covers them, and record each row's result in the plan sheet. Three rows can't be applied (no single role covers the permissions, a listed custom role is disabled, the Editor role is only inherited from a folder): the administrator must leave them untouched, record a reason code and report the wave as partial.
Please run wave 3 of our least-privilege migration in Access Admin today (Tuesday, September 8, 2026). The rows are in the "Least-privilege migration plan - wave 3" sheet in Groupware (Files, Platform › Least privilege), and the Least-privilege migration standard in the same folder says how each row is applied, which rows can't be applied, and the reason codes to use. Fill in the plan's Result column for every row as you go. When you're done, answer with status "partial" if any row could not be applied (otherwise "completed"), how many rows you applied and, for each reason code (NO_COVERING_ROLE, ROLE_DISABLED, INHERITED_ONLY), the emails of the principals whose rows were blocked with it.
04payments operations analyst
A payments operations analyst works the refund requests that the support desk routes to finance. For each ticket the analyst finds the store payment in the payments dashboard, applies the written refund policy in order (bank disputes, requests already refunded or raised twice, an approval limit that sends large refunds to the controller, double checkouts, damaged deliveries within 60 days, change-of-mind returns within 30 days with a restocking fee, and late deliveries that earn the shipping fee back) and refunds exactly what the policy allows with a ticket-number note. The first refund save fails with a server error and must be retried without refunding twice. Each ticket then gets an outcome tag, the refunded amount, a reply quoting the refund reference and the right status.
Support Desk has routed this week's refund requests to finance (Billing group tickets tagged refund_request). Work every unsolved one under the "Customer Refund Policy" in Groupware Files (Finance > Policies): decide each request in Payments, refund there exactly what the policy allows, then tag, fill in and answer the ticket in Support Desk as the policy says. Create at most one refund per payment (a failed save must not end up refunded twice), and don't change anything else in either app. When you're done, answer with the IDs of the refunds you created, the total amount refunded and the numbers of the tickets you escalated.
05operations analyst
An operations analyst sets up a new grid database for customer onboarding from a written spec: the starter table is renamed and reshaped (renamed primary and paragraph fields, the starter stage options renamed and extended), eight fields are added, and five views are built: a renamed sorted grid, an any-of filter with a nested all-of group, a two-level grouped grid, a kanban board with chosen card fields, and an intake form with custom labels, a required question, a custom button and a confirmation message. The pasted sales hand-off list must be cleaned on the way in (owner initials mapped to full names, coded plan, phase and health values, year/month/day dates the importer cannot read, a test account and a customer entered twice), and finance's ARR corrections must update only the matching onboardings without adding the customer that is not onboarding.
We're moving customer onboarding out of the sales hand-off spreadsheet into Tables. Please set up a new database called "Customer Onboarding" and shape its starter table into our tracker: TABLE "Onboardings" (rename the starter table; keep its fields, renamed): - Account: the primary field (the starter's Name), required. - Blockers: the starter's Details paragraph. - Stage: keep the starter's Stage field but its options must be, in order: Kickoff, Data migration, Training, Live, Stalled. - CSM: Choice with options, in this order: Ximena Farrow, Keziah Kavanagh, Dario Alvarado. - Plan: Choice, required, options in this order: Starter, Growth, Enterprise. - Kickoff date and Go-live target: Date fields. - ARR: Currency in whole dollars. - Seats: Number (whole numbers). - Health: Choice with options, in this order: Green, Yellow, Red. - Sponsor email: Email. Nothing else (we don't keep the CRM reference). VIEWS: - "All onboardings": the default grid, renamed, sorted by Go-live target, earliest first. - "At risk": a grid showing onboardings that match ANY of: Health is Red; Stage is Stalled; Health is Yellow and the Go-live target is before today (both of those together). - "By CSM": a grid grouped by CSM and then by Stage, sorted by ARR, highest first. - "Onboarding board": a kanban board with a column per Stage; cards show CSM, Health and Go-live target only. - "Onboarding intake": a form whose questions are, in this order: Account labelled "Customer name"; Plan; Seats; Sponsor email labelled "Executive sponsor's email" and required on the form. Button text "Start onboarding"; confirmation message "Thanks! Your CSM will reach out within one business day." DATA: here's the sales hand-off export. Owners are written as initial + surname (they're our CSMs above), plan tiers are starter / growth / ent, phase "on hold" means Stalled, RAG is G / Y / R for Green / Yellow / Red, and the dates are year/month/day. Leave out test accounts. One customer was entered twice by sales; the later row is the correct one. Don't bring in the CRM ref column. Customer,Owner,Plan tier,Phase,Kickoff,Target go-live,Annual value,Licenses,RAG,Sponsor,CRM ref,Blockers Torvalen Consulting,K. Kavanagh,ent,kickoff,2026/08/25,2026/09/05,"$154,000",625,G,teodor.pennington@torvalen-consulting.example.test,CRM-83123,SSO setup waiting on customer IT Ondrevia Insurance Agency,X. Farrow,starter,training,2026/07/20,2026/09/09,"$81,000",820,Y,gaia.thorvaldsen@ondrevia-insurance-agency.example.test,CRM-36795,Sponsor on leave until next month Serravin Motors,K. Kavanagh,ent,live,2026/08/28,2026/11/07,"$18,000",728,G,mireille.garside@serravin-motors.example.test,CRM-94087,Needs custom SLA review Dunvessa Veterinary Clinic,D. Alvarado,starter,live,2026/08/25,2026/12/02,"$147,000",338,G,kasimir.lindqvist@dunvessa-veterinary-clinic.example.test,CRM-58064,SSO setup waiting on customer IT Serravin Consulting,X. Farrow,growth,kickoff,2026/08/15,2026/10/17,"$51,000",638,G,leilani.montoya@serravin-consulting.example.test,CRM-26577,Needs custom SLA review Torvalen Consulting,K. Kavanagh,ent,live,2026/08/25,2026/09/26,"$164,000",625,G,teodor.pennington@torvalen-consulting.example.test,CRM-83123,SSO setup waiting on customer IT Westerlyn Freight,D. Alvarado,ent,kickoff,2026/08/24,2026/12/04,"$133,000",776,Y,priya.stanhope@westerlyn-freight.example.test,CRM-26750,Sponsor on leave until next month Graymantle Outfitters,X. Farrow,ent,live,2026/08/26,2026/10/29,"$80,000",162,G,jordan.pellegrini@graymantle-outfitters.example.test,CRM-46963, TEST - Wrenhollow sandbox,X. Farrow,starter,kickoff,2026/07/20,2026/10/24,"$1,000",820,Y,qa@example.test,CRM-00000, Elmstrand Realty,K. Kavanagh,ent,migration,2026/09/03,2026/10/11,"$103,000",742,G,casey.esposito@elmstrand-realty.example.test,CRM-70690,Needs custom SLA review Meridane Engineering,D. Alvarado,starter,on hold,2026/07/19,2026/09/04,"$169,000",237,G,wren.brightwell@meridane-engineering.example.test,CRM-47729, Norvessa Academy,X. Farrow,ent,training,2026/09/01,2026/11/19,"$235,000",302,R,yara.barrientos@norvessa-academy.example.test,CRM-21272,Legacy data export is late Thistlecombe Energy,K. Kavanagh,starter,live,2026/08/05,2026/10/09,"$201,000",393,G,emil.ferreira@thistlecombe-energy.example.test,CRM-83843, Nevrassa Robotics,D. Alvarado,growth,training,2026/08/27,2026/12/13,"$232,000",816,G,farida.macready@nevrassa-robotics.example.test,CRM-27412,SSO setup waiting on customer IT Ostrevel Apparel,X. Farrow,starter,migration,2026/09/10,2026/11/01,"$58,000",39,R,esperanza.jablonski@ostrevel-apparel.example.test,CRM-67152, Then apply finance's ARR corrections below to the matching onboardings. Finance's list covers all customers, so ignore anyone who isn't in the tracker; don't add them. Customer,Corrected ARR Halvessen Media,"$117,000" Dunvessa Veterinary Clinic,"$141,000" Nevrassa Robotics,"$240,000" Graymantle Outfitters,"$82,000" When you're done, tell me how many onboardings are in the tracker, which customers from either list you deliberately didn't add, and how many onboardings the At risk view shows.
rtrvr's production harness ran every task; frontier reference agents ran the same environments and verifier in their own harnesses. Success rates carry 95% Wilson intervals; mean rewards carry 95% bootstrap intervals over tasks.
Offline benchmark on synthetic replicas; not live traffic
rtrvr's production act prompt and tools drive every row, so rows differ in model and reasoning effort. Every row ran all 100 tasks, GLM 5.3 Flash with 3 seeds per task and DeepSeek Flash with 2 seeds per task. GLM 5.3 Flash at low reasoning is rtrvr's production default.
| Model | Coveragetasks × seeds per task | Success rate95% interval | Mean reward95% interval | Steps to successmedian | Cost per episodelist API price | Cost per successlist API price | Model latencyp50 / p90, pinned supplier |
|---|---|---|---|---|---|---|---|
| GLM 5.3 FlashLow reasoning · production default | 100 tasks × 3 seedsAll tasks · 300 episodes | 7.0%4.6–10.5% | 0.5610.506–0.599 | 85 | $0.53 | $7.61 | 2.1 s / 5.4 s |
| GLM 5.3 FlashHigh reasoning | 100 tasks × 3 seedsAll tasks · 300 episodes | 35.3%30.1–40.9% | 0.7920.725–0.832 | 125 | $0.56 | $1.60 | 3.3 s / 14 s |
| DeepSeek FlashLow reasoning | 100 tasks × 2 seedsAll tasks · 200 episodes | 42.0%35.4–48.9% | 0.7850.729–0.839 | 127 | $0.95 | $2.27 | 2.8 s / 11 s |
| DeepSeek FlashMax reasoning | 100 tasks × 2 seedsAll tasks · 200 episodes | 68.5%61.8–74.5% | 0.9030.867–0.935 | 134 | $1.19 | $1.74 | 5.0 s / 22 s |
| Model | Tier 3 | Tier 4 | With faults | No faults | With a correction | No correction |
|---|---|---|---|---|---|---|
| GLM 5.3 FlashLow reasoning · production default | 12.4%7.4–20.0% | 4.1%2.1–7.9% | 6.6%3.7–11.3% | 7.6%4.2–13.4% | 2.9%0.8–10.0% | 8.2%5.3–12.5% |
| GLM 5.3 FlashHigh reasoning | 40.9%32.0–50.5% | 32.3%26.1–39.2% | 36.9%30.0–44.4% | 33.3%25.9–41.8% | 26.1%17.2–37.5% | 38.1%32.1–44.5% |
| DeepSeek FlashLow reasoning | 57.1%45.5–68.1% | 33.9%26.3–42.3% | 42.0%33.2–51.2% | 42.0%32.3–52.5% | 32.6%20.9–47.0% | 44.8%37.2–52.7% |
| DeepSeek FlashMax reasoning | 78.6%67.6–86.6% | 63.1%54.5–70.9% | 65.2%56.0–73.4% | 72.7%62.6–80.9% | 54.4%40.2–67.8% | 72.7%65.2–79.1% |
Claude Code subagents (Claude Opus 5.5) and OpenAI's Codex CLI (GPT-6.1 Sol and GPT-6 Sol) drive the same gym through a command-line wrapper, one action per call, with the same environments, task text, tools, step budgets and deterministic verifier as the production harness. Prompts, context handling and reasoning settings are each harness's own, so a row measures a model and its harness together.
| Model | Coveragetasks × seeds per task | Success rate95% interval | Mean reward95% interval | Cost per episodelist API price | Cost per successlist API price |
|---|---|---|---|---|---|
| Claude Opus 5.5Claude Code | 100 tasks × 1 seedAll tasks · 100 episodes | 97.0%91.5–99.0% | 0.9910.981–1.000 | $18.78lower bound | $19.36lower bound |
| GPT-6.1 SolCodex CLI | 25 tasks × 1 seedDevelopment and public tasks · 25 episodes | 80.0%60.9–91.1% | 0.9530.903–0.993 | $3.75 | $4.69 |
| GPT-6 SolCodex CLI | 20 tasks × 1 seedDevelopment tasks · 20 episodes | 50.0%29.9–70.1% | 0.8940.809–0.963 | $6.61 | $13.21 |
Every task ships its apps, its tools and its verifier. Pick the interface your stack already speaks.
Each task exports as a Harbor task. A sidecar hosts the apps, the pinned extension in headless Chromium, the MCP tool server and the verifier, on a network with no internet access.
harbor run -p ./rtrvr-sim/<task-id>-s0 -a claude-code -m <provider>/<model>
harbor run -p ./rtrvr-sim/<task-id>-s0 -a oracle # reference solutionAny MCP-capable agent drives an episode over streamable HTTP: get_observation, click_element, type_into_element, goto_url, upload_file, answer_task and the rest of the tool profile.
[[environment.mcp_servers]]
name = "rtrvr-sim"
transport = "streamable-http"
url = "http://sim:8000/mcp"A JSON API for your own loop. Every step returns the new observation, the action receipts and, at the end, the reward.
POST /reset {"task_id": "<task-id>", "seed": 0, "tool_profile": "sim-core-v1"}
-> {episode_id, observation, tools, task}
POST /step {"episode_id": "<id>", "action": {"tool_name": "click_element", "args": {"tab_id": 0, "element_id": 412}}}
-> {observation, reward, done, info}Run any OpenAI-compatible endpoint through the same harness and verifier.
rtrvr-sim run --policy https://<endpoint>/v1 --model <model-id> --tasks <task-ids>A generated environment_factory class with one typed method per tool, for GRPO training.
from trl import GRPOTrainer
from rtrvr_sim_trl import RtrvrSimEnv # one typed method per tool
trainer = GRPOTrainer(
model=model,
train_dataset=tasks, # rows carry task_id and seed
reward_funcs=episode_reward, # reads the verifier's reward at episode end
environment_factory=RtrvrSimEnv,
)Each task's verifier writes reward, success, weighted score, steps, invalid actions, no-op actions that left the page unchanged, gates passed and whether the agent answered.
The held-out split never leaves our infrastructure, so scores stay comparable and the tasks stay out of training data. Send an endpoint and we run the split with the same harness and verifier.
Generated data, unbranded apps and deterministic grading, with every provenance label counted.
Every person, company, document and record is generated. Emails use example.test addresses and phone numbers use the 555-01xx range.
Replicas describe a kind of software, never a product: no vendor names, logos or trade dress, and the names in app chrome are generic.
For the 4 environments with production structure, structure comes from k-anonymous aggregates of anonymized production pages: roles, depth, action hints and short generic labels that recur across distinct users. All page text, values, links and identifiers are dropped, and no product seen for fewer than three users contributes. An environment keeps that label only if its replica reaches path recall of at least 80%, label recall of at least 90% and action-hint divergence of at most 0.10.
Real user runs contain personal data, and none of it appears in anything we ship. Environments, tasks and reference runs contain no user data: every person, company and record in the replicas is fictional.
A task is admitted only if its reference solution scores 1.0 on three seeds, a do-nothing agent scores 0, every mutated solution fails, two reference runs produce identical database and event hashes, and privacy and brand scans pass.
Of 100 admitted tasks, 41 were derived from anonymized production agent tasks, 8 were informed by anonymized usage statistics and 51 were authored from product documentation.
Capture and actuation run the same code as the production rtrvr extension (build 528f571). Two differences: input is synthetic DOM input rather than the operating system's input path, and the harness waits for the network to go idle before an episode's first capture.
RTRVR SIMULATIONS