Skip to content

feat(ruby): eval suite — Ruby ports of all 77 bench tasks + runner - #2861

Draft
filip-michalsky wants to merge 6 commits into
filipmichalsky/ruby-sdk-m6d-windowsfrom
filipmichalsky/ruby-sdk-evals
Draft

feat(ruby): eval suite — Ruby ports of all 77 bench tasks + runner#2861
filip-michalsky wants to merge 6 commits into
filipmichalsky/ruby-sdk-m6d-windowsfrom
filipmichalsky/ruby-sdk-evals

Conversation

@filip-michalsky

Copy link
Copy Markdown
Collaborator

Part of the AP-2857 parity stack:

Stack: … ← #2858 (M6a) ← #2859 (M6c) ← #2860 (M6d) ← this PR (evals)

Ruby ports of the entire bench-tier eval set from packages/evals/tasks/bench/all 77 tasks (40 act, 25 extract, 12 observe), each a 1:1 semantic port (same URLs, same assertions) — plus a runner (packages/sdk-ruby/evals/): auto-discovery, fresh Browserbase session per run, one shared extension upload per invocation (per-session uploads trip the POST /v1/extensions rate limit), self_heal: true like the TS harness, trials/concurrency/target selection, JSONL results + per-category summary.

SDK changes the port forced

  • act/observe/extract gain locator: / ignore_locators: — protocol options TS/Python already exposed and the eval tasks use — with page-ownership validation; call options now encode through their wire models (ActOptions/ObserveOptions/ExtractOptions). RBS updated; suite at 123 runs / 807 assertions.

Results (Browserbase + Model Gateway)

Category Passed
act 39/40
extract 24/25
observe 10/12
overall 73/77

The 4 failures were probed individually and are not Ruby defects:

  • extract/extract_apartments — apartments.com returns Akamai Access Denied to this infra
  • observe/observe_taxes — 1040.com serves a bot-check interstitial; the form never renders
  • observe/observe_vantechjournal — site drift: the hardcoded expected XPath no longer exists on the live page
  • act/vantechjournal — navigation-timing race shared with the TS task: the SDK clicks the correct link and navigation completes (verified: page.url reads /recommendations 3s later), but the task samples page.url before the navigation commits

Porting note that generalizes: z.string().url() fields must reach the wire as "format": "uri" (zod's JSON-Schema interchange) for the extension to resolve element references into absolute URLs — plain "type": "string" returns reference ids.

Out of scope: dataset-backed suites (WebVoyager, OnlineMind2Web, WebTailBench), agent-tier tasks, Braintrust reporting.

🤖 Generated with Claude Code

- evals/harness.rb + evals/runner.rb: bench-tier harness mirroring
  packages/evals — tasks auto-discovered from evals/tasks/<category>/,
  fresh Browserbase session per run (one shared extension upload per
  invocation: per-session uploads trip the POST /v1/extensions rate
  limit), self_heal: true like the TS evals, concurrency/trials/targets
  CLI, JSONL results + per-category summary
- evals/tasks: 1:1 semantic ports of all 77 bench tasks (40 act,
  25 extract, 12 observe) — same URLs, same assertions; zod schemas as
  JSON Schema hashes (z.string().url() => format: "uri", which the
  extension resolves to absolute URLs); framework helpers
  (normalizeString, Jaro-Winkler compareStrings, matchingSelector)
  inlined where the TS imported them
- SDK: act/observe/extract gain locator:/ignore_locators: (protocol
  options TS/Python already exposed; the eval tasks use them) with
  page-ownership validation, and options now encode through their wire
  models; RBS updated; 3 new unit tests (123 runs total)

Results on Browserbase (Model Gateway): 73/77 pass. The 4 remaining are
not Ruby defects — probed individually: extract_apartments (Akamai
Access Denied) and observe_taxes (bot interstitial) are IP-walled for
this infra, observe_vantechjournal's hardcoded expected xpath no longer
exists on the live site, and act/vantechjournal is a navigation-timing
race shared with the TS task (the SDK clicks the right link and the
navigation completes; the task samples page.url before it commits).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Aug 30, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 8297a8a

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

filip-michalsky and others added 5 commits August 30, 2026 19:10
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rom the repo root)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…old CI runners)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e the byte assertion)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… cold CI runners)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant