File size: 12,952 Bytes
454b3e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# Suite C — held-out, multi-step real-website evaluation

`apps/browser_suite_c.py` runs the jev-ultrafast agent against 27 live tasks on domains that appear in **no** training
source (`finetune/out/train_domains.json`, `finetune/sites*.txt`) and not in suites A/B (checked at start-up, both on the
exact host and on the registrable base domain; prints `LEAK` otherwise).  19 tasks need 4+ actions.

    python apps/browser_suite_c.py [name-filter]          REPEATS=3 SUITE_OUT=/tmp/suite_c.json
    python apps/suite_c_scripts.py [name-filter]          model-free scripted solutions; REPEATS=3 SHARD=i/n

Validation protocol (no model, no GPU): every task has a scripted solution in `apps/suite_c_scripts.py`
(observe → pick the action by label → act, through jev's `Browser`).  A task is kept only if the script passed its check
3/3 on separate runs **and** the check failed on the start page (a do-nothing run cannot pass).  Checks read the final
URL/title/text or the observed form state (checked radios/checkboxes, current `<select>` value), never the model.
Because an observation only covers the viewport, the judge (`final_state`) scrolls to the top and then screen by screen,
merging the actions and visible text of the whole page before the check runs, so a check never depends on where the
agent left the scroll position.

## Tasks

Steps = number of browser actions of the scripted solution (a scroll counts as one action).

| # | name | site | goal | scripted steps | check verifies |
|---|------|------|------|:--:|----------------|
| 1 | met-sunflowers | metmuseum.org collection search | search "sunflowers", tick "Has image", sort by date oldest first | 4: fill, Enter, checkbox, select | URL `q=sunflowers&showOnly=withImage&sortBy=Date` (newest gives `DateDesc`) |
| 2 | nuget-serilog-tool | nuget.org | search "serilog", package type ".NET tool", sort by downloads | 4: fill, Enter, radio, select | URL `q=serilog`, `packagetype=dotnettool`, `sortby=totalDownloads-desc` |
| 3 | alpine-curl-filter | pkgs.alpinelinux.org | package name curl, branch v3.20, repo main, arch aarch64 | 5: fill, 3× select, Enter | URL `name=curl&branch=v3.20&repo=main&arch=aarch64` |
| 4 | freesound-rain-cc0 | freesound.org | search "rain", license CC0 facet, category Soundscapes facet | 4: fill, Enter, 2× facet link | URL `q=rain` and `f=license:"Creative Commons 0" category:"Soundscapes"` |
| 5 | ats-shampoo-haircare | automationteststore.com | search "shampoo", category Hair Care, "search in descriptions", Search, sort price high→low | 6: fill, Enter, select, checkbox, button, select | URL `keyword=shampoo`, `category_id` contains 52, `description=1`, `sort=p.price-DESC` |
| 6 | bnf-hugo-printed-p2 | catalogue.bnf.fr | search "victor hugo", facet "Texte imprimé et livre numérique", page 2 | 4: fill, submit, facet, "Page suivante" | URL `motRecherche=victor hugo`, `listeAffinages` has `FacNatDoc_a`, `pageEnCours=2` |
| 7 | vsm-python-installs | marketplace.visualstudio.com | search "python", Sort By menu → Installs | 4: fill, Enter, menu, menuitem | URL `term=python&sortBy=Installs` |
| 8 | wp-cache-commercial-redis | wordpress.org/plugins | search "cache", "Commercial" filter, open Redis Object Cache | 4: fill, Enter, filter, link | URL `/plugins/redis-cache` |
| 9 | todomvc-active | demo.playwright.dev/todomvc | add "buy milk" and "walk the dog", show Active | 5: fill, Enter, fill, Enter, link | URL ends `#/active`, both todos in text, "2 items left"; localStorage is cleared before each run |
| 10 | setlist-radiohead-uk | setlist.fm | search "radiohead", Artist → Radiohead, Country → United Kingdom | 4: fill, Enter, 2× select | URL `query=radiohead&artist=bd6bd12&country=gb` |
| 11 | jetbrains-rust-free | plugins.jetbrains.com | search "rust", "free" filter, open the Rust plugin by JetBrains | 4: fill, Enter, button, link | URL `/plugin/22407-rust` |
| 12 | luarocks-rapidjson | luarocks.org | search "json", tick "Include non-root", Search, open rapidjson | 5: fill, Enter, checkbox, button, link | URL `/modules/xpol/rapidjson` |
| 13 | letcode-dropdowns | letcode.in/dropdowns | four `<select>`s: Apple, Batman, Swift, India (the last one is below the fold) | 5: 3× select, scroll, select | observed `current_value` of the four selects |
| 14 | letcode-radio | letcode.in/radio | radios Foo + Going, tick "I agree…", untick "Remember me" | 4: 2× radio, 2× checkbox | observed `checked` state of the four controls |
| 15 | clojars-ring-page3 | clojars.org | search "ring", go to page 3 (pagination is below the fold) | 7: fill, Enter, 4× scroll, link "3" | URL `q=ring&page=3` |
| 16 | fred-unemployment-pop | fred.stlouisfed.org | search "unemployment rate", sort by popularity | 4: fill, Enter, sort menu, "Popularity" | URL `st=unemployment rate` and `ob=p` |
| 17 | modrinth-sodium | modrinth.com/mods | search "sodium", game version 1.21.11, sort by downloads | 5: fill, Enter, version button, sort menu, option | URL `q=sodium&v=1.21.11&s=downloads` |
| 18 | tvmaze-friends-episodes | tvmaze.com | search "friends", open show, Episodes tab | 4: fill, Enter, link, tab link | URL `/shows/431/friends/episodes` |
| 19 | qaclickjet-form | rahulshettyacademy.com/dropdownsPractise | radio Round Trip, tick Senior Citizen, currency USD, type "India" in the country box | 4: radio, checkbox, select, fill | observed radio/checkbox/select state and the country field's value |
| 20 | cocktail-margarita | thecocktaildb.com | search "margarita", open Margarita | 3 | URL `/drink/11007` |
| 21 | mealdb-arrabiata | themealdb.com | search "arrabiata", open Spicy Arrabiata Penne | 3 | URL `/meal/52771` |
| 22 | gentoo-openrc-talk | wiki.gentoo.org | search "OpenRC" (lands on the article), open Discussion | 3 | URL contains `Talk:OpenRC` |
| 23 | webkit-css-bugs | bugs.webkit.org | Browse → WebKit product → CSS component | 3 | URL `buglist.cgi?...product=WebKit&component=CSS` |
| 24 | govdata-wetter-energie | govdata.de | search "Wetter", category Energie | 3 | URL `q=Wetter&groups=ener` |
| 25 | fedora-vim-common | packages.fedoraproject.org | search "vim", open vim-common | 3 | URL `/pkgs/vim/vim-common` |
| 26 | racket-argo | pkgs.racket-lang.org | search "json", open argo | 3 | URL ends `/package/argo` |
| 27 | rdrr-ggplot | rdrr.io | search "ggplot" | 2 | URL `/search?q=ggplot` |

Notes on the harder ones:
- Several targets are only observable after a scroll (Clojars pagination) or inside a menu that must be opened first
  (VS Marketplace "Sort By", FRED "Sort by Relevance", Modrinth "Sort by"): the agent must open the menu, then pick.
- letcode-dropdowns / letcode-radio / qaclickjet-form have no URL change at all; they are judged from the observed form
  state, so they cannot pass by navigating anywhere.
- todomvc-active depends on persisted state, so the suite (and the script runner) clears the site's localStorage first.

## Sites rejected and why

Blocked / bot walls for headless Chromium (Cloudflare "Just a moment", Akamai "Access Denied", 403, captcha):
congress.gov, bls.gov, catalog.hathitrust.org, dp.la (CloudFront error), philpapers.org, zbmath.org, tvtropes.org,
terraria.wiki.gg, mobygames.com, anaconda.org, hansard.parliament.uk, latlong.net, chessgames.com (403),
data.humdata.org (403), pkgs.org ("Human Verification" page after search), imslp.org (its search redirects to Google →
captcha), hal.science and openwrt.org ("Oh noes!" error page), search.scielo.org (never finishes "Establishing a secure
connection").

In the training data / sites lists (LEAK by domain or base domain), so unusable even though they would be good:
data.gov, data.gov.uk, data.europa.eu, data.gouv.fr, open.canada.ca, data.gov.au, openlibrary.org, archive.org,
gutenberg.org, musicbrainz.org, discogs.com, boardgamegeek.com, pypi/crates/npm/hex/pub.dev/hackage/metacpan,
packages.debian.org, packages.ubuntu.com, aur.archlinux.org, repology.org, addons.mozilla.org, readthedocs.org,
bugzilla.mozilla.org, bugs.launchpad.net, bugs.debian.org, bugzilla.kernel.org, gitlab.com, codeberg.org, sourceforge.net,
stackoverflow.com, wikidata/wiktionary/wikivoyage/wikiquote/commons, wikihow.com, lichess.org, geonames.org, timeanddate.com,
zenodo.org, figshare.com, dataverse.harvard.edu, dblp.org, doaj.org, core.ac.uk, biorxiv.org, inspirehep.net, eric.ed.gov,
ncbi/pubmed, worldbank.org, who.int, ec.europa.eu, usa.gov/nist/cdc/fda/epa/nps.gov, ocw.mit.edu, plato.stanford.edu,
selenium.dev, w3schools.com, demoqa.com, the-internet.herokuapp.com, saucedemo.com, demoblaze.com, parabank,
practice.expandtesting.com, automationexercise.com, opencart demo, nopcommerce demo, orangehrm demo, magento
softwaretestingboard, juice-shop, webscraper.io, scrapethissite.com, toscrape.com, scrapingcourse.com (suite B), and all
the airline/hotel/travel sites in finetune/sites.txt.

Reachable but rejected for the agent's action space or for flakiness:
- bugs.kde.org simple search: the Product `<select>` has ~235 options, so the observation is truncated at 250 actions
  and the "Words" text field is never offered.
- gitea.com explore: the custom Sort dropdown's options do not navigate when clicked (URL stays `sort=recentupdate`).
- rawg.io: Enter in the search box does not navigate (`rawg.io/?`); results are only rendered in-page.
- weather.gov: neither the "Go" nor the "Get Weather" form submits from a synthetic click (no navigation after 1.5 s).
- data.cityofnewyork.us: the search box is a combobox, so no Enter action is offered, and clicking the search button
  drops the query when a filter is applied afterwards.
- uniprot.org: the facet sidebar ("Reviewed") is not rendered in the 1120×780 viewport.
- bstackdemo.com: vendor checkboxes and "Add to cart" buttons are custom elements that are not observed as actions.
- cms.demo.katalon.com: search only returns blog posts; the shop's sorting `<select>` is a selectWoo widget with no
  observable options.
- rahulshettyacademy autocomplete: jQuery-UI suggestions have no `role=option`, so they cannot be clicked (the form task
  only types into that field and judges its value); its discount checkboxes are mutually exclusive (ticking one clears
  the others), so the task asks for a single one.
- testpages.eviltester.com basic form, demo.guru99.com register form: every field is an unlabeled `textbox`, so the
  goal cannot name the fields; guru99 also needs a password field, which jev hides.
- letcode.in/forms: only the Email field remains observable after scrolling (layout overlaps).
- oxylabs sandbox: the platform sub-category chips ("switch", "wii") are not links.
- scryfall.com: search box is an unlabeled textbox; sunrise-sunset.org: the Search button does not navigate.
- pokemondb.net Pokédex filter (Name + Type, client-side): worked 3/4 runs, but on some first loads the whole page is
  covered by an overlay so no control is observable at all → dropped as flaky.
- issues.jenkins.io: the "Search for issues" link is only present in a collapsed menu on some loads.
- ultimateqa.com forms: only name + message + submit (too small); openalex.org (API-only page); melpa/opencollective:
  no searchable form on the landing page.
- wikipedia-like wiki farms (miraheze) and mediawiki search are already heavily represented in training; only one
  MediaWiki task (Gentoo wiki talk page) is kept.

## Validation results

Filled in from `python apps/suite_c_scripts.py` with REPEATS=3 (see the bottom of this file).

Final run of `REPEATS=3 python apps/suite_c_scripts.py` (2026-09-26, four shards in parallel, final judge code):
27/27 tasks passed 3/3, every start-page check failed (a do-nothing run cannot pass).

| task | scripted runs | steps | task | scripted runs | steps |
|------|:---:|:---:|------|:---:|:---:|
| met-sunflowers | 3/3 | 4 | nuget-serilog-tool | 3/3 | 4 |
| alpine-curl-filter | 3/3 | 5 | freesound-rain-cc0 | 3/3 | 4 |
| ats-shampoo-haircare | 3/3 | 6 | bnf-hugo-printed-p2 | 3/3 | 4 |
| vsm-python-installs | 3/3 | 4 | wp-cache-commercial-redis | 3/3 | 4 |
| todomvc-active | 3/3 | 5 | setlist-radiohead-uk | 3/3 | 4 |
| jetbrains-rust-free | 3/3 | 4 | luarocks-rapidjson | 3/3 | 5 |
| letcode-dropdowns | 3/3 | 5 | letcode-radio | 3/3 | 4 |
| clojars-ring-page3 | 3/3 | 7 | fred-unemployment-pop | 3/3 | 4 |
| modrinth-sodium | 3/3 | 5 | tvmaze-friends-episodes | 3/3 | 4 |
| qaclickjet-form | 3/3 | 4 | cocktail-margarita | 3/3 | 3 |
| mealdb-arrabiata | 3/3 | 3 | gentoo-openrc-talk | 3/3 | 3 |
| webkit-css-bugs | 3/3 | 3 | govdata-wetter-energie | 3/3 | 3 |
| fedora-vim-common | 3/3 | 3 | racket-argo | 3/3 | 3 |
| rdrr-ggplot | 3/3 | 2 | | | |

19 tasks need 4+ actions (the first 19 in `TASKS`, also reported separately by the suite as "multi-step tasks").
The agent suite itself (`apps/browser_suite_c.py`) has not been run yet: it needs the laya systemone server (:8791) and
sglang (:30000), and the GPU belonged to another session while this suite was built.