cklxx commited on
Commit
8086c56
·
verified ·
1 Parent(s): 4219958

v14s checkpoint, held-out suite B (100 %), harness fixes, webgym + sub-goal data pipeline, DAgger leak correction

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. README.md +61 -2
  3. code/apps/browser_suite.py +3 -2
  4. code/apps/browser_suite_b.py +60 -0
  5. code/apps/browser_trace.py +39 -0
  6. code/finetune/annotate_subgoals.py +117 -0
  7. code/finetune/build_items.py +36 -5
  8. code/finetune/common_ft.py +1 -1
  9. code/finetune/convert_nnetnav.py +186 -0
  10. code/finetune/infra.sh +23 -0
  11. code/finetune/rollouts2.py +255 -0
  12. code/finetune/run_suite_v12s.sh +13 -0
  13. code/finetune/run_v12s.sh +15 -0
  14. code/finetune/run_v13s.sh +23 -0
  15. code/finetune/run_v14s.sh +23 -0
  16. code/finetune/run_v15s.sh +29 -0
  17. code/finetune/sites.txt +340 -0
  18. code/finetune/sites_autocomplete.txt +69 -0
  19. code/finetune/sites_paged.txt +57 -0
  20. code/finetune/sites_select.txt +38 -0
  21. code/finetune/sites_sort.txt +15 -0
  22. code/finetune/train.py +22 -2
  23. code/finetune/webgym/app.py +169 -0
  24. code/finetune/webgym/eval_gym.py +80 -0
  25. code/finetune/webgym/expert.py +330 -0
  26. code/finetune/webgym/serve.sh +6 -0
  27. code/finetune/webgym/spec.py +222 -0
  28. code/finetune/webgym/widgets.js +194 -0
  29. code/jev-ultrafast.patch +0 -0
  30. code/kernels/fast.py +18 -1
  31. results/round3/gym_eval_v14s.json +314 -0
  32. results/round3/gym_eval_v14s.log +28 -0
  33. results/round3/gym_eval_v14s_plan.json +391 -0
  34. results/round3/gym_eval_v14s_plan.log +28 -0
  35. results/round3/suiteA_v13s.json +338 -0
  36. results/round3/suiteA_v14s.json +338 -0
  37. results/round3/suiteB_v12s_c40.json +254 -0
  38. results/round3/suiteB_v13s.json +380 -0
  39. results/round3/suiteB_v14s.json +380 -0
  40. results/round3/suite_h2_laya-browser-v10s.json +338 -0
  41. results/round3/suite_h2_laya-browser-v12s.json +338 -0
  42. results/round3/suite_h2c40_laya-browser-v12s.json +338 -0
  43. results/round3/suite_v12s.log +103 -0
  44. results/round3/suite_v12s_c40.log +50 -0
  45. results/round3/train_domains.json +1 -0
  46. results/round3/v12s.log +314 -0
  47. results/round3/v13s.log +134 -0
  48. results/round3/v14s.log +134 -0
  49. v14s/encoder/config.json +79 -0
  50. v14s/model.safetensors +3 -0
.gitattributes CHANGED
@@ -37,3 +37,4 @@ v10s/tokenizer/tokenizer.json filter=lfs diff=lfs merge=lfs -text
37
  assets/laya_browser_demo.gif filter=lfs diff=lfs merge=lfs -text
38
  assets/laya_browser_demo.mp4 filter=lfs diff=lfs merge=lfs -text
39
  v11s/tokenizer/tokenizer.json filter=lfs diff=lfs merge=lfs -text
 
 
37
  assets/laya_browser_demo.gif filter=lfs diff=lfs merge=lfs -text
38
  assets/laya_browser_demo.mp4 filter=lfs diff=lfs merge=lfs -text
39
  v11s/tokenizer/tokenizer.json filter=lfs diff=lfs merge=lfs -text
40
+ v14s/tokenizer/tokenizer.json filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -31,6 +31,64 @@ This repo is what it took to turn it into a usable decision head for [browser-us
31
  whose `/v1/systemone` request format is identical to laya's `predict(state, questions)`. Everything was done locally on one RTX 4070 Ti SUPER (16 GB),
32
  no paid API: the text helper and the DAgger teacher are a local Qwen3-8B-AWQ served by sglang.
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  ## What changed relative to the original laya
35
 
36
  | | original laya (typed-decisions) | this repo |
@@ -41,7 +99,7 @@ no paid API: the text helper and the DAgger teacher are a local Qwen3-8B-AWQ ser
41
  | latency per browser step (3 questions, 30–65 candidates) | 50–200 ms | 41–50 ms (v10), **17–23 ms** (v10s / v11s) |
42
  | backbone | ModernBERT-large 421M | v10: same; v10s / v11s: mmBERT-base 322M |
43
  | input format | jev's state verbatim (element table as JSON inside the state, truncated by the 1024-token window) | **format v2/v3**: elements live only in the option list (full label + role + current value), state keeps title / URL / history / 1.2–1.5k chars of text, `head_max_len` 512 → 768 |
44
- | training data | LocalLLaMA/typed-decisions | 5,244 reverse-generated goals on 421 crawled pages (Qwen writes "the goal a user would state to need this element"), 700 real DONE states (clicks actually executed), 659 step-2 negatives, [Mind2Web](https://huggingface.co/datasets/osunlp/Mind2Web) train (7,296 steps, candidates re-rendered as an element table), 177 on-policy DAgger corrections |
45
  | training | — | laya's RLCD recipe (noisy-logit policy gradient + soft CE), single GPU, no gradient checkpointing, 4 epochs (~2 h for v10, ~1 h for v10s), post-hoc temperature |
46
  | inference | HF eager + autocast | optional TileLang fast path ([PR #25 to laya](https://github.com/NandhaKishorM/laya/pull/25)): fused GEMM/GEGLU/LayerNorm/RoPE, sliding-window flash attention, bf16-resident weights, CUDA graphs — 4–5× lower per-call latency, identical answers |
47
 
@@ -76,11 +134,12 @@ DAgger teacher or System-2 fallback here. Further gains need a stronger teacher
76
  ## Files
77
 
78
  ```
 
79
  v10/ ModernBERT-large 421M, format v2, head_max_len 768 (best held-out top-1)
80
  v10s/ mmBERT-base 322M, format v3, head_max_len 768 (17–23 ms per step; best on the live suite)
81
  v11s/ v10s data + 682 scripted scroll / search-submit / select trajectories (equivalent to v10s within noise)
82
  code/ finetune pipeline, laya systemone server, task suite, TileLang kernels, jev-ultrafast patch
83
- results/ per-run suite JSONs and logs behind every number above
84
  ```
85
  Each checkpoint is a laya checkpoint directory (`model.safetensors`, `encoder/`, `tokenizer/`, `rl_agent_config.json`); the config records
86
  `laya_fmt` and `head_max_len_train` so the server applies the matching input format automatically.
 
31
  whose `/v1/systemone` request format is identical to laya's `predict(state, questions)`. Everything was done locally on one RTX 4070 Ti SUPER (16 GB),
32
  no paid API: the text helper and the DAgger teacher are a local Qwen3-8B-AWQ served by sglang.
33
 
34
+ ## Progress update (2026-09-26): v12s–v14s, a held-out suite, and a data-leak correction
35
+
36
+ **New checkpoint `v14s/`** (mmBERT-base 322M, format v3, run the server with a 60-option chunk threshold:
37
+ `python apps/systemone_server.py 8791 /path/to/v14s 60`).
38
+
39
+ | | v10s | v12s | v13s | **v14s** |
40
+ |---|---|---|---|---|
41
+ | **Suite B: 18 tasks on 18 sites that appear in no training source** (×3, `code/apps/browser_suite_b.py`) | – | 94 % (34/36, ×2) | 93 % (50/54) | **100 % (54/54)** |
42
+ | Suite A: the original 16 tasks (×3, patched harness) — *contaminated, see below* | 62 % | 75 % | 75 % | 81 % (39/48) |
43
+ | Held-out long-horizon synthetic tasks (flight / hotel / shop, 8 each) | – | – | – | 0 / 0 / 50 % |
44
+
45
+ Suite B checks the held-out claim at start-up against `results/round3/train_domains.json` (every domain of every training source,
46
+ 682 domains). Its tasks are mostly 1–2 steps: navigation, site search, man pages, RFC / package search, a shop's search, page 2 and
47
+ sort-by-price. Suite A still fails `books-page2` (0/3), Google Flights (0/3) and is flaky on two search tasks.
48
+
49
+ **Data leak found and removed.** `dagger_cases.jsonl` (the "177 on-policy DAgger corrections" in the table below, 331 cases by
50
+ now) came from running the Qwen teacher on the suite itself: 152 of its cases are suite-A goals, often with the teacher's *wrong*
51
+ label (e.g. "Go to page 2 of the catalogue" → click the first book), oversampled ×5. Every checkpoint from v10 to v14s was trained on
52
+ it, so **all suite-A numbers in this README, including v10s's 62 %, are contaminated** (and `books-page2` failing 0/3 is partly
53
+ the model faithfully reproducing a wrong label). Suite B is clean. From v15s on, `build_items.py` drops every DAgger case and every
54
+ case recorded on a suite A/B start page.
55
+
56
+ **What changed in the harness** (`code/jev-ultrafast.patch`, applies to jev-ultrafast `1231850`). Half of the original suite
57
+ failures were harness bugs, not model errors:
58
+ - a `PRESS_ENTER` control, offered while a non-empty text field is focused (arXiv's search overlay has no submit button);
59
+ - elements covered by an unrelated element (modals, overlays, banners) are no longer offered; a target covered by its own ancestor
60
+ is clicked through;
61
+ - observation retries while the document is navigating; a choice that fails 3× is excluded, as is the same action repeated on the
62
+ same URL (reload loops);
63
+ - an optional sub-goal planner (`JEV_PLANNER=1`: the text model splits the task once, DONE advances to the next sub-goal, a
64
+ text-model check rejects a sub-goal DONE the page does not show).
65
+ Server side: wide choices are split into chunks above 60 options (a 160-link page gave each label ~4 tokens and a flat
66
+ distribution), and a one-option choice no longer crashes the fast path.
67
+
68
+ **What changed in the data** (all collected in the real browser, no suite pages):
69
+ - `rollouts2.py`: scripted search → `PRESS_ENTER`/submit → DONE, "open the article about X", scroll-to-next-page, scroll-then-click,
70
+ `<select>` with intent-style goals ("Sort by price: low to high."), type-then-pick-a-suggestion; 2.3k cases on 206 sites.
71
+ - `convert_nnetnav.py`: 8.9k steps from [stanfordnlp/nnetnav-live](https://huggingface.co/datasets/stanfordnlp/nnetnav-live)
72
+ (element tables capped at 45, held out by site).
73
+ - target lists sampled to the server's chunk width (≤ 40) and final-round width (2–6) so labels are never truncated in training.
74
+
75
+ **Where it breaks: long horizons.** On held-out synthetic forms (below) v14s ends flight and hotel searches after 1–2 steps (DONE
76
+ too early) or loops. Jev's own Google Flights run needs 11 actions: one-way, type origin → pick the suggestion, type destination →
77
+ pick the suggestion, open the calendar, pick the day, Done, Search.
78
+
79
+ **In progress: v15s** (clean retrain from the base, no DAgger, no suite pages) adds:
80
+ - `code/finetune/webgym/`: a local synthetic web environment (flight / hotel search forms, shop listings) with randomized widget
81
+ implementations — autocomplete comboboxes inline or behind a trigger button, month-grid date pickers with Done/Apply, radio /
82
+ segmented / native / custom dropdowns, steppers and popups, cookie banners, forms pushed below the fold. A scripted expert
83
+ reads the page's own state, acts through jev's observations (so the format is exactly what the agent sees), and records each
84
+ step twice: under the full task and under the current sub-goal, plus a *verified* sub-goal DONE whenever a sub-goal is
85
+ satisfied. 12 % harmless detours teach recovery (including going back after a wrong submission). 1,408 successful episodes,
86
+ 32k cases; seeds `900000 + 10·i` are held out for `eval_gym.py`.
87
+ - `annotate_subgoals.py`: Mind2Web trajectories segmented into planner-style sub-goals by the local Qwen
88
+ (trajectory-conditioned, Plan-and-Act style), 5.1k sub-goal-conditioned steps. Sub-goal DONE labels come only from webgym,
89
+ where they are checked against page state.
90
+ Results will be added here when the run finishes.
91
+
92
  ## What changed relative to the original laya
93
 
94
  | | original laya (typed-decisions) | this repo |
 
99
  | latency per browser step (3 questions, 30–65 candidates) | 50–200 ms | 41–50 ms (v10), **17–23 ms** (v10s / v11s) |
100
  | backbone | ModernBERT-large 421M | v10: same; v10s / v11s: mmBERT-base 322M |
101
  | input format | jev's state verbatim (element table as JSON inside the state, truncated by the 1024-token window) | **format v2/v3**: elements live only in the option list (full label + role + current value), state keeps title / URL / history / 1.2–1.5k chars of text, `head_max_len` 512 → 768 |
102
+ | training data | LocalLLaMA/typed-decisions | 5,244 reverse-generated goals on 421 crawled pages (Qwen writes "the goal a user would state to need this element"), 700 real DONE states (clicks actually executed), 659 step-2 negatives, [Mind2Web](https://huggingface.co/datasets/osunlp/Mind2Web) train (7,296 steps, candidates re-rendered as an element table), 177 on-policy DAgger corrections (later found to contain suite-A tasks, see the progress update) |
103
  | training | — | laya's RLCD recipe (noisy-logit policy gradient + soft CE), single GPU, no gradient checkpointing, 4 epochs (~2 h for v10, ~1 h for v10s), post-hoc temperature |
104
  | inference | HF eager + autocast | optional TileLang fast path ([PR #25 to laya](https://github.com/NandhaKishorM/laya/pull/25)): fused GEMM/GEGLU/LayerNorm/RoPE, sliding-window flash attention, bf16-resident weights, CUDA graphs — 4–5× lower per-call latency, identical answers |
105
 
 
134
  ## Files
135
 
136
  ```
137
+ v14s/ mmBERT-base 322M, format v3, head_max_len 768 (best: suite B 100 %; serve with chunk threshold 60)
138
  v10/ ModernBERT-large 421M, format v2, head_max_len 768 (best held-out top-1)
139
  v10s/ mmBERT-base 322M, format v3, head_max_len 768 (17–23 ms per step; best on the live suite)
140
  v11s/ v10s data + 682 scripted scroll / search-submit / select trajectories (equivalent to v10s within noise)
141
  code/ finetune pipeline, laya systemone server, task suite, TileLang kernels, jev-ultrafast patch
142
+ results/ per-run suite JSONs and logs behind every number above (round3/: v12s–v14s, suite B, webgym baseline)
143
  ```
144
  Each checkpoint is a laya checkpoint directory (`model.safetensors`, `encoder/`, `tokenizer/`, `rl_agent_config.json`); the config records
145
  `laya_fmt` and `head_max_len_train` so the server applies the matching input format automatically.
code/apps/browser_suite.py CHANGED
@@ -41,8 +41,9 @@ TASKS = [
41
  lambda u, t, x: "/tag/love" in u),
42
  ("hn-past", "https://news.ycombinator.com/", "Open the 'past' page (front pages from previous days).",
43
  lambda u, t, x: "/front" in u),
44
- ("ddg-search", "https://duckduckgo.com/", "Search for 'tilelang github' and show the results.",
45
- lambda u, t, x: "q=" in u and "tilelang" in u.lower()),
 
46
  ("arxiv-search", "https://arxiv.org/", "Search arXiv for 'flash attention' papers and show the results list.",
47
  lambda u, t, x: "search" in u and "flash" in u.lower()),
48
  ("flights", "https://www.google.com/travel/flights?hl=en", "Find one-way flights from Zurich to London on September 28, 2026, for one adult in economy. Stop when matching flight options are visible.",
 
41
  lambda u, t, x: "/tag/love" in u),
42
  ("hn-past", "https://news.ycombinator.com/", "Open the 'past' page (front pages from previous days).",
43
  lambda u, t, x: "/front" in u),
44
+ # NOTE: DuckDuckGo (all front ends), Bing, Ecosia and Startpage block headless Chromium (bot pages); Marginalia does not.
45
+ ("web-search", "https://search.marginalia.nu/", "Search for 'tilelang github' and show the results.",
46
+ lambda u, t, x: "query=" in u and "tilelang" in u.lower()),
47
  ("arxiv-search", "https://arxiv.org/", "Search arXiv for 'flash attention' papers and show the results list.",
48
  lambda u, t, x: "search" in u and "flash" in u.lower()),
49
  ("flights", "https://www.google.com/travel/flights?hl=en", "Find one-way flights from Zurich to London on September 28, 2026, for one adult in economy. Stop when matching flight options are visible.",
code/apps/browser_suite_b.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Held-out suite B: 18 tasks on sites that appear in NO training source (crawl, rollouts, Mind2Web, NNetNav; checked
2
+ against finetune/out/train_domains.json at start). Same runner and services as apps/browser_suite.py.
3
+
4
+ python apps/browser_suite_b.py [name-filter] REPEATS=3 SUITE_OUT=... for repeated runs
5
+ """
6
+ import json, os, sys, time
7
+ from urllib.parse import urlparse
8
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
9
+ from browser_suite import run # noqa: E402 (sets up the jev env vars)
10
+
11
+ TASKS = [
12
+ # navigation
13
+ ("sqlite-download", "https://www.sqlite.org/", "Go to the Download page.", lambda u, t, x: "download.html" in u),
14
+ ("haskell-downloads", "https://www.haskell.org/", "Go to the Downloads page.", lambda u, t, x: "/downloads" in u),
15
+ ("zig-download", "https://ziglang.org/", "Open the download page.", lambda u, t, x: "/download" in u),
16
+ ("openbsd-faq", "https://www.openbsd.org/", "Open the FAQ.", lambda u, t, x: "faq" in u.lower()),
17
+ ("nginx-download", "https://nginx.org/", "Go to the download page.", lambda u, t, x: "download" in u),
18
+ ("xkcd-archive", "https://xkcd.com/", "Open the archive of all comics.", lambda u, t, x: "/archive" in u),
19
+ ("elixir-install", "https://elixir-lang.org/", "Open the installation instructions.", lambda u, t, x: "install" in u),
20
+ ("prometheus-download", "https://prometheus.io/", "Go to the Download page.", lambda u, t, x: "/download" in u),
21
+ ("ocaml-install", "https://ocaml.org/", "Open the page that explains how to install OCaml.", lambda u, t, x: "install" in u),
22
+ # site search
23
+ ("rosetta-quicksort", "https://rosettacode.org/wiki/Rosetta_Code", "Search Rosetta Code for 'quicksort'.",
24
+ lambda u, t, x: "quicksort" in u.lower() or "quicksort" in t.lower()),
25
+ ("arch-man-grep", "https://man.archlinux.org/", "Look up the manual page for 'grep'.", lambda u, t, x: "grep" in u.lower()),
26
+ ("debian-man-tar", "https://manpages.debian.org/", "Look up the manual page for 'tar'.", lambda u, t, x: "tar" in urlparse(u).path.lower() + urlparse(u).query.lower()),
27
+ ("rfc-http-semantics", "https://www.rfc-editor.org/search/rfc_search.php", "Search for RFCs about 'HTTP semantics' and show the results.",
28
+ lambda u, t, x: "semantics" in u.lower()),
29
+ ("nixos-ripgrep", "https://search.nixos.org/packages", "Search for the package 'ripgrep'.", lambda u, t, x: "ripgrep" in u.lower()),
30
+ ("ocaml-pkg-yojson", "https://ocaml.org/", "Search OCaml packages for 'yojson'.", lambda u, t, x: "yojson" in u.lower()),
31
+ ("shop-search-jacket", "https://www.scrapingcourse.com/ecommerce/", "Search the shop for 'jacket'.", lambda u, t, x: "s=jacket" in u.lower()),
32
+ # listing
33
+ ("shop-page2", "https://www.scrapingcourse.com/ecommerce/", "Go to page 2 of the products.", lambda u, t, x: "page/2" in u),
34
+ ("shop-sort-price", "https://www.scrapingcourse.com/ecommerce/", "Sort the products by price, from low to high.",
35
+ lambda u, t, x: "orderby=price" in u and "price-desc" not in u),
36
+ ]
37
+
38
+ if __name__ == "__main__":
39
+ dom = lambda u: urlparse(u).netloc.lower().removeprefix("www.")
40
+ try:
41
+ seen = set(json.load(open(os.path.join(os.path.dirname(__file__), "..", "finetune", "out", "train_domains.json"))))
42
+ leak = sorted({dom(u) for _, u, _, _ in TASKS} & seen)
43
+ print("held-out check:", "OK, no suite-B domain appears in training data" if not leak else f"LEAK {leak}", flush=True)
44
+ except FileNotFoundError:
45
+ print("held-out check skipped (no finetune/out/train_domains.json)", flush=True)
46
+ flt = sys.argv[1] if len(sys.argv) > 1 else ""
47
+ repeats = int(os.environ.get("REPEATS", "1"))
48
+ rows = []
49
+ for name, url, goal, check in TASKS:
50
+ if flt and flt not in name: continue
51
+ for rep in range(repeats):
52
+ ok, steps, status, wall, final = run(name, url, goal, check)
53
+ rows.append((name, ok, steps, status, wall))
54
+ print(f"{'PASS' if ok else 'FAIL'} {name:20s} steps={steps:2d} status={status:9s} {wall:5.1f}s {final[:70]}", flush=True)
55
+ n = sum(r[1] for r in rows)
56
+ print(f"\n== {n}/{len(rows)} passed ({100*n/len(rows):.0f}%, {repeats} run(s) per task) | median wall {sorted(r[4] for r in rows)[len(rows)//2]:.1f}s")
57
+ per = {}
58
+ for r in rows: per.setdefault(r[0], []).append(r[1])
59
+ print(" per task: " + " ".join(f"{k}={sum(v)}/{len(v)}" for k, v in per.items()))
60
+ json.dump([dict(zip(("name", "pass", "steps", "status", "wall"), r)) for r in rows], open(os.environ.get("SUITE_OUT", "/tmp/suite_b.json"), "w"), indent=1)
code/apps/browser_trace.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Run suite tasks (by name filter) with a per-step trace: operation, target label, typed text, page change, url.
2
+ python apps/browser_trace.py [name-filter] [max_steps=12]
3
+ """
4
+ import json, os, sys, time
5
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
6
+ from browser_suite import TASKS, Agent
7
+ flt = sys.argv[1] if len(sys.argv) > 1 else ""; max_steps = int(sys.argv[2]) if len(sys.argv) > 2 else 12
8
+ for name, url, goal, check in TASKS:
9
+ if flt and flt not in name.split(",") and flt not in name: continue
10
+ t0 = time.time(); page = None; status = "error"; err = ""
11
+ print(f"\n### {name}: {goal}", flush=True)
12
+ try:
13
+ with Agent(url, goal) as agent:
14
+ page = agent.state["page"]
15
+ print(f" start: {len(page['actions'])} actions, title={page['title'][:50]!r}", flush=True)
16
+ for state in agent.run():
17
+ status = state["status"]; page = state["page"]
18
+ h = state["history"][-1] if state["history"] else None
19
+ d = state["decisions"][-1] if state["decisions"] else None
20
+ if state.get("plan") and len(state["plan"]) > 1 and state.get("_shown_plan") is None:
21
+ state["_shown_plan"] = 1; print(" plan:", state["plan"], flush=True)
22
+ if state.get("subgoals_done") and state.get("_shown_sg") != state["subgoals_done"]:
23
+ state["_shown_sg"] = state["subgoals_done"]; print(f" -- sub-goal {state['subgoals_done']} done, now: {state['goal']!r}", flush=True)
24
+ if h and d and h["step"] == len(state["history"]):
25
+ tp = d.get("target_probabilities") or {}
26
+ top = sorted(tp.items(), key=lambda kv: -kv[1])[:3]
27
+ print(f" step {h['step']:2d} {d['operation']:10s} p_op={d['operation_probabilities'].get(d['operation'],0):.2f} "
28
+ f"target={h['action'][:60]!r} text={h['text']!r} changed={h['page_changed']} -> {page['url'][:80]}", flush=True)
29
+ if len(state["history"]) >= max_steps: break
30
+ if status in ("done", "blocked"):
31
+ d = state["decisions"][-1] if state["decisions"] else None
32
+ print(f" final decision: {status} p={d['operation_probabilities'].get(d['operation'],0) if d else 0:.2f}", flush=True)
33
+ time.sleep(1.5)
34
+ try: page = agent.browser.observe(screenshot=False)
35
+ except Exception: pass
36
+ except Exception as e:
37
+ status = f"error:{type(e).__name__}"; err = str(e)[:200]
38
+ ok = bool(page and check(page["url"], page["title"], page.get("text", "")))
39
+ print(f" => {'PASS' if ok else 'FAIL'} status={status} {err} url={(page or {}).get('url','')[:90]} wall={time.time()-t0:.1f}s", flush=True)
code/finetune/annotate_subgoals.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Sub-goal annotation of real trajectories (Plan-and-Act style), with the SAME planner prompt the agent uses at run time.
2
+
3
+ python finetune/annotate_subgoals.py finetune/out/m2w_cases.jsonl finetune/out/m2w_sub_cases.jsonl [max_tasks=0] [workers=12]
4
+
5
+ Per task (grouped by task_id, steps ordered by history length):
6
+ local Qwen (TEXT_MODEL_BASE_URL) segments the recorded steps, in order, into sub-goals written in the run-time
7
+ planner's style (trajectory-conditioned, so plan and steps agree).
8
+ Emits, per step, a copy of the case with goal = its sub-goal (same gold). With EMIT_DONE=1 it also emits, at every
9
+ boundary, the next step's page with goal = the finished sub-goal and gold = DONE. Single-sub-goal tasks are skipped.
10
+ """
11
+ import json, os, sys, threading
12
+ from collections import defaultdict
13
+ from concurrent.futures import ThreadPoolExecutor
14
+ sys.path.insert(0, "/home/ckl/projects/S/jev-ultrafast")
15
+ import importlib.util
16
+ _spec = importlib.util.spec_from_file_location("jq", "/home/ckl/projects/S/jev-ultrafast/jev_ultrafast/questions.py")
17
+ jq = importlib.util.module_from_spec(_spec); _spec.loader.exec_module(jq)
18
+ import httpx
19
+
20
+ URL = os.environ.get("TEXT_MODEL_BASE_URL", "http://127.0.0.1:30000/v1").rstrip("/") + "/chat/completions"
21
+ MODEL = os.environ.get("TEXT_MODEL", "Qwen/Qwen3-8B-AWQ")
22
+ CLIENT = httpx.Client(timeout=120, trust_env=False) # local server: never through a proxy
23
+ # segment boundaries are right most of the time but not always; a wrong boundary turns into a wrong DONE label, so
24
+ # sub-goal DONE cases come only from webgym (verified by page state) unless EMIT_DONE=1
25
+ EMIT_DONE = os.environ.get("EMIT_DONE") == "1"
26
+
27
+ SEGMENT = """You annotate a recorded browser trajectory with the sub-goals a planner would have written for it.
28
+ Split the recorded steps, in their recorded order, into consecutive segments; each segment is one sub-goal.
29
+ Write each sub-goal as an instruction for the part of the task those steps accomplish, in the task's own words: name
30
+ what is set and repeat the value (patterns: "Set the <thing> to <value>", "Search for <query> and show the results",
31
+ "Sort the results by <order>", "Open <item>"). Steps that only open a menu or a picker belong to the sub-goal they
32
+ serve; a sub-goal ends with the step that actually commits its value. A task done in one go is one segment.
33
+ Return JSON {"segments": [{"subgoal": "...", "last_step": k}, ...]} where last_step is the 0-based index of the segment's
34
+ last step; last_step values increase and the final one is the last step index."""
35
+
36
+
37
+ def chat(system, user, max_tokens=400):
38
+ r = CLIENT.post(URL, json={"model": MODEL, "max_tokens": max_tokens, "temperature": 0, "response_format": {"type": "json_object"},
39
+ "chat_template_kwargs": {"enable_thinking": False},
40
+ "messages": [{"role": "system", "content": system}, {"role": "user", "content": user}]})
41
+ r.raise_for_status()
42
+ return json.loads(r.json()["choices"][0]["message"]["content"])
43
+
44
+
45
+ def step_repr(c):
46
+ t = f" '{c['history'][-1]['text']}'" if False else ""
47
+ lab = (c.get("label") or "")[:80]
48
+ return f"{c['gold_op']} {lab}".strip()
49
+
50
+
51
+ def annotate(task_cases):
52
+ goal = task_cases[0]["goal"]
53
+ steps = [step_repr(c) for c in task_cases]
54
+ # typed / selected values are only visible in the next case's history; attach them for context
55
+ for i, c in enumerate(task_cases[:-1]):
56
+ h = task_cases[i + 1]["history"][-1] if task_cases[i + 1]["history"] else None
57
+ if h and h.get("text") and c["gold_op"] in ("TYPE_TEXT", "SELECT"):
58
+ steps[i] += f" = '{h['text']}'"
59
+ r = chat(SEGMENT, json.dumps({"task": goal, "steps": [f"{i}: {s}" for i, s in enumerate(steps)]}, ensure_ascii=False), max_tokens=600)
60
+ segs = r.get("segments") or []
61
+ plan, a, start = [], [None] * len(task_cases), 0
62
+ for sg in segs:
63
+ try:
64
+ last = int(sg["last_step"]); text = str(sg["subgoal"]).strip()
65
+ except Exception:
66
+ return None
67
+ if not text or last < start or last >= len(task_cases):
68
+ return None
69
+ for k in range(start, last + 1): a[k] = len(plan)
70
+ plan.append(text); start = last + 1
71
+ if start != len(task_cases) or len(plan) < 2:
72
+ return None
73
+ return plan, a
74
+
75
+
76
+ def main():
77
+ src, dst = sys.argv[1], sys.argv[2]
78
+ max_tasks = int(sys.argv[3]) if len(sys.argv) > 3 else 0
79
+ workers = int(sys.argv[4]) if len(sys.argv) > 4 else 12
80
+ by = defaultdict(list)
81
+ for l in open(src):
82
+ c = json.loads(l); by[c.get("task_id") or c["goal"]].append(c)
83
+ tasks = [sorted(v, key=lambda c: len(c["history"])) for v in by.values()]
84
+ tasks = [t for t in tasks if len(t) >= 2]
85
+ if max_tasks: tasks = tasks[:max_tasks]
86
+ lock = threading.Lock(); stats = {"tasks": 0, "skipped": 0, "sub": 0, "done": 0, "err": 0}
87
+ out = open(dst, "w")
88
+
89
+ def work(tc):
90
+ try:
91
+ r = annotate(tc)
92
+ except Exception:
93
+ with lock: stats["err"] += 1
94
+ return
95
+ if r is None:
96
+ with lock: stats["skipped"] += 1
97
+ return
98
+ plan, a = r
99
+ rows = []
100
+ for i, c in enumerate(tc):
101
+ rows.append({**c, "goal": plan[a[i]], "skill": "m2w@sub", "plan": plan, "sub_index": a[i]})
102
+ if EMIT_DONE and i > 0 and a[i] > a[i - 1]:
103
+ rows.append({**c, "goal": plan[a[i - 1]], "gold_op": "DONE", "gold_id": "DONE", "kind": "done", "label": "",
104
+ "skill": "subgoal_done", "plan": plan, "sub_index": a[i - 1]})
105
+ with lock:
106
+ for r_ in rows: out.write(json.dumps(r_, ensure_ascii=False) + "\n")
107
+ stats["tasks"] += 1; stats["sub"] += sum(r_["skill"] == "m2w@sub" for r_ in rows); stats["done"] += sum(r_["skill"] == "subgoal_done" for r_ in rows)
108
+ if stats["tasks"] % 50 == 0: print(" ", stats, flush=True)
109
+
110
+ with ThreadPoolExecutor(workers) as ex:
111
+ list(ex.map(work, tasks))
112
+ out.close()
113
+ print("done", stats, "->", dst)
114
+
115
+
116
+ if __name__ == "__main__":
117
+ main()
code/finetune/build_items.py CHANGED
@@ -2,7 +2,7 @@
2
 
3
  python finetune/build_items.py out/pages.jsonl out/cases.jsonl out/
4
  """
5
- import json, os, sys
6
  import torch
7
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
8
  from common_ft import build_request, gold_for
@@ -11,6 +11,8 @@ from laya.common import QTYPES, build_sequence, render_options
11
 
12
  MAX_LEN, HEAD_MAX_LEN = 1024, int(os.environ.get('LAYA_HEAD', '512'))
13
  EVAL_EVERY = 5 # pages with index % 5 == 0 are held out
 
 
14
 
15
 
16
  def main():
@@ -24,18 +26,31 @@ def main():
24
  items, n_skip, ev = [], 0, []
25
  import hashlib
26
  STOPS = [" Stop when it is open.", " Stop once that page is visible.", " Then stop.", " Finish when it has loaded.", ""]
 
 
 
 
 
 
 
 
27
  for c in cases:
 
 
 
 
28
  if c["kind"] == "done" and "page_obj" not in c:
29
  continue # template DONE cases leak phrasing; real ones come from make_done_cases.py
30
  page = c.get("page_obj") or pages[c["page"]]
31
  h = int(hashlib.md5(c["goal"].encode()).hexdigest(), 16)
32
- goal = c["goal"] + STOPS[h % len(STOPS)]
 
33
  c = {**c, "goal": goal}
34
  state, questions, targets, controls = build_request(page, goal, c.get("history", []))
35
  gop, gidx = gold_for(c, targets, controls)
36
  if gop is None:
37
  n_skip += 1; continue
38
- held = (hashlib.md5(c["website"].encode()).digest()[0] % EVAL_EVERY == 0) if c.get("source") == "mind2web" else (c["page"] % EVAL_EVERY == 0)
39
  if held:
40
  ev.append({**c, "gold_index": gidx}); continue
41
  golds = {"operation": gop}
@@ -43,6 +58,17 @@ def main():
43
  golds[gop.lower() + "_target"] = gidx
44
  for qid, gold in golds.items():
45
  q = questions[qid]; keys = list(q["criteria"])
 
 
 
 
 
 
 
 
 
 
 
46
  target = [1.0 if k == gold else 0.0 for k in keys]
47
  qq = {"t": "choice", "ins": json.dumps(q["instructions"]), "crit": q["criteria"]}
48
  seq, markers = build_sequence(tok, state, qq, MAX_LEN, HEAD_MAX_LEN)
@@ -50,13 +76,18 @@ def main():
50
  n_skip += 1; continue
51
  item = {"ids": seq, "markers": markers, "qtype": QTYPES["choice"], "target": target, "label": keys.index(gold), "qid": qid, "gold_op": gop}
52
  # class balance: CLICK dominates the operation question, so repeat the rare operations
53
- reps = {"DONE": 4, "TYPE_TEXT": 3, "SELECT": 3}.get(gop, 1) if qid == "operation" else 1
54
  if c.get("source") == "dagger":
55
- reps *= 5 # on-policy teacher corrections from real tasks: few but exactly where the policy fails
 
 
 
 
56
  items.extend([item] * reps)
57
  torch.save(items, os.path.join(out, "train_items.pt"))
58
  with open(os.path.join(out, "eval_cases.jsonl"), "w") as f:
59
  for c in ev: f.write(json.dumps(c, ensure_ascii=False) + "\n")
 
60
  lens = [len(i["ids"]) for i in items]
61
  import collections
62
  print("operation label counts:", dict(collections.Counter(i["gold_op"] for i in items if i["qid"] == "operation")))
 
2
 
3
  python finetune/build_items.py out/pages.jsonl out/cases.jsonl out/
4
  """
5
+ import json, random, os, sys
6
  import torch
7
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
8
  from common_ft import build_request, gold_for
 
11
 
12
  MAX_LEN, HEAD_MAX_LEN = 1024, int(os.environ.get('LAYA_HEAD', '512'))
13
  EVAL_EVERY = 5 # pages with index % 5 == 0 are held out
14
+ MAX_TARGETS = int(os.environ.get('MAX_TARGETS', '40'))
15
+ FINAL_P = float(os.environ.get('FINAL_P', '0.2')) # share of target items built like the server's final round
16
 
17
 
18
  def main():
 
26
  items, n_skip, ev = [], 0, []
27
  import hashlib
28
  STOPS = [" Stop when it is open.", " Stop once that page is visible.", " Then stop.", " Finish when it has loaded.", ""]
29
+ # evaluation hygiene: never train on a suite task's start page (suite A and B start URLs), whatever the source
30
+ import re as _re
31
+ def _norm(u): return (u or "").split("#")[0].rstrip("/").replace("://www.", "://")
32
+ suite_urls = set()
33
+ for f in ("apps/browser_suite.py", "apps/browser_suite_b.py"):
34
+ if os.path.exists(f):
35
+ suite_urls |= {_norm(u) for u in _re.findall(r'\("[a-z0-9-]+", "(https?://[^"]+)"', open(f).read())}
36
+ n_suite = 0
37
  for c in cases:
38
+ if _norm(c.get("url") or (c.get("page_obj") or {}).get("url")) in suite_urls or (c.get("page", -1) >= 0 and _norm(pages[c["page"]]["url"]) in suite_urls):
39
+ n_suite += 1; continue
40
+ if c.get("source") == "dagger":
41
+ continue
42
  if c["kind"] == "done" and "page_obj" not in c:
43
  continue # template DONE cases leak phrasing; real ones come from make_done_cases.py
44
  page = c.get("page_obj") or pages[c["page"]]
45
  h = int(hashlib.md5(c["goal"].encode()).hexdigest(), 16)
46
+ is_sub = str(c.get("skill", "")).endswith("@sub") or c.get("skill") == "subgoal_done"
47
+ goal = c["goal"] + ("" if is_sub or c.get("source") == "webgym" else STOPS[h % len(STOPS)])
48
  c = {**c, "goal": goal}
49
  state, questions, targets, controls = build_request(page, goal, c.get("history", []))
50
  gop, gidx = gold_for(c, targets, controls)
51
  if gop is None:
52
  n_skip += 1; continue
53
+ held = (hashlib.md5(c["website"].encode()).digest()[0] % EVAL_EVERY == 0) if c.get("source") in ("mind2web", "nnetnav") else (c["page"] % EVAL_EVERY == 0)
54
  if held:
55
  ev.append({**c, "gold_index": gidx}); continue
56
  golds = {"operation": gop}
 
58
  golds[gop.lower() + "_target"] = gidx
59
  for qid, gold in golds.items():
60
  q = questions[qid]; keys = list(q["criteria"])
61
+ rs = random.Random(h + len(keys) + len(qid))
62
+ if qid != "operation" and len(keys) > 8 and rs.random() < FINAL_P:
63
+ width = rs.randint(2, 6) # the server's final round: only the chunk winners (2-6 options)
64
+ else:
65
+ width = MAX_TARGETS
66
+ if qid != "operation" and len(keys) > width:
67
+ # inference splits wide choices into chunks of <= MAX_TARGETS (systemone_server MAXOPT); train on the same
68
+ # widths, so option labels are never truncated to a few tokens: gold + a random sample, page order kept
69
+ keep = set(rs.sample([k for k in keys if k != gold], width - 1)) | {gold}
70
+ keys = [k for k in keys if k in keep]
71
+ q = {**q, "criteria": {k: q["criteria"][k] for k in keys}}
72
  target = [1.0 if k == gold else 0.0 for k in keys]
73
  qq = {"t": "choice", "ins": json.dumps(q["instructions"]), "crit": q["criteria"]}
74
  seq, markers = build_sequence(tok, state, qq, MAX_LEN, HEAD_MAX_LEN)
 
76
  n_skip += 1; continue
77
  item = {"ids": seq, "markers": markers, "qtype": QTYPES["choice"], "target": target, "label": keys.index(gold), "qid": qid, "gold_op": gop}
78
  # class balance: CLICK dominates the operation question, so repeat the rare operations
79
+ reps = {"DONE": 4, "TYPE_TEXT": 3, "SELECT": 3, "PRESS_ENTER": 4, "SCROLL_DOWN": 2}.get(gop, 1) if qid == "operation" else 1
80
  if c.get("source") == "dagger":
81
+ reps *= 5
82
+ if c.get("source") == "webgym" or str(c.get("skill", "")).endswith("@sub"):
83
+ reps = 1 # webgym already pairs every DONE with its "keep going" twin; no op-level oversampling
84
+ if c.get("source") == "rollout":
85
+ reps *= 3 # scripted scroll / search-submit / select trajectories: the skills the model lacked # on-policy teacher corrections from real tasks: few but exactly where the policy fails
86
  items.extend([item] * reps)
87
  torch.save(items, os.path.join(out, "train_items.pt"))
88
  with open(os.path.join(out, "eval_cases.jsonl"), "w") as f:
89
  for c in ev: f.write(json.dumps(c, ensure_ascii=False) + "\n")
90
+ print(f"dropped {n_suite} cases on suite start pages; dagger cases are never used")
91
  lens = [len(i["ids"]) for i in items]
92
  import collections
93
  print("operation label counts:", dict(collections.Counter(i["gold_op"] for i in items if i["qid"] == "operation")))
code/finetune/common_ft.py CHANGED
@@ -69,7 +69,7 @@ def gold_for(case, targets, controls):
69
  op = case["gold_op"]
70
  if op == "DONE":
71
  return "DONE", None
72
- if op in ("SCROLL_DOWN", "SCROLL_UP", "WAIT"): # page-level controls: operation question only
73
  return (op, None) if op in {k.upper() for k in controls} else (None, None)
74
  for index, a in targets.get(op, {}).items():
75
  if a["id"] == case["gold_id"]:
 
69
  op = case["gold_op"]
70
  if op == "DONE":
71
  return "DONE", None
72
+ if op in ("SCROLL_DOWN", "SCROLL_UP", "WAIT", "PRESS_ENTER"): # page-level controls: operation question only
73
  return (op, None) if op in {k.upper() for k in controls} else (None, None)
74
  for index, a in targets.get(op, {}).items():
75
  if a["id"] == case["gold_id"]:
code/finetune/convert_nnetnav.py ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """NNetNav-live (stanfordnlp/nnetnav-live, WebArena-style accessibility-tree trajectories on live sites) -> jev-format cases.
2
+
3
+ python finetune/convert_nnetnav.py finetune/data/nnetnav/train.jsonl finetune/out/nnetnav_cases.jsonl [max_cases=20000] [seed=3]
4
+
5
+ Each record is one step: the user message holds OBSERVATION (accessibility tree), URL, OBJECTIVE, PREVIOUS ACTIONS; the
6
+ assistant message ends with ```action```. Mapping to jev's action space:
7
+ click [id] -> CLICK on the element (clickable link/button/checkbox/... nodes)
8
+ type [id] [text] [enter] -> TYPE_TEXT on the element (textbox/searchbox/combobox); the implicit Enter is dropped
9
+ scroll [down|up] -> SCROLL_DOWN / SCROLL_UP (page-level controls)
10
+ stop [...] -> DONE
11
+ hover / press / goto / go_back / new_tab / tab_focus / close_tab -> skipped
12
+ The element table is the tree's interactive nodes in document order (labels = accessible name, role kept), the page text
13
+ is the tree's static text. Cases carry `website` so build_items.py can hold out whole sites, and `source: "nnetnav"`.
14
+ Sampling: the action mix is capped so CLICK does not swamp TYPE_TEXT / SCROLL / DONE (see CAP).
15
+ """
16
+ import json, random, re, sys
17
+ from collections import Counter
18
+ from urllib.parse import urlparse
19
+
20
+ NODE = re.compile(r"^\s*\[(\d+)\] (\w+) '((?:[^'\\]|\\.)*)'(.*)$")
21
+ STATIC = re.compile(r"^\s*StaticText '((?:[^'\\]|\\.)*)'")
22
+ ACTION = re.compile(r"```\s*(\w+)(?:\s+\[([^\]]*)\])?(?:\s+\[((?:[^\]\\]|\\.)*)\])?(?:\s+\[([^\]]*)\])?\s*```")
23
+ PREV = re.compile(r"^(\d+): (.*)$")
24
+ CLICK_ROLES = {"link", "button", "checkbox", "radio", "menuitem", "tab", "option", "switch", "menuitemcheckbox", "menuitemradio", "treeitem", "combobox", "listbox", "img", "image", "gridcell", "cell", "row", "listitem", "heading", "generic", "LabelText", "DisclosureTriangle", "Details", "Summary", "slider", "spinbutton"}
25
+ FILL_ROLES = {"textbox", "searchbox", "textarea"}
26
+ ROLE_OUT = {"img": "image", "image": "image", "LabelText": "label", "DisclosureTriangle": "button", "Summary": "button", "Details": "group", "combobox": "combobox"}
27
+ CAP = {"CLICK": 0.55, "TYPE_TEXT": 0.2, "SCROLL_DOWN": 0.1, "SCROLL_UP": 0.03, "DONE": 0.12}
28
+ TEXT_CHARS = 6000
29
+ MAX_ELEMENTS = 45
30
+
31
+
32
+ def parse_obs(user):
33
+ """-> (tree_lines, url, objective, previous action strings)"""
34
+ m = re.search(r"OBSERVATION:\n(.*?)\nURL: (\S+)\nOBJECTIVE: (.*?)\nPREVIOUS ACTIONS:\n(.*)$", user, re.S)
35
+ if not m:
36
+ return None
37
+ tree, url, objective, prev = m.groups()
38
+ prevs = [PREV.match(l).group(2).strip() for l in prev.strip().splitlines() if PREV.match(l)]
39
+ prevs = [p for p in prevs if p and p != "None"]
40
+ return tree.splitlines(), url, objective.strip(), prevs
41
+
42
+
43
+ def elements_of(tree_lines):
44
+ """Interactive nodes -> jev actions; static text -> page text. Returns (actions, text, title, id->action)."""
45
+ actions, texts, by_id, title = [], [], {}, ""
46
+ for line in tree_lines:
47
+ if line.startswith("RootWebArea"):
48
+ m = re.match(r"RootWebArea '((?:[^'\\]|\\.)*)'", line)
49
+ title = m.group(1) if m else ""
50
+ continue
51
+ sm = STATIC.match(line)
52
+ if sm:
53
+ texts.append(sm.group(1)); continue
54
+ nm = NODE.match(line)
55
+ if not nm:
56
+ continue
57
+ nid, role, name, rest = nm.groups()
58
+ name = name.replace("\\'", "'").strip()
59
+ clickable = "clickable" in rest
60
+ if role in FILL_ROLES or (role == "combobox" and "hasPopup" not in rest and "autocomplete" in rest):
61
+ val = re.search(r"value='((?:[^'\\]|\\.)*)'", rest)
62
+ a = {"id": f"e{len(actions)+1}", "node": int(nid), "kind": "fill", "label": name or role, "role": "textbox" if role == "textarea" else role,
63
+ "value": val.group(1) if val else ""}
64
+ actions.append(a); by_id[nid] = a
65
+ texts.append(name)
66
+ continue
67
+ if role in CLICK_ROLES and (clickable or role in ("link", "button", "checkbox", "radio", "tab", "menuitem", "option")):
68
+ if not name and role in ("generic", "listitem", "row", "cell", "gridcell", "heading"):
69
+ continue
70
+ a = {"id": f"e{len(actions)+1}", "node": int(nid), "kind": "click", "label": name or role, "role": ROLE_OUT.get(role, role)}
71
+ for attr in ("checked", "expanded", "selected"):
72
+ mm = re.search(attr + r"=(\w+)", rest)
73
+ if mm:
74
+ a[attr] = mm.group(1) == "True"
75
+ actions.append(a); by_id[nid] = a
76
+ texts.append(name)
77
+ continue
78
+ if name and role in ("heading", "paragraph", "cell", "gridcell", "LabelText", "caption", "time", "code", "emphasis", "strong"):
79
+ texts.append(name)
80
+ return actions, "\n".join(t for t in texts if t)[:TEXT_CHARS], title, by_id
81
+
82
+
83
+ def parse_action(assistant):
84
+ m = ACTION.findall(assistant)
85
+ if not m:
86
+ return None
87
+ verb, a1, a2, a3 = m[-1]
88
+ return verb.lower(), a1, a2.replace("\\]", "]") if a2 else a2, a3
89
+
90
+
91
+ def history_of(prevs, tree_by_id_stack):
92
+ """jev history from the textual previous actions. Labels come from 'where [id] is ...' suffixes when present."""
93
+ hist = []
94
+ for p in prevs[-10:]:
95
+ pa = ACTION.findall("```" + p + "```")
96
+ if not pa:
97
+ continue
98
+ verb, a1, a2, _ = pa[0]
99
+ verb = verb.lower()
100
+ where = re.search(r"where \[\d+\] is (\w+) '((?:[^'\\]|\\.)*)'", p)
101
+ label = where.group(2) if where else (f"[{a1}]" if a1 else "")
102
+ if verb == "click":
103
+ hist.append({"action": label, "kind": "click", "text": None, "page_changed": None})
104
+ elif verb == "type":
105
+ hist.append({"action": label, "kind": "fill", "text": a2, "page_changed": None})
106
+ elif verb == "scroll":
107
+ hist.append({"action": "Scroll down" if "down" in a1 else "Scroll up", "kind": "scroll", "text": None, "page_changed": False})
108
+ elif verb == "hover":
109
+ hist.append({"action": label, "kind": "click", "text": None, "page_changed": None})
110
+ else:
111
+ hist.append({"action": p[:60], "kind": verb, "text": None, "page_changed": None})
112
+ return hist
113
+
114
+
115
+ def main():
116
+ src, dst = sys.argv[1], sys.argv[2]
117
+ max_cases = int(sys.argv[3]) if len(sys.argv) > 3 else 20000
118
+ rng = random.Random(int(sys.argv[4]) if len(sys.argv) > 4 else 3)
119
+ counts, kept, skipped = Counter(), [], Counter()
120
+ with open(src) as f:
121
+ for line in f:
122
+ try:
123
+ d = json.loads(line)
124
+ except Exception:
125
+ skipped["json"] += 1; continue
126
+ msgs = d.get("messages") or []
127
+ user = next((m["content"] for m in msgs if m["role"] == "user"), None)
128
+ asst = next((m["content"] for m in reversed(msgs) if m["role"] == "assistant"), None) or d.get("output", "")
129
+ if not user or not asst:
130
+ skipped["msgs"] += 1; continue
131
+ obs = parse_obs(user)
132
+ act = parse_action(asst)
133
+ if not obs or not act:
134
+ skipped["parse"] += 1; continue
135
+ tree, url, objective, prevs = obs
136
+ verb, a1, a2, a3 = act
137
+ actions, text, title, by_id = elements_of(tree)
138
+ if len(actions) < 2:
139
+ skipped["few_elements"] += 1; continue
140
+ # keep the element table within laya's option budget (head_max_len 768 ~ 45 options, like the Mind2Web
141
+ # conversion): the gold element plus a random sample of the others, document order preserved
142
+ if len(actions) > MAX_ELEMENTS:
143
+ gold_a = by_id.get(a1) if verb in ("click", "type") else None
144
+ pool = [a for a in actions if a is not gold_a]
145
+ keep = set(id(a) for a in rng.sample(pool, MAX_ELEMENTS - (1 if gold_a else 0)))
146
+ actions = [a for a in actions if id(a) in keep or a is gold_a]
147
+ for j, a in enumerate(actions):
148
+ a["id"] = f"e{j+1}"
149
+ # page-level controls, as jev would offer them (scroll offered unless the tree is tiny)
150
+ if len(actions) > 8:
151
+ actions.append({"id": "scroll_down", "kind": "scroll", "label": "Scroll down", "delta": 560})
152
+ if any(p.startswith("scroll [down") for p in prevs):
153
+ actions.append({"id": "scroll_up", "kind": "scroll", "label": "Scroll up", "delta": -560})
154
+ actions.append({"id": "wait", "kind": "wait", "label": "Wait for the page to update"})
155
+ if verb == "click" and a1 in by_id and by_id[a1]["kind"] == "click":
156
+ gop, gid, kind, label = "CLICK", by_id[a1]["id"], "click", by_id[a1]["label"]
157
+ elif verb == "type" and a1 in by_id and by_id[a1]["kind"] == "fill":
158
+ gop, gid, kind, label = "TYPE_TEXT", by_id[a1]["id"], "fill", by_id[a1]["label"]
159
+ elif verb == "scroll" and "down" in (a1 or "") and any(a["id"] == "scroll_down" for a in actions):
160
+ gop, gid, kind, label = "SCROLL_DOWN", "scroll_down", "scroll", "Scroll down"
161
+ elif verb == "scroll" and "up" in (a1 or "") and any(a["id"] == "scroll_up" for a in actions):
162
+ gop, gid, kind, label = "SCROLL_UP", "scroll_up", "scroll", "Scroll up"
163
+ elif verb == "stop":
164
+ gop, gid, kind, label = "DONE", "DONE", "done", ""
165
+ else:
166
+ skipped["verb:" + verb] += 1; continue
167
+ site = urlparse(url).netloc
168
+ kept.append({"page": -1, "url": url, "title": title, "goal": objective, "gold_op": gop, "gold_id": gid, "kind": kind, "label": label,
169
+ "history": history_of(prevs, None), "source": "nnetnav", "website": site, "skill": "nnetnav",
170
+ "page_obj": {"url": url, "title": title, "text": text, "actions": actions}})
171
+ counts[gop] += 1
172
+ print("parsed", len(kept), dict(counts), "skipped", dict(skipped))
173
+ # cap the mix: sample per operation up to CAP share of max_cases
174
+ rng.shuffle(kept)
175
+ out, taken = [], Counter()
176
+ for c in kept:
177
+ if taken[c["gold_op"]] < CAP[c["gold_op"]] * max_cases:
178
+ out.append(c); taken[c["gold_op"]] += 1
179
+ with open(dst, "w") as f:
180
+ for c in out:
181
+ f.write(json.dumps(c, ensure_ascii=False) + "\n")
182
+ print("wrote", len(out), dict(taken), "->", dst)
183
+
184
+
185
+ if __name__ == "__main__":
186
+ main()
code/finetune/infra.sh ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # infra.sh start_chrome | start_sglang [model] | start_s1 <ckpt_dir> [maxopt] | stop_s1 | stop_all | status
3
+ S=${INFRA_DIR:-/tmp/laya-infra}; mkdir -p $S
4
+ L=~/projects/S/laya
5
+ case "$1" in
6
+ start_chrome)
7
+ curl -s -m 3 http://127.0.0.1:9222/json/version >/dev/null && { echo chrome up; exit 0; }
8
+ nohup chromium --headless=new --remote-debugging-port=9222 --user-data-dir=$S/chrome-profile --window-size=1120,780 --no-first-run --lang=en-US --accept-lang=en-US,en about:blank >$S/chrome.log 2>&1 &
9
+ sleep 3; curl -s -m 3 http://127.0.0.1:9222/json/version | head -c 120; echo ;;
10
+ start_sglang)
11
+ M=${2:-Qwen/Qwen3-8B-AWQ}
12
+ curl -s -m 3 http://127.0.0.1:30000/health >/dev/null && { echo sglang up; exit 0; }
13
+ cd $L; HF_HUB_OFFLINE=1 nohup ~/sglang-venv/bin/python -m sglang.launch_server --model-path $M --port 30000 --mem-fraction-static ${SGL_MEM:-0.35} --context-length 8192 --reasoning-parser qwen3 >$S/sglang.log 2>&1 &
14
+ echo "sglang starting (pid $!)";;
15
+ start_s1)
16
+ bash $0 stop_s1
17
+ cd $L; source env.sh; nohup env ESCALATE_TAU=${ESCALATE_TAU:-0} .venv/bin/python apps/systemone_server.py 8791 "$2" ${3:-999} >$S/s1.log 2>&1 &
18
+ for i in $(seq 1 90); do curl -s -m 2 http://127.0.0.1:8791/ >/dev/null 2>&1 && { echo "s1 up ($2)"; exit 0; }; sleep 2; done; echo "s1 FAILED"; tail -5 $S/s1.log;;
19
+ stop_chrome) pkill -f 'remote-debugging-port=922[2]' 2>/dev/null; sleep 2;;
20
+ stop_s1) pkill -f 'apps/systemone_serve[r]' 2>/dev/null; sleep 1;;
21
+ stop_all) bash $0 stop_s1; pkill -f 'sglang.launch_serve[r]' 2>/dev/null; pkill -f 'remote-debugging-port=9222' 2>/dev/null; echo stopped;;
22
+ status) for p in 9222 8791 30000; do (ss -ltn | grep -q ":$p ") && echo "$p up" || echo "$p down"; done; nvidia-smi --query-gpu=memory.used --format=csv,noheader;;
23
+ esac
code/finetune/rollouts2.py ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Scripted multi-step trajectories in the real browser, round 2: the skills the 16-task suite still fails on.
2
+
3
+ search : TYPE_TEXT query -> PRESS_ENTER (or CLICK a visible submit button) -> DONE on the results page
4
+ open : "Open the article/page about X": TYPE_TEXT -> PRESS_ENTER -> (CLICK the matching result if a results
5
+ list appears) -> DONE
6
+ next-page : "Go to page 2 / next page": SCROLL_DOWN until a next/2/older link is visible -> CLICK -> DONE
7
+ scroll : goal names an element only visible after scrolling -> SCROLL_DOWN -> CLICK -> DONE
8
+ select : choose an option of a <select> -> SELECT -> DONE
9
+
10
+ python finetune/rollouts2.py sites.txt out/rollout2_cases.jsonl [max_sites=400] [seed=7]
11
+
12
+ sites.txt: one URL per line (a "#" starts a comment). Suite URLs are skipped. Goals are templated (varied phrasing),
13
+ no LLM needed. Every case stores the observed page (page_obj) so build_items.py can rebuild the exact request.
14
+ Runs against the headless Chromium on BU_CDP_URL (default 127.0.0.1:9222) and needs the patched jev-ultrafast
15
+ (press_enter control, observe retry).
16
+ """
17
+ import json, os, random, re, sys, time
18
+ sys.path.insert(0, "/home/ckl/projects/S/jev-ultrafast")
19
+ os.environ.setdefault("BU_CDP_URL", "http://127.0.0.1:9222")
20
+ from jev_ultrafast.browser import Browser, StalePage
21
+
22
+ SUITE_URLS = {"https://en.wikipedia.org/wiki/Main_Page", "https://news.ycombinator.com/", "https://github.com/tile-ai/tilelang", "https://www.python.org/",
23
+ "https://books.toscrape.com/", "https://the-internet.herokuapp.com/dropdown", "https://the-internet.herokuapp.com/checkboxes",
24
+ "https://quotes.toscrape.com/", "https://duckduckgo.com/", "https://search.marginalia.nu/", "https://arxiv.org/",
25
+ "https://www.google.com/travel/flights?hl=en"}
26
+ SEARCH_T = ["Search for '{q}'.", "Search for '{q}' and show the results.", "Look up '{q}' using the search box and show the results.",
27
+ "Find results for '{q}'.", "Use the site search to find '{q}'.", "Search this site for {q}.", "Run a search for \"{q}\".",
28
+ "Show me search results for {q}.", "Search {site} for '{q}' and show the results list."]
29
+ OPEN_T = ["Open the page about {q}.", "Open the article about {q}.", "Go to the entry for '{q}'.", "Find and open '{q}'.",
30
+ "Open '{q}' on this site.", "Search for {q} and open the matching page."]
31
+ NEXT_T = ["Go to page 2.", "Go to page 2 of the list.", "Show the next page of results.", "Open the next page.", "Go to the next page of the catalogue.",
32
+ "Show page 2.", "Move on to the second page.", "Open the second page of the listing."]
33
+ SCROLL_T = ["Open '{x}'.", "I want to see '{x}', take me there.", "Go to {x}.", "Find and click '{x}' on this page.",
34
+ "Open the '{x}' link further down the page.", "Navigate to '{x}'.", "Click '{x}'."]
35
+ INTENT_T = ["{o}.", "{o}, please.", "I want to {ol}.", "Change it to {o}.", "Show everything with {f} set to {o}.", "Use '{o}'.", "Switch to {o}."]
36
+ SELECT_T = ["Select '{o}' in the '{f}' dropdown.", "Choose {o} for {f}.", "Set '{f}' to '{o}'.", "Pick the option '{o}'.", "In the {f} dropdown, select {o}."]
37
+ QUERIES = ["python tutorial", "flash attention", "climate change", "rust async", "linear algebra", "tilelang", "modernbert", "black holes",
38
+ "sourdough bread", "gpu kernels", "machine learning", "world war ii", "electric cars", "photosynthesis", "quantum computing",
39
+ "jazz history", "docker compose", "typescript generics", "renewable energy", "albert einstein", "marie curie", "solar system",
40
+ "coffee", "yoga", "kubernetes", "chess openings", "vitamin d", "roman empire", "neural networks", "recycling"]
41
+ OPEN_Q = ["Albert Einstein", "Python programming language", "Marie Curie", "Photosynthesis", "Black hole", "Isaac Newton", "Quantum computing",
42
+ "Rust programming language", "Great Wall of China", "Ada Lovelace", "Solar System", "Machine learning", "Docker", "Jazz", "Coffee"]
43
+
44
+
45
+ def lab(a): return a["label"].split(" → ")[0].strip()
46
+ def site_of(url): return re.sub(r"^www\.", "", url.split("/")[2])
47
+ def case(page, goal, gold_op, gold_id, kind, label, hist, tag):
48
+ return {"page": -1, "url": page["url"], "title": page["title"], "goal": goal, "gold_op": gold_op, "gold_id": gold_id, "kind": kind, "label": label,
49
+ "history": hist, "source": "rollout", "skill": tag, "page_obj": {k: page[k] for k in ("url", "title", "text", "actions")}}
50
+ def hist_of(a, text=None, changed=True): return {"action": a["label"], "kind": a["kind"], "text": text, "page_changed": changed}
51
+ def find(page, pred): return next((a for a in page["actions"] if pred(a)), None)
52
+ def ctl(page, cid): return find(page, lambda a: a["id"] == cid)
53
+ def observe(b, tries=8):
54
+ for i in range(tries):
55
+ try: return b.observe(screenshot=False)
56
+ except StalePage:
57
+ if i == tries - 1: raise
58
+ time.sleep(0.5)
59
+ def act(b, a, page, text=None, wait=0.5):
60
+ b.act(a, page, text=text); time.sleep(wait); return observe(b)
61
+ def changed(p, q): return p["url"] != q["url"] or p["title"] != q["title"]
62
+ def search_field(page):
63
+ return find(page, lambda a: a["kind"] == "fill" and re.search(r"search|query|find|keyword|suche|rechercher|buscar|cerca|zoek|検索|搜索", a["label"], re.I)) \
64
+ or find(page, lambda a: a["kind"] == "fill" and a.get("role") in ("searchbox",))
65
+ def submit_button(page, q):
66
+ return find(page, lambda a: a["kind"] == "click" and a.get("role") == "button" and re.search(r"^(search|go|submit|find|suchen|rechercher|buscar)\b", lab(a), re.I))
67
+
68
+
69
+ def do_search(b, page, rng, out, site):
70
+ field = search_field(page)
71
+ if not field: return 0
72
+ q = rng.choice(QUERIES); goal = rng.choice(SEARCH_T).format(q=q, site=site)
73
+ out.write(json.dumps(case(page, goal, "TYPE_TEXT", field["id"], "fill", field["label"], [], "search"), ensure_ascii=False) + "\n"); n = 1
74
+ p2 = act(b, field, page, text=q)
75
+ pe, sub = ctl(p2, "press_enter"), submit_button(p2, q)
76
+ if not pe and not sub: return n
77
+ # after typing the goal is not done: submit. Enter is the default; a visible submit button is used 30% of the time
78
+ use_click = bool(sub) and (not pe or rng.random() < 0.3)
79
+ if use_click:
80
+ out.write(json.dumps(case(p2, goal, "CLICK", sub["id"], "click", sub["label"], [hist_of(field, q, False)], "search"), ensure_ascii=False) + "\n")
81
+ step = hist_of(sub); p3 = act(b, sub, p2, wait=1.0)
82
+ else:
83
+ out.write(json.dumps(case(p2, goal, "PRESS_ENTER", "press_enter", "key", pe["label"], [hist_of(field, q, False)], "search"), ensure_ascii=False) + "\n")
84
+ step = hist_of(pe); p3 = act(b, pe, p2, wait=1.0)
85
+ n += 1
86
+ if changed(p3, p2) or q.split()[0].lower() in p3["text"].lower()[:3000]:
87
+ out.write(json.dumps(case(p3, goal, "DONE", "DONE", "done", "", [hist_of(field, q, False), step], "search"), ensure_ascii=False) + "\n"); n += 1
88
+ return n
89
+
90
+
91
+ def do_open(b, page, rng, out, site):
92
+ field = search_field(page)
93
+ if not field: return 0
94
+ q = rng.choice(OPEN_Q); goal = rng.choice(OPEN_T).format(q=q)
95
+ out.write(json.dumps(case(page, goal, "TYPE_TEXT", field["id"], "fill", field["label"], [], "open"), ensure_ascii=False) + "\n"); n = 1
96
+ p2 = act(b, field, page, text=q)
97
+ pe = ctl(p2, "press_enter")
98
+ if not pe: return n
99
+ out.write(json.dumps(case(p2, goal, "PRESS_ENTER", "press_enter", "key", pe["label"], [hist_of(field, q, False)], "open"), ensure_ascii=False) + "\n"); n += 1
100
+ p3 = act(b, pe, p2, wait=1.2)
101
+ if not changed(p3, p2): return n
102
+ hist = [hist_of(field, q, False), hist_of(pe)]
103
+ words = [w.lower() for w in q.split() if len(w) > 2]
104
+ tl = p3["title"].lower()
105
+ title_hit = all(w in tl for w in words[:2]) and not re.search(r"search|results|suche|recherche", tl)
106
+ if title_hit: # landed on the page itself (Wikipedia-style direct hit)
107
+ out.write(json.dumps(case(p3, goal, "DONE", "DONE", "done", "", hist, "open"), ensure_ascii=False) + "\n"); return n + 1
108
+ # a results list: click the result whose label matches the query best
109
+ res = [a for a in p3["actions"] if a["kind"] == "click" and a.get("role") == "link" and sum(w in a["label"].lower() for w in words) >= max(1, len(words) - 1)]
110
+ if not res: return n
111
+ tgt = res[0]
112
+ out.write(json.dumps(case(p3, goal, "CLICK", tgt["id"], "click", tgt["label"], hist, "open"), ensure_ascii=False) + "\n"); n += 1
113
+ try:
114
+ p4 = act(b, tgt, p3, wait=1.2)
115
+ if changed(p4, p3):
116
+ out.write(json.dumps(case(p4, goal, "DONE", "DONE", "done", "", hist + [hist_of(tgt)], "open"), ensure_ascii=False) + "\n"); n += 1
117
+ except Exception: pass
118
+ return n
119
+
120
+
121
+ NEXT_RE = re.compile(r"^(next\b.*|[»›>→]+\s*next.*|2|page 2|go to page 2|older( posts| entries| \d+)?|older\s*[»›>→]|more|more results|show more|load more|see more|[›»]|next »|next page.*|nächste.*|suivant.*|siguiente.*|次へ|下一页)$", re.I)
122
+ def next_link(page):
123
+ return find(page, lambda a: a["kind"] == "click" and a.get("role") in ("link", "button") and NEXT_RE.match(lab(a)) is not None)
124
+
125
+ def do_next(b, page, rng, out, site):
126
+ if not page.get("scroll") or page["scroll"]["height"] < 1000: return 0
127
+ goal = rng.choice(NEXT_T); hist = []; p = page; n = 0; buf = []
128
+ for _ in range(int(os.environ.get("MAX_SCROLLS", "10"))):
129
+ nl = next_link(p)
130
+ if nl: break
131
+ sd = ctl(p, "scroll_down")
132
+ if not sd: return 0
133
+ buf.append(json.dumps(case(p, goal, "SCROLL_DOWN", "scroll_down", "scroll", "Scroll down", list(hist), "next"), ensure_ascii=False) + "\n")
134
+ p = act(b, sd, p, wait=0.4); hist.append(hist_of(sd, changed=False))
135
+ else:
136
+ return 0 # no next-page link on this page: the scroll steps would teach scrolling for nothing
137
+ out.writelines(buf); n = len(buf) # (a visible next link without scrolling still teaches the 'next' semantics)
138
+ out.write(json.dumps(case(p, goal, "CLICK", nl["id"], "click", nl["label"], list(hist), "next"), ensure_ascii=False) + "\n"); n += 1
139
+ try:
140
+ p2 = act(b, nl, p, wait=1.0)
141
+ if changed(p2, p):
142
+ out.write(json.dumps(case(p2, goal, "DONE", "DONE", "done", "", hist + [hist_of(nl)], "next"), ensure_ascii=False) + "\n"); n += 1
143
+ except Exception: pass
144
+ return n
145
+
146
+
147
+ def do_scroll(b, page, rng, out, site):
148
+ if not page.get("scroll") or page["scroll"]["height"] < 1300: return 0
149
+ before = {a["label"] for a in page["actions"] if a["kind"] == "click"}
150
+ sd = ctl(page, "scroll_down")
151
+ if not sd: return 0
152
+ p2 = act(b, sd, page, wait=0.4)
153
+ new = [a for a in p2["actions"] if a["kind"] == "click" and a["label"] not in before and 3 <= len(lab(a)) <= 60 and a.get("role") in ("link", "button")]
154
+ if not new: return 0
155
+ n = 0
156
+ for tgt in rng.sample(new, min(2, len(new))):
157
+ goal = rng.choice(SCROLL_T).format(x=lab(tgt))
158
+ out.write(json.dumps(case(page, goal, "SCROLL_DOWN", "scroll_down", "scroll", "Scroll down", [], "scroll"), ensure_ascii=False) + "\n")
159
+ out.write(json.dumps(case(p2, goal, "CLICK", tgt["id"], "click", tgt["label"], [hist_of(sd, changed=False)], "scroll"), ensure_ascii=False) + "\n"); n += 2
160
+ tgt = new[0]
161
+ try:
162
+ p3 = act(b, tgt, p2, wait=0.8)
163
+ if changed(p3, p2):
164
+ goal = rng.choice(SCROLL_T).format(x=lab(tgt))
165
+ out.write(json.dumps(case(p3, goal, "DONE", "DONE", "done", "", [hist_of(sd, changed=False), hist_of(tgt)], "scroll"), ensure_ascii=False) + "\n"); n += 1
166
+ except Exception: pass
167
+ return n
168
+
169
+
170
+ def do_select(b, page, rng, out, site):
171
+ sels = [a for a in page["actions"] if a["kind"] == "select" and a.get("value") and a["value"] != a.get("current_value")]
172
+ if not sels: return 0
173
+ by_field = {}
174
+ for a in sels: by_field.setdefault(a["node"], []).append(a)
175
+ node, opts = rng.choice(list(by_field.items()))
176
+ opt = rng.choice(opts); f = lab(opt); o = opt["label"].split(" → ")[-1].strip()
177
+ # half the goals state the intent in the option's own words ("Sort by price: low to high."), the way users phrase it
178
+ if rng.random() < 0.5 and 3 <= len(o) <= 60:
179
+ goal = rng.choice(INTENT_T).format(o=o, ol=o[0].lower() + o[1:], f=f)
180
+ else:
181
+ goal = rng.choice(SELECT_T).format(o=o, f=f)
182
+ out.write(json.dumps(case(page, goal, "SELECT", opt["id"], "select", opt["label"], [], "select"), ensure_ascii=False) + "\n")
183
+ try:
184
+ p2 = act(b, opt, page, wait=0.3)
185
+ out.write(json.dumps(case(p2, goal, "DONE", "DONE", "done", "", [hist_of(opt, changed=False)], "select"), ensure_ascii=False) + "\n"); return 2
186
+ except Exception: return 1
187
+
188
+
189
+
190
+ CITIES = ["Zurich", "London", "Paris", "Berlin", "Tokyo", "New York", "Madrid", "Rome", "Amsterdam", "Vienna", "Munich", "Singapore",
191
+ "Sydney", "Toronto", "Chicago", "Barcelona", "Lisbon", "Prague", "Dublin", "Seoul", "Bangkok", "Istanbul", "Oslo", "Helsinki"]
192
+ AUTO_T = ["Set the destination to {x}.", "Choose {x} as the departure city.", "Set where from to {x}.", "Set where to to {x}.",
193
+ "Pick {x} from the suggestions.", "Enter {x} and select it from the list.", "Search for {x} and choose the matching suggestion.",
194
+ "Select {x} as the location."]
195
+
196
+ def is_combo(a):
197
+ return a["kind"] == "fill" and (a.get("role") in ("combobox", "searchbox") or re.search(r"from|to\b|where|destination|origin|city|location|airport|search", a["label"], re.I))
198
+
199
+ def do_autocomplete(b, page, rng, out, site):
200
+ """TYPE_TEXT a partial value into a combobox -> CLICK the suggestion that appeared -> DONE."""
201
+ field = find(page, is_combo)
202
+ if not field: return 0
203
+ travel = re.search(r"from|to\b|where|destination|origin|city|location|airport|hotel|stay", field["label"], re.I)
204
+ full = rng.choice(CITIES) if travel else rng.choice(QUERIES)
205
+ typed = full if rng.random() < 0.6 else full[:max(3, len(full) // 2)]
206
+ goal = (rng.choice(AUTO_T) if travel else rng.choice(["Search for {x} and choose the matching suggestion.",
207
+ "Type {x} and pick it from the suggestions.", "Find {x} using the search suggestions."])).format(x=full)
208
+ before = {a["label"] for a in page["actions"] if a["kind"] == "click"}
209
+ p2 = act(b, field, page, text=typed, wait=1.2)
210
+ key = full.split()[0].lower()[:5]
211
+ sugg = [a for a in p2["actions"] if a["kind"] == "click" and a["label"] not in before and key in a["label"].lower()
212
+ and a.get("role") in ("option", "listitem", "link", "button", "menuitem", "gridcell", "treeitem")]
213
+ if not sugg: return 0
214
+ tgt = sugg[0]
215
+ out.write(json.dumps(case(page, goal, "TYPE_TEXT", field["id"], "fill", field["label"], [], "autocomplete"), ensure_ascii=False) + "\n")
216
+ out.write(json.dumps(case(p2, goal, "CLICK", tgt["id"], "click", tgt["label"], [hist_of(field, typed, True)], "autocomplete"), ensure_ascii=False) + "\n")
217
+ n = 2
218
+ try:
219
+ p3 = act(b, tgt, p2, wait=1.0)
220
+ out.write(json.dumps(case(p3, goal, "DONE", "DONE", "done", "", [hist_of(field, typed, True), hist_of(tgt)], "autocomplete"), ensure_ascii=False) + "\n"); n += 1
221
+ except Exception: pass
222
+ return n
223
+
224
+ SKILLS = (("autocomplete", do_autocomplete), ("search", do_search), ("open", do_open), ("next", do_next), ("scroll", do_scroll), ("select", do_select))
225
+ if os.environ.get("SKILLS"): # SKILLS=next,search : run only these skills
226
+ SKILLS = tuple(x for x in SKILLS if x[0] in os.environ["SKILLS"].split(","))
227
+
228
+ def main():
229
+ sites = [l.strip() for l in open(sys.argv[1]) if l.strip() and not l.startswith("#")]
230
+ out_f = sys.argv[2]; mx = int(sys.argv[3]) if len(sys.argv) > 3 else 400; seed = int(sys.argv[4]) if len(sys.argv) > 4 else 7
231
+ rng = random.Random(seed); rng.shuffle(sites)
232
+ if len(sys.argv) > 5: # "i/n": this worker takes every n-th site starting at i (parallel workers)
233
+ i, n = map(int, sys.argv[5].split("/")); sites = sites[i::n]
234
+ counts = {k: 0 for k, _ in SKILLS}; fails = {}; done = 0; t0 = time.time()
235
+ with open(out_f, "w") as out:
236
+ for url in sites:
237
+ if done >= mx: break
238
+ if url in SUITE_URLS: continue
239
+ site = site_of(url)
240
+ for skill, fn in SKILLS:
241
+ try:
242
+ b = Browser(url)
243
+ try:
244
+ page = observe(b); n = fn(b, page, rng, out, site)
245
+ finally:
246
+ b.close()
247
+ counts[skill] += n
248
+ except Exception as e:
249
+ fails[type(e).__name__] = fails.get(type(e).__name__, 0) + 1
250
+ done += 1
251
+ if done % 20 == 0: print(f" {done} sites {time.time()-t0:5.0f}s {counts} fails={fails}", flush=True)
252
+ print("wrote", counts, "fails", fails, "->", out_f)
253
+
254
+ if __name__ == "__main__":
255
+ main()
code/finetune/run_suite_v12s.sh ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # After v12s training: 16-task suite x3 for v12s and v10s under the patched jev harness (PRESS_ENTER, observe retry, stall guard).
3
+ cd /home/ckl/projects/S/laya; O=finetune/out; I="bash finetune/infra.sh"
4
+ until grep -q "V12S_DONE" $O/v12s.log; do sleep 60; done
5
+ pkill -f 'rollouts2[.]py' 2>/dev/null
6
+ $I start_chrome >/dev/null; SGL_MEM=0.5 $I start_sglang Qwen/Qwen3-8B-AWQ >/dev/null
7
+ until curl -s -m 3 http://127.0.0.1:30000/health >/dev/null; do sleep 5; done
8
+ for ck in laya-browser-v12s laya-browser-v10s; do
9
+ echo "== suite $ck x3 (patched harness)"
10
+ $I start_s1 $PWD/$O/$ck 999 >/dev/null
11
+ (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suite_h2_$ck.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task")
12
+ done
13
+ echo SUITE_V12S_DONE
code/finetune/run_v12s.sh ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # v12s: v10s recipe (mmBERT-base, format v3, head 768) + rollouts2 (search/open/next-page/scroll/select with PRESS_ENTER) + NNetNav-live.
3
+ # usage: bash finetune/run_v12s.sh [epochs=4] (stop sglang first: training needs the GPU)
4
+ cd /home/ckl/projects/S/laya && source env.sh
5
+ export LAYA_BASE=$(ls -d ~/.cache/huggingface/hub/models--convaiinnovations--laya/snapshots/*/multilingual | head -1)
6
+ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True CKPT=${CKPT:-0} COMPILE=0 LAYA_FMT=v3 LAYA_HEAD=768
7
+ P=.venv/bin/python; O=finetune/out; EP=${1:-4}
8
+ cat $O/rollout2_cases.*.jsonl > $O/rollout2_cases.jsonl 2>/dev/null
9
+ echo "== rollout2 cases: $(wc -l < $O/rollout2_cases.jsonl) nnetnav cases: $(wc -l < $O/nnetnav_cases.jsonl 2>/dev/null || echo 0)"
10
+ echo "== build v12s"
11
+ $P finetune/build_items.py $O/pages.jsonl $O/cases.jsonl $O/ $O/done_cases.jsonl $O/step2_cases.jsonl $O/m2w_cases.jsonl $O/dagger_cases.jsonl $O/rollout_cases.jsonl $O/rollout2_cases.jsonl $O/nnetnav_cases.jsonl 2>&1 | grep -v Warn | tail -5
12
+ echo "== train v12s ($EP epochs)"; $P finetune/train.py $O/train_items.pt $O/laya-browser-v12s $EP 2>&1 | grep --line-buffered -E "=== epoch|saved|Error|Traceback|loss"
13
+ echo "== calibrate"; $P finetune/calibrate.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/laya-browser-v12s 2>&1 | grep -vE "TileLang|Warn|warn|Fetch"
14
+ echo "== eval v12s"; $P finetune/eval.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/laya-browser-v12s 2>&1 | grep -vE "TileLang|Warn|warn|Fetch"
15
+ echo V12S_DONE
code/finetune/run_v13s.sh ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # v13s: continue from v12s for 1-2 epochs on v12s data + next-page/select rollouts, with target lists sampled to the
3
+ # server's chunk width (MAX_TARGETS=40) and final-round width (2-6, FINAL_P=0.2). Then suites A and B.
4
+ cd /home/ckl/projects/S/laya && source env.sh
5
+ export LAYA_BASE=$PWD/finetune/out/laya-browser-v12s
6
+ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True CKPT=${CKPT:-1} COMPILE=0 LAYA_FMT=v3 LAYA_HEAD=768 MAX_TARGETS=40 FINAL_P=0.2
7
+ P=.venv/bin/python; O=finetune/out; EP=${1:-1}; I="bash finetune/infra.sh"
8
+ pkill -f 'systemone_serve[r]' ; pkill -f 'sglang.launch_serve[r]' ; sleep 5
9
+ cat $O/rollout2_cases.*.jsonl > $O/rollout2_cases.jsonl
10
+ echo "== rollout2 cases: $(wc -l < $O/rollout2_cases.jsonl)"
11
+ echo "== build v13s"
12
+ $P finetune/build_items.py $O/pages.jsonl $O/cases.jsonl $O/ $O/done_cases.jsonl $O/step2_cases.jsonl $O/m2w_cases.jsonl $O/dagger_cases.jsonl $O/rollout_cases.jsonl $O/rollout2_cases.jsonl $O/nnetnav_cases.jsonl 2>&1 | grep -v Warn | tail -3
13
+ echo "== train v13s ($EP epochs from v12s)"; $P finetune/train.py $O/train_items.pt $O/laya-browser-v13s $EP 2>&1 | grep --line-buffered -E "=== epoch|saved|Error|Traceback"
14
+ echo "== calibrate"; $P finetune/calibrate.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/laya-browser-v13s 2>&1 | grep -vE "TileLang|Warn|warn|Fetch"
15
+ echo "== eval"; $P finetune/eval.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/laya-browser-v13s 2>&1 | grep -vE "TileLang|Warn|warn|Fetch|return Agent"
16
+ $I start_chrome >/dev/null; SGL_MEM=0.5 $I start_sglang Qwen/Qwen3-8B-AWQ >/dev/null
17
+ until curl -s -m 3 http://127.0.0.1:30000/health >/dev/null; do sleep 5; done
18
+ $I start_s1 $PWD/$O/laya-browser-v13s 40 >/dev/null
19
+ echo "== suite A x3 (v13s, chunk 40)"
20
+ (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteA_v13s.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task")
21
+ echo "== suite B x3 (v13s, chunk 40)"
22
+ (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteB_v13s.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite_b.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task|held-out")
23
+ echo V13S_DONE
code/finetune/run_v14s.sh ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # v14s: continue from v13s for 1-2 epochs on v12s data + next-page/select rollouts, with target lists sampled to the
3
+ # server's chunk width (MAX_TARGETS=40) and final-round width (2-6, FINAL_P=0.2). Then suites A and B.
4
+ cd /home/ckl/projects/S/laya && source env.sh
5
+ export LAYA_BASE=$PWD/finetune/out/laya-browser-v13s
6
+ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True CKPT=${CKPT:-1} COMPILE=0 LAYA_FMT=v3 LAYA_HEAD=768 MAX_TARGETS=40 FINAL_P=0.2
7
+ P=.venv/bin/python; O=finetune/out; EP=${1:-1}; I="bash finetune/infra.sh"
8
+ pkill -f 'systemone_serve[r]' ; pkill -f 'sglang.launch_serve[r]' ; sleep 5
9
+ cat $O/rollout2_cases.*.jsonl > $O/rollout2_cases.jsonl
10
+ echo "== rollout2 cases: $(wc -l < $O/rollout2_cases.jsonl)"
11
+ echo "== build v14s"
12
+ $P finetune/build_items.py $O/pages.jsonl $O/cases.jsonl $O/ $O/done_cases.jsonl $O/step2_cases.jsonl $O/m2w_cases.jsonl $O/dagger_cases.jsonl $O/rollout_cases.jsonl $O/rollout2_cases.jsonl $O/nnetnav_cases.jsonl 2>&1 | grep -v Warn | tail -3
13
+ echo "== train v14s ($EP epochs from v13s)"; $P finetune/train.py $O/train_items.pt $O/laya-browser-v14s $EP 2>&1 | grep --line-buffered -E "=== epoch|saved|Error|Traceback"
14
+ echo "== calibrate"; $P finetune/calibrate.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/laya-browser-v14s 2>&1 | grep -vE "TileLang|Warn|warn|Fetch"
15
+ echo "== eval"; $P finetune/eval.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/laya-browser-v14s 2>&1 | grep -vE "TileLang|Warn|warn|Fetch|return Agent"
16
+ $I start_chrome >/dev/null; SGL_MEM=0.5 $I start_sglang Qwen/Qwen3-8B-AWQ >/dev/null
17
+ until curl -s -m 3 http://127.0.0.1:30000/health >/dev/null; do sleep 5; done
18
+ $I start_s1 $PWD/$O/laya-browser-v14s 60 >/dev/null
19
+ echo "== suite A x3 (v14s, chunk 60)"
20
+ (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteA_v14s.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task")
21
+ echo "== suite B x3 (v14s, chunk 60)"
22
+ (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteB_v14s.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite_b.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task|held-out")
23
+ echo V14S_DONE
code/finetune/run_v15s.sh ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # v15s: CLEAN retrain from the mmBERT-base checkpoint (no DAgger data, no suite start pages) on
3
+ # crawl + DONE + step2 + Mind2Web + rollouts + rollouts2 + NNetNav + webgym (long-horizon forms/listings, sub-goal
4
+ # conditioned, verified sub-goal DONE) + Mind2Web sub-goal annotation.
5
+ # Then: suite A x3, suite B x3, webgym held-out (planner off / on), Google Flights x3 with the planner.
6
+ cd /home/ckl/projects/S/laya && source env.sh
7
+ export LAYA_BASE=$(ls -d ~/.cache/huggingface/hub/models--convaiinnovations--laya/snapshots/*/multilingual | head -1)
8
+ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True CKPT=${CKPT:-1} COMPILE=0 LAYA_FMT=v3 LAYA_HEAD=768 MAX_TARGETS=40 FINAL_P=0.2
9
+ P=.venv/bin/python; O=finetune/out; EP=${1:-3}; I="bash finetune/infra.sh"; CK=laya-browser-v15s
10
+ pkill -f 'systemone_serve[r]' ; pkill -f 'sglang.launch_serve[r]' ; sleep 5
11
+ cat $O/rollout2_cases.*.jsonl > $O/rollout2_cases.jsonl; cat $O/gym/*.jsonl > $O/gym_cases.jsonl
12
+ echo "== data: rollout2 $(wc -l < $O/rollout2_cases.jsonl) gym $(wc -l < $O/gym_cases.jsonl) m2w_sub $(wc -l < $O/m2w_sub_cases.jsonl)"
13
+ echo "== build $CK"
14
+ [ -n "$SKIP_BUILD" ] && [ -f $O/train_items.pt ] && echo " (SKIP_BUILD: reusing $O/train_items.pt)" || \
15
+ $P finetune/build_items.py $O/pages.jsonl $O/cases.jsonl $O/ $O/done_cases.jsonl $O/step2_cases.jsonl $O/m2w_cases.jsonl $O/rollout_cases.jsonl \
16
+ $O/rollout2_cases.jsonl $O/nnetnav_cases.jsonl $O/gym_cases.jsonl $O/m2w_sub_cases.jsonl 2>&1 | grep -v Warn | tail -4
17
+ echo "== train $CK ($EP epochs from base)"; $P finetune/train.py $O/train_items.pt $O/$CK $EP 2>&1 | grep --line-buffered -E "=== epoch|saved|Error|Traceback"
18
+ echo "== calibrate"; $P finetune/calibrate.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/$CK 2>&1 | grep -vE "TileLang|Warn|warn|Fetch"
19
+ echo "== eval"; $P finetune/eval.py $O/pages.jsonl $O/eval_cases.jsonl $PWD/$O/$CK 2>&1 | grep -vE "TileLang|Warn|warn|Fetch|return Agent"
20
+ $I start_chrome >/dev/null; SGL_MEM=0.5 $I start_sglang Qwen/Qwen3-8B-AWQ >/dev/null; bash finetune/webgym/serve.sh restart >/dev/null
21
+ until curl -s -m 3 http://127.0.0.1:30000/health >/dev/null; do sleep 5; done
22
+ $I start_s1 $PWD/$O/$CK 60 >/dev/null
23
+ J=../jev-ultrafast/.venv/bin/python
24
+ echo "== suite A x3"; (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteA_v15s.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task")
25
+ echo "== suite B x3"; (cd ../jev-ultrafast && REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteB_v15s.json timeout 3600 .venv/bin/python ../laya/apps/browser_suite_b.py 2>&1 | grep -E "^(PASS|FAIL)|^==|per task|held-out")
26
+ echo "== webgym held-out, planner off"; (cd ../jev-ultrafast && GYM_OUT=$PWD/../laya/$O/gym_eval_v15s.json timeout 3600 .venv/bin/python ../laya/finetune/webgym/eval_gym.py 10 flight,hotel,shop 40 2>&1 | grep -E "^(PASS|FAIL|==)")
27
+ echo "== webgym held-out, planner on"; (cd ../jev-ultrafast && JEV_PLANNER=1 GYM_OUT=$PWD/../laya/$O/gym_eval_v15s_plan.json timeout 3600 .venv/bin/python ../laya/finetune/webgym/eval_gym.py 10 flight,hotel,shop 40 2>&1 | grep -E "^(PASS|FAIL|==)")
28
+ echo "== Google Flights x3, planner on"; (cd ../jev-ultrafast && JEV_PLANNER=1 REPEATS=3 SUITE_OUT=$PWD/../laya/$O/suiteA_flights_plan_v15s.json timeout 1800 .venv/bin/python ../laya/apps/browser_suite.py flights 2>&1 | grep -E "^(PASS|FAIL)|^==")
29
+ echo V15S_DONE
code/finetune/sites.txt ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Sites with a search box and/or long lists, for finetune/rollouts2.py. Suite URLs are skipped by the script.
2
+ # wikis / reference
3
+ https://en.wikipedia.org/wiki/Special:Random
4
+ https://en.wikipedia.org/wiki/Portal:Science
5
+ https://de.wikipedia.org/wiki/Wikipedia:Hauptseite
6
+ https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal
7
+ https://es.wikipedia.org/wiki/Wikipedia:Portada
8
+ https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
9
+ https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5
10
+ https://simple.wikipedia.org/wiki/Main_Page
11
+ https://en.wiktionary.org/wiki/Wiktionary:Main_Page
12
+ https://www.wikidata.org/wiki/Wikidata:Main_Page
13
+ https://en.wikivoyage.org/wiki/Main_Page
14
+ https://commons.wikimedia.org/wiki/Main_Page
15
+ https://en.wikibooks.org/wiki/Main_Page
16
+ https://en.wikiquote.org/wiki/Main_Page
17
+ https://wiki.archlinux.org/
18
+ https://wiki.debian.org/
19
+ https://help.ubuntu.com/
20
+ https://www.wikihow.com/Main-Page
21
+ https://www.britannica.com/
22
+ https://www.merriam-webster.com/
23
+ https://dictionary.cambridge.org/
24
+ https://www.dictionary.com/
25
+ https://www.thefreedictionary.com/
26
+ https://www.etymonline.com/
27
+ https://en.wikisource.org/wiki/Main_Page
28
+ # open libraries / archives
29
+ https://archive.org/
30
+ https://openlibrary.org/
31
+ https://www.gutenberg.org/
32
+ https://www.gutenberg.org/ebooks/search/?query=science
33
+ https://scholar.archive.org/
34
+ https://www.loc.gov/
35
+ https://www.europeana.eu/en
36
+ https://digital.library.upenn.edu/books/
37
+ https://www.worldcat.org/
38
+ https://doaj.org/
39
+ https://www.biodiversitylibrary.org/
40
+ # papers / science
41
+ https://arxiv.org/list/cs.LG/recent
42
+ https://arxiv.org/abs/2205.14135
43
+ https://www.biorxiv.org/
44
+ https://www.medrxiv.org/
45
+ https://dblp.org/
46
+ https://www.semanticscholar.org/
47
+ https://openreview.net/
48
+ https://aclanthology.org/
49
+ https://journals.plos.org/plosone/
50
+ https://pubmed.ncbi.nlm.nih.gov/
51
+ https://www.ncbi.nlm.nih.gov/
52
+ https://paperswithcode.com/
53
+ https://zenodo.org/
54
+ https://figshare.com/
55
+ https://osf.io/
56
+ https://eric.ed.gov/
57
+ https://core.ac.uk/
58
+ https://www.jstor.org/
59
+ https://inspirehep.net/
60
+ https://ui.adsabs.harvard.edu/
61
+ https://mathworld.wolfram.com/
62
+ https://oeis.org/
63
+ https://www.ncbi.nlm.nih.gov/pmc/
64
+ # package registries / code
65
+ https://pypi.org/
66
+ https://pypi.org/project/requests/
67
+ https://crates.io/
68
+ https://crates.io/crates/serde
69
+ https://www.npmjs.com/
70
+ https://rubygems.org/
71
+ https://packagist.org/
72
+ https://hex.pm/
73
+ https://pub.dev/
74
+ https://hub.docker.com/
75
+ https://huggingface.co/models
76
+ https://huggingface.co/datasets
77
+ https://github.com/explore
78
+ https://github.com/search?q=tilelang&type=repositories
79
+ https://github.com/pytorch/pytorch
80
+ https://github.com/rust-lang/rust/issues
81
+ https://gitlab.com/explore
82
+ https://codeberg.org/explore/repos
83
+ https://sourceforge.net/
84
+ https://www.apache.org/
85
+ https://gitee.com/explore
86
+ https://mvnrepository.com/
87
+ https://search.maven.org/
88
+ https://cran.r-project.org/
89
+ https://www.cpan.org/
90
+ https://metacpan.org/
91
+ https://docs.rs/
92
+ https://godocs.io/
93
+ https://pkg.go.dev/
94
+ https://formulae.brew.sh/
95
+ https://repology.org/
96
+ https://packages.debian.org/
97
+ https://archlinux.org/packages/
98
+ https://launchpad.net/
99
+ # documentation
100
+ https://docs.python.org/3/
101
+ https://developer.mozilla.org/en-US/
102
+ https://doc.rust-lang.org/book/
103
+ https://doc.rust-lang.org/std/
104
+ https://go.dev/doc/
105
+ https://nodejs.org/en/docs
106
+ https://www.php.net/
107
+ https://www.ruby-lang.org/en/
108
+ https://docs.djangoproject.com/en/stable/
109
+ https://flask.palletsprojects.com/
110
+ https://numpy.org/doc/stable/
111
+ https://pandas.pydata.org/docs/
112
+ https://pytorch.org/docs/stable/index.html
113
+ https://www.tensorflow.org/api_docs
114
+ https://scikit-learn.org/stable/
115
+ https://docs.docker.com/
116
+ https://kubernetes.io/docs/home/
117
+ https://docs.readthedocs.io/en/stable/
118
+ https://readthedocs.org/
119
+ https://www.w3schools.com/
120
+ https://www.tutorialspoint.com/index.htm
121
+ https://www.geeksforgeeks.org/
122
+ https://cppreference.com/
123
+ https://en.cppreference.com/w/
124
+ https://learn.microsoft.com/en-us/docs/
125
+ https://docs.oracle.com/en/java/
126
+ https://www.postgresql.org/docs/
127
+ https://dev.mysql.com/doc/
128
+ https://redis.io/docs/
129
+ https://docs.gitlab.com/
130
+ https://git-scm.com/doc
131
+ https://www.gnu.org/manual/
132
+ https://www.kernel.org/doc/html/latest/
133
+ https://docs.ansible.com/
134
+ https://www.terraform.io/docs
135
+ https://wiki.python.org/moin/
136
+ https://devdocs.io/
137
+ https://www.freecodecamp.org/news/
138
+ https://stackoverflow.com/questions
139
+ https://askubuntu.com/
140
+ https://superuser.com/
141
+ https://unix.stackexchange.com/
142
+ https://math.stackexchange.com/
143
+ https://serverfault.com/
144
+ # news / media
145
+ https://www.bbc.com/
146
+ https://www.bbc.com/news
147
+ https://www.theguardian.com/international
148
+ https://apnews.com/
149
+ https://www.npr.org/
150
+ https://www.aljazeera.com/
151
+ https://www.dw.com/en/top-stories/s-9097
152
+ https://www.france24.com/en/
153
+ https://www.euronews.com/
154
+ https://www.cbc.ca/news
155
+ https://www.abc.net.au/news
156
+ https://www.nytimes.com/
157
+ https://www.washingtonpost.com/
158
+ https://www.economist.com/
159
+ https://www.wired.com/
160
+ https://arstechnica.com/
161
+ https://www.theverge.com/
162
+ https://techcrunch.com/
163
+ https://news.ycombinator.com/newest
164
+ https://news.ycombinator.com/ask
165
+ https://lobste.rs/
166
+ https://slashdot.org/
167
+ https://www.phoronix.com/
168
+ https://lwn.net/
169
+ https://www.zdnet.com/
170
+ https://www.engadget.com/
171
+ https://www.reuters.com/
172
+ https://www.scmp.com/
173
+ https://www.japantimes.co.jp/
174
+ https://www.thehindu.com/
175
+ https://timesofindia.indiatimes.com/
176
+ https://www.lemonde.fr/
177
+ https://www.spiegel.de/
178
+ https://elpais.com/
179
+ https://www.corriere.it/
180
+ # government / institutions
181
+ https://www.usa.gov/
182
+ https://www.gov.uk/
183
+ https://www.gov.uk/search/all
184
+ https://europa.eu/european-union/index_en
185
+ https://www.nasa.gov/
186
+ https://www.nih.gov/
187
+ https://www.cdc.gov/
188
+ https://www.who.int/
189
+ https://www.un.org/en/
190
+ https://data.gov/
191
+ https://www.census.gov/
192
+ https://www.noaa.gov/
193
+ https://www.epa.gov/
194
+ https://www.fda.gov/
195
+ https://www.canada.ca/en.html
196
+ https://www.australia.gov.au/
197
+ https://www.bundesregierung.de/breg-en
198
+ https://www.service-public.fr/
199
+ https://www.gov.cn/
200
+ https://www.esa.int/
201
+ https://www.cern.ch/
202
+ https://www.ipcc.ch/
203
+ https://www.imf.org/en/Home
204
+ https://www.worldbank.org/en/home
205
+ https://www.oecd.org/
206
+ # education
207
+ https://ocw.mit.edu/
208
+ https://www.khanacademy.org/
209
+ https://www.coursera.org/
210
+ https://www.edx.org/
211
+ https://www.mit.edu/
212
+ https://www.stanford.edu/
213
+ https://www.ox.ac.uk/
214
+ https://www.cam.ac.uk/
215
+ https://www.harvard.edu/
216
+ https://www.berkeley.edu/
217
+ https://www.tsinghua.edu.cn/
218
+ https://www.ethz.ch/en.html
219
+ https://www.utoronto.ca/
220
+ https://plato.stanford.edu/
221
+ https://www.openculture.com/
222
+ https://www.ted.com/talks
223
+ # demo / practice sites (crawler friendly)
224
+ https://books.toscrape.com/catalogue/page-2.html
225
+ https://books.toscrape.com/catalogue/category/books/mystery_3/index.html
226
+ https://quotes.toscrape.com/page/2/
227
+ https://quotes.toscrape.com/tag/humor/
228
+ https://the-internet.herokuapp.com/
229
+ https://the-internet.herokuapp.com/tables
230
+ https://the-internet.herokuapp.com/login
231
+ https://automationexercise.com/
232
+ https://automationexercise.com/products
233
+ https://www.saucedemo.com/
234
+ https://demoqa.com/
235
+ https://practice.expandtesting.com/
236
+ https://webscraper.io/test-sites/e-commerce/allinone
237
+ https://webscraper.io/test-sites/e-commerce/static
238
+ https://demo.opencart.com/
239
+ https://www.demoblaze.com/
240
+ https://magento.softwaretestingboard.com/
241
+ https://practicesoftwaretesting.com/
242
+ https://demo.nopcommerce.com/
243
+ https://www.globalsqa.com/angularJs-protractor/WebTable/
244
+ https://scrapeme.live/shop/
245
+ https://realpython.github.io/fake-jobs/
246
+ https://www.scrapethissite.com/pages/
247
+ https://parabank.parasoft.com/parabank/index.htm
248
+ https://opensource-demo.orangehrmlive.com/
249
+ # shops / catalogues / listings
250
+ https://www.ebay.com/
251
+ https://www.etsy.com/
252
+ https://www.aliexpress.com/
253
+ https://www.ikea.com/us/en/
254
+ https://www.bestbuy.com/
255
+ https://www.newegg.com/
256
+ https://www.walmart.com/
257
+ https://www.target.com/
258
+ https://www.homedepot.com/
259
+ https://www.wayfair.com/
260
+ https://www.zalando.de/
261
+ https://www.otto.de/
262
+ https://www.jd.com/
263
+ https://www.taobao.com/
264
+ https://www.rakuten.co.jp/
265
+ https://www.mercadolibre.com.ar/
266
+ https://www.thingiverse.com/
267
+ https://www.goodreads.com/
268
+ https://www.imdb.com/
269
+ https://www.rottentomatoes.com/
270
+ https://www.allrecipes.com/
271
+ https://www.bbcgoodfood.com/
272
+ https://www.epicurious.com/
273
+ https://www.foodnetwork.com/
274
+ https://www.yelp.com/
275
+ https://www.tripadvisor.com/
276
+ https://www.booking.com/
277
+ https://www.airbnb.com/
278
+ https://www.kayak.com/
279
+ https://www.skyscanner.net/
280
+ https://www.expedia.com/
281
+ https://www.craigslist.org/about/sites
282
+ https://www.autotrader.com/
283
+ https://www.zillow.com/
284
+ https://www.indeed.com/
285
+ https://www.linkedin.com/jobs/
286
+ https://www.glassdoor.com/
287
+ https://weworkremotely.com/
288
+ https://remoteok.com/
289
+ https://www.discogs.com/
290
+ https://bandcamp.com/
291
+ https://www.last.fm/
292
+ https://musicbrainz.org/
293
+ https://www.metacritic.com/
294
+ https://store.steampowered.com/
295
+ https://www.gog.com/
296
+ https://itch.io/
297
+ https://boardgamegeek.com/
298
+ https://www.chess.com/
299
+ https://lichess.org/
300
+ https://openweathermap.org/
301
+ https://www.timeanddate.com/
302
+ https://www.openstreetmap.org/
303
+ https://www.geonames.org/
304
+ https://www.flickr.com/
305
+ https://unsplash.com/
306
+ https://www.pexels.com/
307
+ https://pixabay.com/
308
+ https://fontawesome.com/
309
+ https://fonts.google.com/
310
+ https://www.reddit.com/
311
+ https://www.quora.com/
312
+ https://medium.com/
313
+ https://dev.to/
314
+ https://hashnode.com/
315
+ https://www.producthunt.com/
316
+ https://alternativeto.net/
317
+ https://www.g2.com/
318
+ https://www.capterra.com/
319
+ https://www.trustpilot.com/
320
+ https://www.kickstarter.com/
321
+ https://www.indiegogo.com/
322
+ https://www.patreon.com/
323
+ https://www.twitch.tv/
324
+ https://www.bilibili.com/
325
+ https://www.zhihu.com/
326
+ https://www.csdn.net/
327
+ https://www.douban.com/
328
+ https://www.jianshu.com/
329
+ https://www.baidu.com/
330
+ https://www.sogou.com/
331
+ https://www.so.com/
332
+ https://www.mojeek.com/
333
+ https://yandex.com/
334
+ https://www.qwant.com/
335
+ https://search.brave.com/
336
+ https://www.wolframalpha.com/
337
+ https://mathworld.wolfram.com/
338
+ https://www.khanacademy.org/math
339
+ https://www.desmos.com/
340
+ https://www.geogebra.org/
code/finetune/sites_autocomplete.txt ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ https://www.kayak.com/flights
2
+ https://www.skyscanner.net/
3
+ https://www.momondo.com/
4
+ https://www.kiwi.com/en/
5
+ https://www.expedia.com/Flights
6
+ https://www.trip.com/flights/
7
+ https://flights.ctrip.com/
8
+ https://www.qunar.com/
9
+ https://www.rome2rio.com/
10
+ https://www.booking.com/
11
+ https://www.airbnb.com/
12
+ https://www.hotels.com/
13
+ https://www.agoda.com/
14
+ https://www.trivago.com/
15
+ https://www.flightradar24.com/
16
+ https://www.lufthansa.com/
17
+ https://www.britishairways.com/
18
+ https://www.ryanair.com/
19
+ https://www.easyjet.com/
20
+ https://www.aa.com/
21
+ https://www.united.com/
22
+ https://www.delta.com/
23
+ https://www.airfrance.com/
24
+ https://www.klm.com/
25
+ https://www.emirates.com/
26
+ https://www.qatarairways.com/
27
+ https://www.sbb.ch/en
28
+ https://www.bahn.com/en
29
+ https://www.thetrainline.com/
30
+ https://www.omio.com/
31
+ https://www.flixbus.com/
32
+ https://www.openstreetmap.org/
33
+ https://www.accuweather.com/
34
+ https://weather.com/
35
+ https://www.timeanddate.com/weather/
36
+ https://www.wunderground.com/
37
+ https://de.wikipedia.org/wiki/Wikipedia:Hauptseite
38
+ https://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal
39
+ https://es.wikipedia.org/wiki/Wikipedia:Portada
40
+ https://en.wiktionary.org/wiki/Wiktionary:Main_Page
41
+ https://www.wikidata.org/wiki/Wikidata:Main_Page
42
+ https://commons.wikimedia.org/wiki/Main_Page
43
+ https://developer.mozilla.org/en-US/
44
+ https://www.imdb.com/
45
+ https://www.goodreads.com/
46
+ https://www.yelp.com/
47
+ https://www.tripadvisor.com/
48
+ https://www.zillow.com/
49
+ https://www.indeed.com/
50
+ https://www.glassdoor.com/
51
+ https://www.ikea.com/us/en/
52
+ https://www.bestbuy.com/
53
+ https://www.etsy.com/
54
+ https://www.ebay.com/
55
+ https://www.amazon.com/
56
+ https://www.walmart.com/
57
+ https://www.target.com/
58
+ https://www.homedepot.com/
59
+ https://www.baidu.com/
60
+ https://www.bilibili.com/
61
+ https://www.zhihu.com/
62
+ https://www.douban.com/
63
+ https://www.jd.com/
64
+ https://www.taobao.com/
65
+ https://map.baidu.com/
66
+ https://www.amap.com/
67
+ https://www.12306.cn/index/
68
+ https://www.ly.com/
69
+ https://www.mafengwo.cn/
code/finetune/sites_paged.txt ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # paginated listings for SKILLS=next rollouts (suite start URLs are skipped by the script)
2
+ https://lobste.rs/
3
+ https://lobste.rs/recent
4
+ https://arxiv.org/list/cs.LG/recent
5
+ https://arxiv.org/list/cs.CL/recent
6
+ https://arxiv.org/list/cs.CV/recent
7
+ https://pypi.org/search/?q=http
8
+ https://pypi.org/search/?q=json
9
+ https://pypi.org/search/?q=cli
10
+ https://crates.io/search?q=serde
11
+ https://www.npmjs.com/search?q=react
12
+ https://github.com/search?q=attention&type=repositories
13
+ https://github.com/pytorch/pytorch/issues
14
+ https://github.com/python/cpython/pulls
15
+ https://stackoverflow.com/questions?tab=newest
16
+ https://stackoverflow.com/questions/tagged/python
17
+ https://askubuntu.com/questions
18
+ https://superuser.com/questions
19
+ https://unix.stackexchange.com/questions
20
+ https://math.stackexchange.com/questions
21
+ https://www.gutenberg.org/ebooks/search/?sort_order=downloads
22
+ https://www.gutenberg.org/ebooks/search/?query=history
23
+ https://openlibrary.org/search?q=science
24
+ https://en.wikipedia.org/wiki/Special:AllPages
25
+ https://en.wikipedia.org/w/index.php?search=physics&fulltext=1
26
+ https://en.wikipedia.org/wiki/Special:NewPages
27
+ https://webscraper.io/test-sites/e-commerce/static/computers/laptops
28
+ https://webscraper.io/test-sites/e-commerce/static/computers/tablets
29
+ https://webscraper.io/test-sites/e-commerce/static/phones/touch
30
+ https://www.scrapethissite.com/pages/forms/
31
+ https://scrapeme.live/shop/
32
+ https://scrapeme.live/shop/page/2/
33
+ https://automationexercise.com/products
34
+ https://practicesoftwaretesting.com/
35
+ https://dev.to/
36
+ https://hashnode.com/
37
+ https://lwn.net/Archives/
38
+ https://www.phoronix.com/
39
+ https://slashdot.org/
40
+ https://www.bbc.com/news/world
41
+ https://apnews.com/hub/technology
42
+ https://huggingface.co/models
43
+ https://huggingface.co/datasets
44
+ https://huggingface.co/spaces
45
+ https://paperswithcode.com/latest
46
+ https://dblp.org/search?q=attention
47
+ https://aclanthology.org/events/acl-2024/
48
+ https://openreview.net/group?id=ICLR.cc/2025/Conference
49
+ https://www.biorxiv.org/content/early/recent
50
+ https://archive.org/search?query=science
51
+ https://musicbrainz.org/search?query=beatles&type=artist
52
+ https://www.discogs.com/search/?q=jazz
53
+ https://boardgamegeek.com/browse/boardgame
54
+ https://itch.io/games
55
+ https://store.steampowered.com/search/
56
+ https://www.goodreads.com/list/show/1.Best_Books_Ever
57
+ https://www.imdb.com/chart/top/
code/finetune/sites_select.txt ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ https://about.gitlab.com/events/
2
+ https://accounts.google.com/v3/signin/identifier?continue=https://translate.google.com/history&followup=https://translate.google.com/history&passive=1209600&flowName=WebLiteSignIn&flowEntry=ServiceLogin&dsh=S235265407:1789917099781115
3
+ https://accounts.google.com/v3/signin/identifier?continue=https://translate.google.com/saved&followup=https://translate.google.com/saved&passive=1209600&flowName=WebLiteSignIn&flowEntry=ServiceLogin&dsh=S-686375364:1789917900173883
4
+ https://accounts.google.com/v3/signin/identifier?continue=https://translate.google.com/saved&followup=https://translate.google.com/saved&passive=1209600&flowName=WebLiteSignIn&flowEntry=ServiceLogin&dsh=S-801860207:1789917894266607
5
+ https://accounts.google.com/v3/signin/identifier?continue=https://translate.google.com/saved&followup=https://translate.google.com/saved&passive=1209600&flowName=WebLiteSignIn&flowEntry=ServiceLogin&dsh=S271895034:1789917813501863
6
+ https://archlinux.org/packages/
7
+ https://dmytro-shyshkin.kit.com/ai-workshop
8
+ https://docs.python.org/3/
9
+ https://docs.python.org/3/download.html
10
+ https://docs.python.org/3/library/
11
+ https://docs.python.org/3/library/faulthandler.html
12
+ https://docs.python.org/3/library/numbers.html
13
+ https://docs.python.org/3/library/xml.sax.handler.html
14
+ https://docs.python.org/3/py-modindex.html
15
+ https://docs.python.org/3/tutorial/
16
+ https://docs.python.org/3/tutorial/appetite.html
17
+ https://docs.python.org/3/tutorial/floatingpoint.html
18
+ https://formy-project.herokuapp.com/form
19
+ https://getbootstrap.com/docs/5.3/forms/select/
20
+ https://huggingface.co/docs/huggingface_hub/en/guides/cli
21
+ https://pkg.go.dev/image
22
+ https://rust-lang.org/
23
+ https://rust-lang.org/funding/
24
+ https://rust-lang.org/governance/
25
+ https://rust-lang.org/learn/
26
+ https://rust-lang.org/policies/
27
+ https://rust-lang.org/policies/code-of-conduct/
28
+ https://rust-lang.org/policies/licenses/
29
+ https://rust-lang.org/policies/security/
30
+ https://rust-lang.org/tools/
31
+ https://rust-lang.org/tools/install/
32
+ https://rust-lang.org/what/embedded/
33
+ https://www.calculator.net/auto-loan-calculator.html
34
+ https://www.calculator.net/calorie-calculator.html
35
+ https://www.ebay.com/
36
+ https://www.ebay.com/b/Coffee-Tea-Espresso-Makers/38250/bn_2710762
37
+ https://www.ebay.com/ebaylive/sellers/0stkntuiq8o
38
+ https://www.selenium.dev/selenium/web/web-form.html
code/finetune/sites_sort.txt ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ https://scrapeme.live/shop/
2
+ https://scrapeme.live/shop/page/3/
3
+ https://demo.opencart.com/index.php?route=product/category&path=20
4
+ https://demo.opencart.com/index.php?route=product/category&path=57
5
+ https://demo.nopcommerce.com/computers
6
+ https://demo.nopcommerce.com/notebooks
7
+ https://demo.nopcommerce.com/books
8
+ https://practicesoftwaretesting.com/
9
+ https://magento.softwaretestingboard.com/women/tops-women.html
10
+ https://magento.softwaretestingboard.com/men/bottoms-men.html
11
+ https://automationexercise.com/products
12
+ https://www.saucedemo.com/
13
+ https://webscraper.io/test-sites/e-commerce/allinone/computers/laptops
14
+ https://demoblaze.com/
15
+ https://www.demoblaze.com/
code/finetune/train.py CHANGED
@@ -41,10 +41,27 @@ def main():
41
  total = max(1, (len(items) // (MICRO * ACCUM)) * epochs)
42
  sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=total, eta_min=1e-6)
43
  t0 = time.time(); step = 0
44
- for ep in range(epochs):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  random.seed(42 + ep); random.shuffle(items)
46
  sigma = S0 + (S1 - S0) * ep / max(1, epochs - 1); tot_loss, nb = 0.0, 0; opt.zero_grad(set_to_none=True)
47
- for b in range(0, len(items), MICRO):
48
  batch = collate(items[b:b + MICRO], tok.pad_token_id); batch = {k: v.to(dev) for k, v in batch.items()}
49
  with torch.autocast("cuda", dtype=torch.bfloat16):
50
  logits, act = model(batch["input_ids"], batch["attention_mask"], batch["marker_pos"], batch["marker_mask"], batch["qtype"])
@@ -58,8 +75,10 @@ def main():
58
  loss = (loss_rl + loss_ce) / ACCUM + 0.0 * act.sum(); loss.backward(); nb += 1; tot_loss += loss.item() * ACCUM
59
  if nb % ACCUM == 0 or b + MICRO >= len(items):
60
  torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0); opt.step(); sched.step(); opt.zero_grad(set_to_none=True); step += 1
 
61
  if step % 20 == 0: print(f" ep {ep+1} step {step}/{total} loss {loss.item()*ACCUM:.3f} ce {loss_ce.item():.3f} reward {r.mean().item():.3f} {time.time()-t0:.0f}s", flush=True)
62
  print(f"=== epoch {ep+1}/{epochs} avg loss {tot_loss/max(1,nb):.4f} {time.time()-t0:.0f}s", flush=True)
 
63
  os.makedirs(out, exist_ok=True); model.eval()
64
  if hasattr(model.encoder, "_orig_mod"):
65
  model.encoder = model.encoder._orig_mod
@@ -68,6 +87,7 @@ def main():
68
  cfg.update(fine_tuned=True, model_name="laya-browser", temperature=[1.0, 1.0, 1.0], temperature_by_options={},
69
  laya_fmt=os.environ.get("LAYA_FMT", "v1"), head_max_len_train=cfg["head_max_len"])
70
  json.dump(cfg, open(os.path.join(out, "rl_agent_config.json"), "w"), indent=2); print("saved", out)
 
71
 
72
  if __name__ == "__main__":
73
  main()
 
41
  total = max(1, (len(items) // (MICRO * ACCUM)) * epochs)
42
  sched = torch.optim.lr_scheduler.CosineAnnealingLR(opt, T_max=total, eta_min=1e-6)
43
  t0 = time.time(); step = 0
44
+ # ---- resumable: <out>/resume.pt holds model/optimizer/scheduler + (epoch, micro-batch offset); written every
45
+ # SAVE_EVERY optimizer steps and at each epoch end. Re-running the same command continues from it.
46
+ ck_path = os.path.join(out, "resume.pt"); os.makedirs(out, exist_ok=True)
47
+ start_ep, start_b = 0, 0
48
+ if os.path.exists(ck_path):
49
+ ck = torch.load(ck_path, map_location=dev, weights_only=False)
50
+ tgt = model.encoder._orig_mod if hasattr(model.encoder, "_orig_mod") else None
51
+ model.load_state_dict({k.replace("encoder._orig_mod.", "encoder."): v for k, v in ck["model"].items()} if tgt is None else ck["model"], strict=False)
52
+ opt.load_state_dict(ck["opt"]); sched.load_state_dict(ck["sched"]); step = ck["step"]; start_ep, start_b = ck["epoch"], ck["b"]
53
+ print(f"resumed from {ck_path}: epoch {start_ep+1}, item {start_b}, step {step}", flush=True)
54
+ SAVE_EVERY = int(os.environ.get("SAVE_EVERY", "300"))
55
+ def save_resume(ep_, b_):
56
+ tmp = ck_path + ".tmp"
57
+ torch.save({"model": model.state_dict(), "opt": opt.state_dict(), "sched": sched.state_dict(), "step": step, "epoch": ep_, "b": b_}, tmp)
58
+ os.replace(tmp, ck_path)
59
+ for ep0 in range(start_ep): # replay the shuffles of finished epochs so the order matches the original run
60
+ random.seed(42 + ep0); random.shuffle(items)
61
+ for ep in range(start_ep, epochs):
62
  random.seed(42 + ep); random.shuffle(items)
63
  sigma = S0 + (S1 - S0) * ep / max(1, epochs - 1); tot_loss, nb = 0.0, 0; opt.zero_grad(set_to_none=True)
64
+ for b in range((start_b if ep == start_ep else 0), len(items), MICRO):
65
  batch = collate(items[b:b + MICRO], tok.pad_token_id); batch = {k: v.to(dev) for k, v in batch.items()}
66
  with torch.autocast("cuda", dtype=torch.bfloat16):
67
  logits, act = model(batch["input_ids"], batch["attention_mask"], batch["marker_pos"], batch["marker_mask"], batch["qtype"])
 
75
  loss = (loss_rl + loss_ce) / ACCUM + 0.0 * act.sum(); loss.backward(); nb += 1; tot_loss += loss.item() * ACCUM
76
  if nb % ACCUM == 0 or b + MICRO >= len(items):
77
  torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0); opt.step(); sched.step(); opt.zero_grad(set_to_none=True); step += 1
78
+ if step % SAVE_EVERY == 0: save_resume(ep, b + MICRO)
79
  if step % 20 == 0: print(f" ep {ep+1} step {step}/{total} loss {loss.item()*ACCUM:.3f} ce {loss_ce.item():.3f} reward {r.mean().item():.3f} {time.time()-t0:.0f}s", flush=True)
80
  print(f"=== epoch {ep+1}/{epochs} avg loss {tot_loss/max(1,nb):.4f} {time.time()-t0:.0f}s", flush=True)
81
+ save_resume(ep + 1, 0)
82
  os.makedirs(out, exist_ok=True); model.eval()
83
  if hasattr(model.encoder, "_orig_mod"):
84
  model.encoder = model.encoder._orig_mod
 
87
  cfg.update(fine_tuned=True, model_name="laya-browser", temperature=[1.0, 1.0, 1.0], temperature_by_options={},
88
  laya_fmt=os.environ.get("LAYA_FMT", "v1"), head_max_len_train=cfg["head_max_len"])
89
  json.dump(cfg, open(os.path.join(out, "rl_agent_config.json"), "w"), indent=2); print("saved", out)
90
+ if os.path.exists(ck_path): os.remove(ck_path)
91
 
92
  if __name__ == "__main__":
93
  main()
code/finetune/webgym/app.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """webgym HTTP server: renders spec.py tasks as real pages for headless Chromium.
2
+
3
+ python finetune/webgym/app.py [port=8811]
4
+
5
+ /t/<kind>/<seed> the task's start page (flight / hotel search form, or shop listing)
6
+ /t/<kind>/<seed>/results?... results after submitting a form (hotel: filters + sort that reload with params)
7
+ /t/shop/<seed>?page=&sort=&brand=&q= listing; /t/shop/<seed>/p/<id> product page
8
+ """
9
+ import html, json, os, sys, urllib.parse
10
+ from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
11
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
12
+ import spec as S
13
+
14
+ WIDGETS = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "widgets.js")).read()
15
+ CSS = """body{font-family:system-ui,sans-serif;margin:0;background:#fafafa;color:#222}header{display:flex;gap:18px;padding:12px 24px;background:#fff;border-bottom:1px solid #ddd}
16
+ header a{color:#246;text-decoration:none}main{max-width:1000px;margin:0 auto;padding:20px}.hero{background:linear-gradient(#cde,#eef);border-radius:12px;margin-bottom:16px;display:flex;align-items:end;padding:16px;box-sizing:border-box}
17
+ form,.panel{background:#fff;border:1px solid #ddd;border-radius:12px;padding:16px;display:flex;flex-wrap:wrap;gap:14px;align-items:flex-start}
18
+ .f{position:relative;min-width:200px}.list{position:absolute;z-index:20;background:#fff;border:1px solid #bbb;list-style:none;margin:0;padding:4px;min-width:240px}
19
+ .opt{padding:6px 8px;cursor:pointer}.opt:hover{background:#eef}.dlg{position:absolute;z-index:30;background:#fff;border:1px solid #999;border-radius:8px;padding:12px;box-shadow:0 4px 18px #0003;min-width:260px}
20
+ .cal .grid{display:grid;grid-template-columns:repeat(7,34px);gap:3px}.cal .hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
21
+ button{cursor:pointer}.seg button[aria-pressed=true]{background:#246;color:#fff}.cookie{position:fixed;bottom:0;left:0;right:0;background:#223;color:#fff;padding:18px 24px;z-index:50;display:flex;gap:16px;align-items:center}
22
+ .card{background:#fff;border:1px solid #ddd;border-radius:10px;padding:12px;margin:10px 0}.grid3{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
23
+ .pager{display:flex;gap:10px;margin:24px 0}footer{padding:30px;color:#777}.side{min-width:180px}"""
24
+
25
+
26
+ def page(title, body, gym=None, cookie=False, decoys=()):
27
+ nav = "".join(f'<a href="#{html.escape(d.lower().replace(" ", "-"))}">{html.escape(d)}</a>' for d in decoys)
28
+ ck = ('<div class="cookie" id="cookie"><span>We use cookies to improve your experience.</span>'
29
+ '<button type="button" data-g="cookie-accept" onclick="document.getElementById(\'cookie\').remove()">Accept all</button>'
30
+ '<button type="button" data-g="cookie-reject" onclick="document.getElementById(\'cookie\').remove()">Reject all</button></div>') if cookie else ""
31
+ return (f"<!doctype html><html lang=en><head><meta charset=utf-8><title>{html.escape(title)}</title><style>{CSS}</style>"
32
+ f"<script>{WIDGETS}</script></head><body><header><a href='#home'><b>{html.escape(title.split(' ')[0])}</b></a>{nav}</header>"
33
+ f"<main>{body}</main><footer>© 2026 · <a href='#about'>About</a> · <a href='#privacy'>Privacy</a> · <a href='#contact'>Contact</a></footer>{ck}"
34
+ f"<script>window.__gym.meta={json.dumps(gym or {})};</script></body></html>")
35
+
36
+
37
+ def form_page(sp):
38
+ hosts = "".join(f'<div class="f" id="host-{k}"></div>' for k in sp["order"])
39
+ hero = f'<div class="hero" style="height:{sp["hero"]}px"><h1>{"Find your next flight" if sp["kind"] == "flight" else "Find a place to stay"}</h1></div>' if sp["hero"] else ""
40
+ fields = [f for f in sp["fields"]]
41
+ js = f"""
42
+ const SP={json.dumps({"fields": fields, "kind": sp["kind"], "seed": sp["seed"]})};
43
+ for (const f of SP.fields) {{ const h=document.getElementById('host-'+f.key); ({{combo:__gym.combo,choice:__gym.choice,date:__gym.date,count:__gym.count}})[f.w](h,f); }}
44
+ const ret=SP.fields.find(f=>f.only_round);
45
+ if (ret) setInterval(()=>{{ const h=document.getElementById('host-'+ret.key); const show=__gym.state.trip==='round'; if (h.hidden===show) h.hidden=!show; }},100);
46
+ document.getElementById('go').addEventListener('click',e=>{{ e.preventDefault();
47
+ location.href=location.pathname+'/results?'+new URLSearchParams(Object.entries(__gym.state).filter(([k,v])=>v!==null&&v!==undefined).map(([k,v])=>[k,String(v)])); }});
48
+ """
49
+ body = (f"{hero}<form onsubmit='return false'>{hosts}<button id='go' type='submit' data-g='submit'>{html.escape(sp['submit'])}</button></form>"
50
+ f"<div class='panel' style='margin-top:18px'><p>Popular: " + ", ".join(f"<a href='#pop-{c[0]}'>{c[1]}</a>" for c in S.CITIES[:5]) + "</p></div>"
51
+ f"<script>{js}</script>")
52
+ return page(("SkyFinder" if sp["kind"] == "flight" else "StayFinder") + " – search", body, gym={"kind": sp["kind"], "seed": sp["seed"]},
53
+ cookie=sp["cookie"], decoys=sp["decoys"])
54
+
55
+
56
+ def results_page(sp, q):
57
+ city = {c[0]: c[1] for c in S.CITIES}
58
+ k = lambda x: (q.get(x) or "").replace("-ap", "")
59
+ if sp["kind"] == "flight":
60
+ head = f"{city.get(k('origin'), '?')} to {city.get(k('destination'), '?')}"
61
+ chips = [("One way" if q.get("trip") == "oneway" else "Round trip"), f"{q.get('adults', '1')} adult(s)", (q.get("cabin") or "economy").title(),
62
+ f"Departs {q.get('date', '?')}"] + ([f"Returns {q.get('ret')}"] if q.get("ret") else [])
63
+ cards = "".join(f"<div class='card'><b>{7 + i}:{15 * (i % 4):02d} – {9 + i}:{(15 * i + 40) % 60:02d}</b> · {['Nonstop', '1 stop'][i % 2]} · "
64
+ f"<a href='#flight-{i}'>Select ${120 + 37 * i}</a></div>" for i in range(5))
65
+ body = f"<h1>{head}</h1><p>{' · '.join(chips)}</p>{cards}<p><a href='{sp_url(sp)}'>Modify search</a></p>"
66
+ return page("SkyFinder – results", body, gym={"kind": "flight", "results": dict(q)}, decoys=sp["decoys"])
67
+ # hotel results: filters + sort reload the page with params
68
+ title = f"Stays in {city.get(k('dest'), '?')}"
69
+ filt = [f for f in ["Free cancellation", "Breakfast included", "Pool", "Pet friendly"]]
70
+ on = set((q.get("filter") or "").split("|")) - {""}
71
+ boxes = "".join(f"<label><input type=checkbox data-g='filter-{i}' {'checked' if f in on else ''} onchange=\"setF('{f}',this.checked)\"> {f}</label><br>"
72
+ for i, f in enumerate(filt))
73
+ sorts = ["Recommended", "Price: low to high", "Guest rating", "Distance to center"]
74
+ cur = q.get("sort") or "Recommended"
75
+ sel = "".join(f"<option {'selected' if s == cur else ''}>{s}</option>" for s in sorts)
76
+ cards = "".join(f"<div class='card'><a href='#hotel-{i}'>Hotel {['Aurora', 'Belvedere', 'Casa Flora', 'Duomo', 'Elba', 'Fjord'][i]}</a> · "
77
+ f"{8 + (i % 3) * 0.5}/10 · ${90 + 23 * i}/night</div>" for i in range(6))
78
+ js = """function go(p){const u=new URL(location.href);for(const[k,v]of Object.entries(p)){if(v)u.searchParams.set(k,v);else u.searchParams.delete(k)}location.href=u}
79
+ function setF(f,on){const u=new URL(location.href);const s=new Set((u.searchParams.get('filter')||'').split('|').filter(Boolean));on?s.add(f):s.delete(f);go({filter:[...s].join('|')})}"""
80
+ body = (f"<h1>{title}</h1><p>{q.get('cin', '?')} → {q.get('cout', '?')} · {q.get('guests', '2')} guests</p><div style='display:flex;gap:18px'>"
81
+ f"<div class='panel side'><b>Filters</b><br>{boxes}</div><div style='flex:1'><label for=sort>Sort by</label> <select id=sort data-g=sort "
82
+ f"onchange=\"go({{sort:this.value}})\">{sel}</select>{cards}</div></div><script>{js}</script>")
83
+ return page("StayFinder – results", body, gym={"kind": "hotel", "results": dict(q)}, decoys=sp["decoys"])
84
+
85
+
86
+ def sp_url(sp):
87
+ return f"/t/{sp['kind']}/{sp['seed']}"
88
+
89
+
90
+ def shop_page(sp, q):
91
+ items = sp["items"]; L = sp["labels"]
92
+ if q.get("q"):
93
+ items = [i for i in items if q["q"] in i["name"].lower()]
94
+ if q.get("brand"):
95
+ items = [i for i in items if i["brand"] == q["brand"]]
96
+ s = q.get("sort") or "Featured"
97
+ if s.startswith("Price: low"): items = sorted(items, key=lambda i: i["price"])
98
+ elif s.startswith("Price: high"): items = sorted(items, key=lambda i: -i["price"])
99
+ elif s == "Newest": items = sorted(items, key=lambda i: -i["id"])
100
+ elif s == "Top rated": items = sorted(items, key=lambda i: (i["id"] * 7) % 13)
101
+ n = int(q.get("page") or 1); per = sp["per_page"]; pages = max(1, -(-len(items) // per))
102
+ shown = items[(n - 1) * per: n * per]
103
+ base = sp_url(sp)
104
+ def link(**kw):
105
+ p = {k: v for k, v in {**{k: q.get(k) for k in ("q", "brand", "sort")}, **kw}.items() if v}
106
+ return base + ("?" + urllib.parse.urlencode(p) if p else "")
107
+ grid = "".join(f"<div class='card'><a href='{base}/p/{i['id']}'>{html.escape(i['name'])}</a><br>${i['price']:.2f}</div>" for i in shown)
108
+ sorts = ["Featured", "Price: low to high", "Price: high to low", "Newest", "Top rated"]
109
+ if sp["sort_impl"] == "select":
110
+ sort_ui = (f"<label for=sort>{L['sort']}</label> <select id=sort data-g=sort onchange=\"location.href=this.value\">" +
111
+ "".join(f"<option value='{link(sort=x if x != 'Featured' else None, page=None)}' {'selected' if x == s else ''}>{x}</option>" for x in sorts) + "</select>")
112
+ else:
113
+ sort_ui = (f"<button type=button data-g=sort-trigger aria-haspopup=listbox aria-label='{L['sort']}: {s}' onclick=\"const l=document.getElementById('sl');l.hidden=!l.hidden\">"
114
+ f"{L['sort']}: {s} ▾</button><div id=sl role=listbox class=list hidden>" +
115
+ "".join(f"<a role=option class=opt href='{link(sort=x if x != 'Featured' else None, page=None)}'>{x}</a>" for x in sorts) + "</div>")
116
+ brands = "".join(f"<label><input type=checkbox data-g='brand-{b}' {'checked' if q.get('brand') == b else ''} "
117
+ f"onchange=\"location.href=this.checked?'{link(brand=b, page=None)}':'{link(brand=None, page=None)}'\"> {b}</label><br>" for b in S.BRANDS)
118
+ btn = f"<button type=submit data-g=search-btn>{'Search' if sp['search_button'] else ''}</button>" if sp["search_button"] else ""
119
+ search = (f"<form action='{base}' method=get style='display:inline-flex;gap:6px'><input type=search name=q aria-label=\"{L['search']}\" "
120
+ f"placeholder=\"{L['search']}\" value=\"{html.escape(q.get('q') or '')}\" data-g=search>{btn}</form>")
121
+ pager = []
122
+ if sp["pager"] in ("numbers", "both"):
123
+ pager += [f"<a href='{link(page=p if p > 1 else None)}' {'aria-current=page' if p == n else ''}>{p}</a>" for p in range(1, pages + 1)]
124
+ if sp["pager"] in ("next", "both") and n < pages:
125
+ pager.append(f"<a href='{link(page=n + 1)}' data-g=next>{L['next']}</a>")
126
+ hero = f"<div class='hero' style='height:{sp['hero']}px'><h1>{sp['category']}</h1></div>" if sp["hero"] else ""
127
+ body = (f"{hero}<div class=panel>{search} {sort_ui}</div><div style='display:flex;gap:18px;margin-top:14px'><div class='panel side'><b>{L['brand']}</b><br>{brands}</div>"
128
+ f"<div style='flex:1'><p>Showing {len(shown)} of {len(items)} products · page {n} of {pages}</p><div class=grid3>{grid}</div>"
129
+ f"<nav class=pager aria-label=Pagination>{' '.join(pager)}</nav></div></div>")
130
+ state = {"page": n, "sort": q.get("sort"), "brand": q.get("brand"), "q": q.get("q")}
131
+ return page(f"{sp['category']} – ShopRight", body, gym={"kind": "shop", "listing": state}, cookie=sp["cookie"] and not q, decoys=["Deals", "Help", "Sign in", "Cart"])
132
+
133
+
134
+ def product_page(sp, pid):
135
+ it = sp["items"][pid]
136
+ body = f"<h1>{html.escape(it['name'])}</h1><p>${it['price']:.2f}</p><button data-g=cart>Add to cart</button> <a href='{sp_url(sp)}'>Back to all products</a>"
137
+ return page(f"{it['name']} – ShopRight", body, gym={"kind": "shop", "product": pid}, decoys=["Deals", "Help", "Sign in", "Cart"])
138
+
139
+
140
+ class H(BaseHTTPRequestHandler):
141
+ def log_message(self, *a): pass
142
+ def do_GET(self):
143
+ u = urllib.parse.urlparse(self.path); parts = [p for p in u.path.split("/") if p]
144
+ q = {k: v[0] for k, v in urllib.parse.parse_qs(u.query).items()}
145
+ try:
146
+ if len(parts) >= 3 and parts[0] == "t":
147
+ kind, seed = parts[1], int(parts[2]); sp = S.make(kind, seed)
148
+ if kind == "shop":
149
+ out = product_page(sp, int(parts[4])) if len(parts) >= 5 and parts[3] == "p" else shop_page(sp, q)
150
+ elif len(parts) >= 4 and parts[3] == "results":
151
+ out = results_page(sp, q)
152
+ else:
153
+ out = form_page(sp)
154
+ code = 200
155
+ elif parts == ["spec"]:
156
+ out = json.dumps(S.make(q["kind"], int(q["seed"]))); code = 200
157
+ else:
158
+ out, code = "not found", 404
159
+ except Exception as e:
160
+ out, code = f"error: {type(e).__name__}: {e}", 500
161
+ data = out.encode()
162
+ self.send_response(code); self.send_header("Content-Type", "application/json" if parts == ["spec"] else "text/html; charset=utf-8")
163
+ self.send_header("Content-Length", str(len(data))); self.end_headers(); self.wfile.write(data)
164
+
165
+
166
+ if __name__ == "__main__":
167
+ port = int(sys.argv[1]) if len(sys.argv) > 1 else 8811
168
+ print(f"webgym on http://127.0.0.1:{port}/t/flight/1", flush=True)
169
+ ThreadingHTTPServer(("127.0.0.1", port), H).serve_forever()
code/finetune/webgym/eval_gym.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Run the real agent (jev loop + the laya systemone server) on HELD-OUT webgym seeds (seed % 10 == 0, never generated
2
+ for training) and judge success from the page's own state.
3
+
4
+ python finetune/webgym/eval_gym.py [n_per_kind=10] [kinds=flight,hotel,shop] [max_steps=40]
5
+ env: JEV_PLANNER=1 to plan sub-goals first; GYM_OUT=results.json
6
+
7
+ Success: flight/hotel = on the results page with every target value (+ hotel filter/sort), shop = the listing/product
8
+ state the task asks for. The agent's DONE is not trusted; a run that ends without reaching the state fails.
9
+ """
10
+ import json, os, sys, time, urllib.parse
11
+ sys.path.insert(0, "/home/ckl/projects/S/jev-ultrafast")
12
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
13
+ sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "apps"))
14
+ import browser_suite # noqa: F401 (sets the jev env: CDP, systemone URL, text model)
15
+ from jev_ultrafast import Agent
16
+ import spec as S
17
+
18
+ BASE = os.environ.get("GYM_URL", "http://127.0.0.1:8811")
19
+
20
+
21
+ def success(sp, url, meta):
22
+ if sp["kind"] in ("flight", "hotel"):
23
+ res = (meta or {}).get("results")
24
+ if res is None:
25
+ return False
26
+ for k, v in sp["target"].items():
27
+ got = (res.get(k) or "")
28
+ if isinstance(v, str) and len(v) == 3 and v.isalpha():
29
+ if got.replace("-ap", "") != v: return False
30
+ elif str(got) != str(v):
31
+ return False
32
+ post = sp.get("post") or {}
33
+ if "filter" in post and post["filter"] not in (res.get("filter") or "").split("|"): return False
34
+ if "sort" in post and res.get("sort") != post["sort"]: return False
35
+ return True
36
+ post = sp["post"]
37
+ if "open" in post:
38
+ return (meta or {}).get("product") == post["open"]
39
+ lst = (meta or {}).get("listing") or {}
40
+ return all((lst.get(k) or (1 if k == "page" else None)) == v if k != "q" else (lst.get("q") or "").lower() == v for k, v in post.items())
41
+
42
+
43
+ def run(kind, seed, max_steps):
44
+ sp = S.make(kind, seed)
45
+ t0 = time.time(); steps = 0; status = "error"; meta = None; url = ""; plan = None
46
+ try:
47
+ with Agent(f"{BASE}/t/{kind}/{seed}", sp["goal"]) as agent:
48
+ plan = agent.state.get("plan")
49
+ for state in agent.run():
50
+ steps = len(state["history"]); status = state["status"]
51
+ if steps >= max_steps: break
52
+ time.sleep(0.8)
53
+ meta = json.loads(agent.browser.evaluate("JSON.stringify(window.__gym ? window.__gym.meta : null)") or "null")
54
+ url = agent.browser.evaluate("location.href")
55
+ except Exception as e:
56
+ status = f"error:{type(e).__name__}:{str(e)[:60]}"
57
+ ok = success(sp, url, meta)
58
+ return {"kind": kind, "seed": seed, "ok": ok, "steps": steps, "status": status, "wall": round(time.time() - t0, 1), "url": url,
59
+ "goal": sp["goal"], "plan": plan}
60
+
61
+
62
+ def main():
63
+ n = int(sys.argv[1]) if len(sys.argv) > 1 else 10
64
+ kinds = (sys.argv[2] if len(sys.argv) > 2 else "flight,hotel,shop").split(",")
65
+ max_steps = int(sys.argv[3]) if len(sys.argv) > 3 else 40
66
+ rows = []
67
+ for kind in kinds:
68
+ for i in range(n):
69
+ seed = 900000 + 10 * i # held out: never generated for training (and disjoint from training ranges)
70
+ r = run(kind, seed, max_steps); rows.append(r)
71
+ print(f"{'PASS' if r['ok'] else 'FAIL'} {kind:6s} seed={seed} steps={r['steps']:2d} {r['status'][:28]:28s} {r['wall']:5.1f}s {r['goal'][:70]}", flush=True)
72
+ for kind in kinds:
73
+ k = [r for r in rows if r["kind"] == kind]
74
+ print(f"== {kind}: {sum(r['ok'] for r in k)}/{len(k)} median steps {sorted(r['steps'] for r in k)[len(k)//2]}")
75
+ print(f"== total {sum(r['ok'] for r in rows)}/{len(rows)} ({100*sum(r['ok'] for r in rows)/max(1,len(rows)):.0f}%)")
76
+ json.dump(rows, open(os.environ.get("GYM_OUT", "/tmp/gym_eval.json"), "w"), indent=1)
77
+
78
+
79
+ if __name__ == "__main__":
80
+ main()
code/finetune/webgym/expert.py ADDED
@@ -0,0 +1,330 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Scripted expert for webgym tasks, run in the real headless Chromium through jev's Browser, so every recorded case
2
+ has exactly the observation format the agent sees. Writes jev-format training cases:
3
+
4
+ * goal = the full task -> gold = the expert's next operation/target
5
+ * goal = the current sub-goal -> the same gold (sub-goal-conditioned policy)
6
+ * goal = a sub-goal just satisfied -> gold = DONE (sub-goal completion)
7
+ * on the final state, goal = full task -> DONE
8
+
9
+ python finetune/webgym/expert.py <out.jsonl> <n_episodes> [seed0=1] [kinds=flight,hotel,shop] [noise=0.1]
10
+
11
+ Held-out seeds (seed % 10 == 0) are skipped here; eval_gym.py runs the real agent on them.
12
+ """
13
+ import json, os, random, re, sys, time
14
+ sys.path.insert(0, "/home/ckl/projects/S/jev-ultrafast")
15
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
16
+ os.environ.setdefault("BU_CDP_URL", "http://127.0.0.1:9222")
17
+ from jev_ultrafast.browser import Browser, StalePage
18
+ import spec as S
19
+
20
+ BASE = os.environ.get("GYM_URL", "http://127.0.0.1:8811")
21
+
22
+
23
+ def observe(b, tries=10):
24
+ for i in range(tries):
25
+ try:
26
+ return b.observe(screenshot=False)
27
+ except StalePage:
28
+ time.sleep(0.3)
29
+ raise StalePage("never settled")
30
+
31
+
32
+ def js(b, expr):
33
+ return b.evaluate(expr)
34
+
35
+
36
+ def status(b):
37
+ s = js(b, "JSON.stringify({st: window.__gym && window.__gym.status ? window.__gym.status() : null, meta: window.__gym ? window.__gym.meta : null, url: location.href})")
38
+ return json.loads(s) if s else {}
39
+
40
+
41
+ def node_of(b, sel):
42
+ return js(b, f"window.__gym.node({json.dumps(sel)})")
43
+
44
+
45
+ def where(b, sel):
46
+ return js(b, f"window.__gym.where({json.dumps(sel)})")
47
+
48
+
49
+ class Stop(Exception):
50
+ pass
51
+
52
+
53
+ class Expert:
54
+ def __init__(self, sp, b, rng):
55
+ self.sp, self.b, self.rng = sp, b, rng
56
+
57
+ # ------------------------------------------------------------------ satisfaction per sub-goal
58
+ def satisfied(self, key, st, meta):
59
+ sp = self.sp
60
+ if sp["kind"] in ("flight", "hotel"):
61
+ res = (meta or {}).get("results")
62
+ if key == "submit":
63
+ return res is not None
64
+ if key in ("filter", "sort"):
65
+ if res is None: return False
66
+ want = sp["post"][key]
67
+ return want in (res.get("filter") or "").split("|") if key == "filter" else res.get("sort") == want
68
+ if res is not None: # past the form: the submitted search must carry the target value
69
+ t = sp["target"][key]
70
+ v = res.get(key)
71
+ if isinstance(t, str) and len(t) == 3 and t.isalpha():
72
+ return isinstance(v, str) and v.replace("-ap", "") == t
73
+ return str(v) == str(t)
74
+ v, t = st["state"].get(key), sp["target"][key]
75
+ if isinstance(t, str) and len(t) == 3 and t.isalpha(): # city key
76
+ return isinstance(v, str) and (v == t or v == t + "-ap" or (v.startswith("text:") and S_name(t).lower() in v.lower()))
77
+ return v == t or str(v) == str(t)
78
+ lst = (meta or {}).get("listing") or {}
79
+ post = sp["post"]
80
+ if key == "open":
81
+ return (meta or {}).get("product") == post["open"]
82
+ if (meta or {}).get("product") is not None:
83
+ return True
84
+ if key == "page": return lst.get("page") == post["page"]
85
+ if key == "sort": return lst.get("sort") == post["sort"]
86
+ if key == "brand": return lst.get("brand") == post["brand"]
87
+ if key == "q": return (lst.get("q") or "").lower() == post["q"]
88
+ return False
89
+
90
+ def wrong_results(self, meta):
91
+ """Submitted with wrong or missing values: the form sub-goals are not all satisfied on the results page."""
92
+ res = (meta or {}).get("results")
93
+ if res is None or self.sp["kind"] not in ("flight", "hotel"):
94
+ return False
95
+ return any(not self.satisfied(k, {"state": {}}, meta) for k in self.sp["target"])
96
+
97
+ def current(self, st, meta):
98
+ for i, (key, text) in enumerate(self.sp["subgoals"]):
99
+ if key == "ret" and self.sp["target"].get("trip") != "round":
100
+ continue
101
+ if not self.satisfied(key, st, meta):
102
+ return i
103
+ return None
104
+
105
+ # ------------------------------------------------------------------ the next expert step for sub-goal key
106
+ def step_for(self, key, st, page):
107
+ sp, b, rng = self.sp, self.b, self.rng
108
+ open_ = set(st.get("open") or [])
109
+ if sp["kind"] in ("flight", "hotel"):
110
+ if key == "submit":
111
+ return ("CLICK", "[data-g=submit]", None)
112
+ if key == "filter":
113
+ i = ["Free cancellation", "Breakfast included", "Pool", "Pet friendly"].index(sp["post"]["filter"])
114
+ return ("CLICK", f"[data-g=filter-{i}]", None)
115
+ if key == "sort":
116
+ return ("SELECT", "[data-g=sort]", sp["post"]["sort"])
117
+ f = next(x for x in sp["fields"] if x["key"] == key)
118
+ t = sp["target"][key]
119
+ # close a popup that belongs to another field first (it may cover what we need)
120
+ for o in open_:
121
+ if o and not o.startswith(key) and o.endswith("-dialog"):
122
+ other = o[: -len("-dialog")]
123
+ for btn in (f"[data-g={other}-close]", f"[data-g={other}-done]"):
124
+ if js(b, f"!!document.querySelector({json.dumps(btn)})"):
125
+ return ("CLICK", btn, None)
126
+ if f["w"] == "combo":
127
+ dlg_open = (key + "-dialog") in open_
128
+ if f["trigger"] and not dlg_open:
129
+ return ("CLICK", f"[data-g={key}-trigger]", None)
130
+ name = S_name(t)
131
+ if f["suggest"]:
132
+ for k in ([t + "-ap", t] if rng.random() < 0.5 else [t, t + "-ap"]):
133
+ sel = f"[data-g={key}-opt-{k}]"
134
+ if where(b, sel) is not None:
135
+ first = js(b, f"(document.querySelector('#{key}-list [role=option]')||{{}}).getAttribute && document.querySelector('#{key}-list [role=option]').getAttribute('data-g')")
136
+ if first == sel[8:-1] and rng.random() < 0.25:
137
+ return ("PRESS_ENTER", "press_enter", None)
138
+ return ("CLICK", sel, None)
139
+ alias = next((c[4] for c in S.CITIES if c[0] == t and c[4]), "")
140
+ typed = rng.choice([name, name, name[: max(3, len(name) // 2 + 1)], alias or name])
141
+ return ("TYPE_TEXT", f"[data-g={key}-input]", typed)
142
+ return ("TYPE_TEXT", f"[data-g={key}-input]", name)
143
+ if f["w"] == "choice":
144
+ if f["impl"] == "select":
145
+ return ("SELECT", f"[data-g={key}-select]", t)
146
+ if f["impl"] == "dropdown":
147
+ if js(b, f"document.querySelector('[data-g={key}-trigger]').getAttribute('aria-expanded')") != "true":
148
+ return ("CLICK", f"[data-g={key}-trigger]", None)
149
+ return ("CLICK", f"[data-g={key}-{t}]", None)
150
+ if f["w"] == "date":
151
+ if f["impl"] == "typed":
152
+ y, m, d = t.split("-")
153
+ return ("TYPE_TEXT", f"[data-g={key}-input]", f"{m}/{d}/{y}")
154
+ if (key + "-dialog") not in open_:
155
+ return ("CLICK", f"[data-g={key}-trigger]", None)
156
+ day = f"[data-g={key}-day-{t}]"
157
+ if js(b, f"!!document.querySelector({json.dumps(day)})"):
158
+ if js(b, f"document.querySelector({json.dumps(day)}).getAttribute('aria-pressed')") != "true":
159
+ return ("CLICK", day, None)
160
+ return ("CLICK", f"[data-g={key}-done]", None)
161
+ shown = js(b, f"document.querySelector('[data-g={key}-dialog] strong').textContent")
162
+ mon, yr = shown.split()
163
+ cur = int(yr) * 12 + S.MONTHS.index(mon)
164
+ want = int(t[:4]) * 12 + int(t[5:7]) - 1
165
+ return ("CLICK", f"[data-g={key}-{'next' if want > cur else 'prev'}]", None)
166
+ if f["w"] == "count":
167
+ v = st["state"].get(key)
168
+ if f["impl"] == "select":
169
+ return ("SELECT", f"[data-g={key}-select]", str(t))
170
+ if f["impl"] == "popup" and (key + "-dialog") not in open_:
171
+ return ("CLICK", f"[data-g={key}-trigger]", None)
172
+ return ("CLICK", f"[data-g={key}-{'inc' if v < t else 'dec'}]", None)
173
+ # ------------------------------------------------ shop
174
+ post = sp["post"]
175
+ if key == "q":
176
+ val = js(b, "(document.querySelector('[data-g=search]')||{}).value")
177
+ if (val or "").strip().lower() != post["q"]:
178
+ return ("TYPE_TEXT", "[data-g=search]", post["q"])
179
+ if sp["search_button"] and rng.random() < 0.4:
180
+ return ("CLICK", "[data-g=search-btn]", None)
181
+ return ("PRESS_ENTER", "press_enter", None)
182
+ if key == "sort":
183
+ if sp["sort_impl"] == "select":
184
+ return ("SELECT", "[data-g=sort]", post["sort"])
185
+ if js(b, "document.getElementById('sl').hidden"):
186
+ return ("CLICK", "[data-g=sort-trigger]", None)
187
+ return ("CLICK_TEXT", "#sl [role=option]", post["sort"])
188
+ if key == "brand":
189
+ return ("CLICK", f"[data-g=brand-{post['brand']}]", None)
190
+ if key == "page":
191
+ n = post["page"]
192
+ if js(b, f"!!document.querySelector('[data-g=next]')") and (sp["pager"] == "next" or rng.random() < 0.5):
193
+ return ("CLICK", "[data-g=next]", None)
194
+ return ("CLICK_TEXT", "nav.pager a", str(n))
195
+ if key == "open":
196
+ return ("CLICK", f"a[href$='/p/{post['open']}']", None)
197
+ raise Stop(f"no step for {key}")
198
+
199
+
200
+ def S_name(key):
201
+ return next(c[1] for c in S.CITIES if c[0] == key.replace("-ap", ""))
202
+
203
+
204
+ def to_action(b, page, op, sel, val):
205
+ """Map an expert step to the observed jev action (same node, same kind). None when it is not on screen."""
206
+ if op == "PRESS_ENTER":
207
+ return next((a for a in page["actions"] if a["id"] == "press_enter"), None)
208
+ if op == "CLICK_TEXT":
209
+ node = js(b, f"window.__gym.nodeText({json.dumps(sel)}, {json.dumps(val)})")
210
+ sel_for_where = None
211
+ else:
212
+ node = node_of(b, sel)
213
+ kind = {"CLICK": "click", "CLICK_TEXT": "click", "TYPE_TEXT": "fill", "SELECT": "select"}[op]
214
+ for a in page["actions"]:
215
+ if a.get("node") != node or a["kind"] != kind:
216
+ continue
217
+ if kind == "select" and not (a.get("value") == val or a["label"].split(" → ")[-1].strip() == val):
218
+ continue
219
+ if kind == "click" and a["label"].startswith("Open ") and op == "CLICK" and any(x.get("node") == node and x["kind"] == "fill" for x in page["actions"]):
220
+ continue # the "Open <field>" click of an editable field is not the intended click
221
+ return a
222
+ return None
223
+
224
+
225
+ def hist_entry(a, text, changed):
226
+ return {"action": a["label"], "kind": a["kind"], "text": text, "page_changed": changed}
227
+
228
+
229
+ def case(page, goal, gold_op, gold_id, a, hist, sp, tag):
230
+ return {"page": -1, "url": page["url"], "title": page["title"], "goal": goal, "gold_op": gold_op, "gold_id": gold_id,
231
+ "kind": a["kind"] if a else "done", "label": a["label"] if a else "", "history": list(hist)[-10:], "source": "webgym",
232
+ "skill": tag, "seed": sp["seed"], "gym_kind": sp["kind"], "page_obj": {k: page[k] for k in ("url", "title", "text", "actions")}}
233
+
234
+
235
+ def run_episode(kind, seed, out, rng, noise=0.1, max_steps=45):
236
+ sp = S.make(kind, seed)
237
+ b = Browser(f"{BASE}/t/{kind}/{seed}")
238
+ ex = Expert(sp, b, rng)
239
+ hist, n, prev_sub = [], 0, None
240
+ try:
241
+ page = observe(b)
242
+ for step in range(max_steps):
243
+ info = status(b); st = info.get("st") or {}; meta = info.get("meta")
244
+ if st and "open" not in st: st["open"] = []
245
+ if ex.wrong_results(meta):
246
+ # recovery: the search was submitted with wrong values -> back to the form
247
+ a = next((x for x in page["actions"] if x["label"] == "Modify search"), None)
248
+ if a is None:
249
+ raise Stop("wrong results and no way back")
250
+ out.write(json.dumps(case(page, sp["goal"], "CLICK", a["id"], a, hist, sp, "recover"), ensure_ascii=False) + "\n"); n += 1
251
+ before = page["fingerprint"]; b.act(a, page); time.sleep(0.3); page = observe(b)
252
+ hist.append(hist_entry(a, None, page["fingerprint"] != before)); prev_sub = None
253
+ continue
254
+ cur = ex.current(st, meta)
255
+ # sub-goal completion: the previous sub-goal is now satisfied -> DONE under that sub-goal
256
+ if prev_sub is not None and prev_sub != cur:
257
+ sg = sp["subgoals"][prev_sub][1]
258
+ out.write(json.dumps(case(page, sg, "DONE", "DONE", None, hist, sp, "subgoal_done"), ensure_ascii=False) + "\n"); n += 1
259
+ if cur is None:
260
+ out.write(json.dumps(case(page, sp["goal"], "DONE", "DONE", None, hist, sp, "task_done"), ensure_ascii=False) + "\n")
261
+ return n + 1, True
262
+ key = sp["subgoals"][cur][0]
263
+ op, sel, val = ex.step_for(key, st, page)
264
+ # cookie banner in the way of anything below it: accept it
265
+ a = to_action(b, page, op, sel, val)
266
+ if a is None and op != "PRESS_ENTER":
267
+ if js(b, "!!document.getElementById('cookie')"):
268
+ op, sel, val = "CLICK", "[data-g=cookie-accept]", None; a = to_action(b, page, op, sel, val)
269
+ elif op != "CLICK_TEXT" and where(b, sel) in (1, -1):
270
+ sid = "scroll_down" if where(b, sel) == 1 else "scroll_up"
271
+ a = next((x for x in page["actions"] if x["id"] == sid), None); op = sid.upper()
272
+ elif op == "CLICK_TEXT":
273
+ a = next((x for x in page["actions"] if x["id"] == "scroll_down"), None); op = "SCROLL_DOWN"
274
+ if a is None:
275
+ raise Stop(f"step {step}: {op} {sel} not actionable")
276
+ gold_op = op if op in ("SCROLL_DOWN", "SCROLL_UP", "PRESS_ENTER") else {"CLICK_TEXT": "CLICK"}.get(op, op)
277
+ text = val if op == "TYPE_TEXT" else None
278
+ out.write(json.dumps(case(page, sp["goal"], gold_op, a["id"], a, hist, sp, key), ensure_ascii=False) + "\n")
279
+ out.write(json.dumps(case(page, sp["subgoals"][cur][1], gold_op, a["id"], a, hist, sp, key + "@sub"), ensure_ascii=False) + "\n")
280
+ n += 2
281
+ before = page["fingerprint"]
282
+ b.act(a, page, text=text); time.sleep(0.15 if op != "CLICK" else 0.25)
283
+ page = observe(b)
284
+ hist.append(hist_entry(a, text, page["fingerprint"] != before))
285
+ prev_sub = cur
286
+ # DART-style noise: a harmless detour the expert then has to recover from (not recorded as a gold step)
287
+ if rng.random() < noise:
288
+ submit_node = node_of(b, "[data-g=submit]")
289
+ decoy = {"Deals", "Help", "Blog", "Careers", "Travel guides", "Gift cards", "Manage booking", "About", "Privacy", "Contact"}
290
+ cands = [x for x in page["actions"] if x["kind"] == "click" and x.get("node") != submit_node and
291
+ ((x["label"].startswith("Open ")) or (x.get("role") == "link" and x["label"] in decoy))]
292
+ if cands:
293
+ z = rng.choice(cands)
294
+ try:
295
+ before = page["fingerprint"]; b.act(z, page); time.sleep(0.2); page = observe(b)
296
+ hist.append(hist_entry(z, None, page["fingerprint"] != before))
297
+ except Exception:
298
+ page = observe(b)
299
+ raise Stop("step budget")
300
+ finally:
301
+ b.close()
302
+
303
+
304
+ def main():
305
+ out_f, n_ep = sys.argv[1], int(sys.argv[2])
306
+ seed0 = int(sys.argv[3]) if len(sys.argv) > 3 else 1
307
+ kinds = (sys.argv[4] if len(sys.argv) > 4 else "flight,hotel,shop").split(",")
308
+ noise = float(sys.argv[5]) if len(sys.argv) > 5 else 0.1
309
+ rng = random.Random(seed0)
310
+ ok = fail = cases = 0; reasons = {}
311
+ t0 = time.time()
312
+ with open(out_f, "a") as out:
313
+ seed = seed0
314
+ while ok + fail < n_ep:
315
+ if seed % 10 == 0:
316
+ seed += 1; continue
317
+ kind = kinds[(ok + fail) % len(kinds)]
318
+ try:
319
+ c, done = run_episode(kind, seed, out, rng, noise)
320
+ cases += c; ok += 1
321
+ except Exception as e:
322
+ fail += 1; r = f"{type(e).__name__}: {str(e)[:60]}"; reasons[r] = reasons.get(r, 0) + 1
323
+ seed += 1
324
+ if (ok + fail) % 25 == 0:
325
+ print(f" {ok+fail} episodes ok={ok} fail={fail} cases={cases} {time.time()-t0:.0f}s", flush=True)
326
+ print(f"done: ok={ok} fail={fail} cases={cases} failures={sorted(reasons.items(), key=lambda kv: -kv[1])[:6]}")
327
+
328
+
329
+ if __name__ == "__main__":
330
+ main()
code/finetune/webgym/serve.sh ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # serve.sh start|stop|restart -- webgym server on :8811, tracked by pid file (never pkill by pattern)
3
+ D=$(cd "$(dirname "$0")" && pwd); PIDF=${GYM_PIDFILE:-/tmp/webgym.pid}; LOG=${GYM_LOG:-/tmp/webgym.log}
4
+ stop() { [ -f $PIDF ] && kill $(cat $PIDF) 2>/dev/null; rm -f $PIDF; sleep 0.5; }
5
+ start() { nohup $D/../../.venv/bin/python $D/app.py 8811 > $LOG 2>&1 & echo $! > $PIDF; sleep 1.5; curl -s --noproxy '*' -o /dev/null -w "webgym %{http_code}\n" http://127.0.0.1:8811/t/flight/1; }
6
+ case "$1" in start) start;; stop) stop;; restart) stop; start;; esac
code/finetune/webgym/spec.py ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Task specs for webgym: every (kind, seed) deterministically yields labels, widget implementations, layout, target
2
+ values, the natural-language goal and planner-style sub-goals. Seeds with seed % 10 == 0 are held out for evaluation.
3
+ """
4
+ import datetime as dt
5
+ import random
6
+
7
+ CITIES = [("zrh", "Zürich", "Switzerland", "ZRH", "Zurich"), ("lon", "London", "United Kingdom", "LHR", ""), ("par", "Paris", "France", "CDG", ""),
8
+ ("ber", "Berlin", "Germany", "BER", ""), ("mad", "Madrid", "Spain", "MAD", ""), ("rom", "Rome", "Italy", "FCO", "Roma"),
9
+ ("ams", "Amsterdam", "Netherlands", "AMS", ""), ("vie", "Vienna", "Austria", "VIE", "Wien"), ("muc", "Munich", "Germany", "MUC", "München"),
10
+ ("lis", "Lisbon", "Portugal", "LIS", "Lisboa"), ("prg", "Prague", "Czechia", "PRG", "Praha"), ("dub", "Dublin", "Ireland", "DUB", ""),
11
+ ("osl", "Oslo", "Norway", "OSL", ""), ("hel", "Helsinki", "Finland", "HEL", ""), ("bcn", "Barcelona", "Spain", "BCN", ""),
12
+ ("nyc", "New York", "United States", "JFK", ""), ("chi", "Chicago", "United States", "ORD", ""), ("tor", "Toronto", "Canada", "YYZ", ""),
13
+ ("tyo", "Tokyo", "Japan", "HND", ""), ("sel", "Seoul", "South Korea", "ICN", ""), ("sin", "Singapore", "Singapore", "SIN", ""),
14
+ ("bkk", "Bangkok", "Thailand", "BKK", ""), ("syd", "Sydney", "Australia", "SYD", ""), ("ist", "Istanbul", "Türkiye", "IST", ""),
15
+ ("mil", "Milan", "Italy", "MXP", "Milano"), ("man", "Manchester", "United Kingdom", "MAN", ""), ("mia", "Miami", "United States", "MIA", ""),
16
+ ("ath", "Athens", "Greece", "ATH", ""), ("waw", "Warsaw", "Poland", "WAW", ""), ("cph", "Copenhagen", "Denmark", "CPH", "")]
17
+ TODAY = dt.date(2026, 9, 25)
18
+ MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
19
+
20
+
21
+ def city_options(rng, airports):
22
+ out = []
23
+ for key, name, country, code, alias in CITIES:
24
+ out.append({"key": key, "label": f"{name}, {country}", "short": name, "alias": alias, "name": name})
25
+ if airports:
26
+ out.append({"key": key + "-ap", "label": f"{name} Airport ({code})", "short": f"{name} ({code})", "alias": code, "name": name})
27
+ return out
28
+
29
+
30
+ def say_date(d, rng):
31
+ return rng.choice([f"{MONTHS[d.month-1]} {d.day}, {d.year}", f"{d.day} {MONTHS[d.month-1]} {d.year}", f"{MONTHS[d.month-1]} {d.day}"])
32
+
33
+
34
+ def pick(rng, xs):
35
+ return rng.choice(xs)
36
+
37
+
38
+ def impl(rng, choices, weights=None):
39
+ return rng.choices(choices, weights=weights)[0]
40
+
41
+
42
+ # ------------------------------------------------------------------------------------------------ flight
43
+ def flight(seed):
44
+ rng = random.Random(seed * 7919 + 1)
45
+ trigger = rng.random() < 0.4
46
+ airports = rng.random() < 0.5
47
+ o, d = rng.sample(CITIES, 2)
48
+ one_way = rng.random() < 0.65
49
+ dep = TODAY + dt.timedelta(days=rng.randint(2, 80))
50
+ ret = dep + dt.timedelta(days=rng.randint(2, 14))
51
+ adults = rng.choices([1, 2, 3, 4], weights=[5, 3, 1, 1])[0]
52
+ cabin = rng.choices(["economy", "premium", "business", "first"], weights=[5, 2, 2, 1])[0]
53
+ lab = dict(origin=pick(rng, ["Where from?", "From", "Origin", "Leaving from", "Departure airport", "Flying from"]),
54
+ destination=pick(rng, ["Where to?", "To", "Destination", "Going to", "Arrival airport", "Flying to"]),
55
+ trip=pick(rng, ["Trip type", "Ticket type", "Trip"]), date=pick(rng, ["Departure", "Depart", "Departure date", "Outbound"]),
56
+ ret=pick(rng, ["Return", "Return date", "Inbound"]), adults=pick(rng, ["Adults", "Passengers", "Travelers"]),
57
+ cabin=pick(rng, ["Cabin", "Class", "Seating class", "Travel class"]), submit=pick(rng, ["Search", "Search flights", "Find flights", "Explore", "Show flights"]))
58
+ ow_label = pick(rng, ["One way", "One-way"])
59
+ date_impl = impl(rng, ["picker", "typed"], [8, 1])
60
+ date_done = pick(rng, [None, "Done", "Apply"]) if date_impl == "picker" else None
61
+ fields = [
62
+ {"w": "choice", "key": "trip", "label": lab["trip"], "impl": impl(rng, ["radio", "segmented", "select", "dropdown"]), "default": "round",
63
+ "options": [{"key": "round", "label": pick(rng, ["Round trip", "Return"])}, {"key": "oneway", "label": ow_label}]},
64
+ {"w": "combo", "key": "origin", "label": lab["origin"], "trigger": trigger, "suggest": rng.random() < 0.9,
65
+ "options": city_options(rng, airports), "placeholder": pick(rng, ["", "City or airport", "Leaving from"])},
66
+ {"w": "combo", "key": "destination", "label": lab["destination"], "trigger": trigger, "suggest": True,
67
+ "options": city_options(rng, airports), "placeholder": pick(rng, ["", "City or airport", "Going to"])},
68
+ {"w": "date", "key": "date", "label": lab["date"], "impl": date_impl, "done": date_done, "start": [TODAY.year, TODAY.month - 1]},
69
+ {"w": "date", "key": "ret", "label": lab["ret"], "impl": date_impl, "done": date_done, "start": [TODAY.year, TODAY.month - 1], "only_round": True},
70
+ {"w": "count", "key": "adults", "label": lab["adults"], "impl": impl(rng, ["select", "stepper", "popup"]), "default": 1, "min": 1, "max": 9,
71
+ "one": "adult", "many": "adults"},
72
+ {"w": "choice", "key": "cabin", "label": lab["cabin"], "impl": impl(rng, ["radio", "select", "dropdown", "segmented"], [2, 4, 4, 1]), "default": "economy",
73
+ "options": [{"key": "economy", "label": "Economy"}, {"key": "premium", "label": "Premium economy"}, {"key": "business", "label": "Business"},
74
+ {"key": "first", "label": "First"}]},
75
+ ]
76
+ target = {"trip": "oneway" if one_way else "round", "origin": o[0], "destination": d[0], "date": dep.isoformat(), "adults": adults, "cabin": cabin}
77
+ if not one_way:
78
+ target["ret"] = ret.isoformat()
79
+ # goal text: every constraint that differs from a default, plus some stated defaults
80
+ parts_trip = pick(rng, ["one-way flights", "a one-way flight", "one way flights"]) if one_way else pick(rng, ["round-trip flights", "a return flight", "round trip flights"])
81
+ who = {1: pick(rng, ["for one adult", "for 1 adult", ""]), 2: "for two adults", 3: "for 3 adults", 4: "for four adults"}[adults]
82
+ cab = {"economy": pick(rng, ["in economy", ""]), "premium": "in premium economy", "business": "in business class", "first": "in first class"}[cabin]
83
+ when = f"on {say_date(dep, rng)}" + ("" if one_way else f", returning {say_date(ret, rng)}")
84
+ o_name = o[4] if o[4] and rng.random() < 0.5 else o[1]
85
+ goal = " ".join(x for x in [pick(rng, ["Find", "Search for", "Look up", "Show me"]), parts_trip, f"from {o_name} to {d[1]}", when, who, cab] if x).strip() + "."
86
+ if rng.random() < 0.5:
87
+ goal += pick(rng, [" Stop when matching flight options are visible.", " Show the results.", " Stop at the results list."])
88
+ subgoals = [("trip", "Set the trip type to one-way" if one_way else "Set the trip type to round trip"),
89
+ ("origin", f"Set where from (origin, departure) to {o[1]}"), ("destination", f"Set where to (destination, arrival) to {d[1]}"),
90
+ ("date", f"Set the departure date to {MONTHS[dep.month-1]} {dep.day}, {dep.year}")]
91
+ if not one_way:
92
+ subgoals.append(("ret", f"Set the return date to {MONTHS[ret.month-1]} {ret.day}, {ret.year}"))
93
+ subgoals += [("adults", f"Set the number of adults to {adults}"), ("cabin", f"Set the cabin class to {dict(economy='economy', premium='premium economy', business='business', first='first')[cabin]}"),
94
+ ("submit", "Search for flights and show the matching results")]
95
+ if not one_way and rng.random() < 0.0:
96
+ pass
97
+ return common(rng, "flight", seed, fields, target, goal, subgoals, lab["submit"],
98
+ results_title=f"{o[1]} to {d[1]}")
99
+
100
+
101
+ # ------------------------------------------------------------------------------------------------ hotel
102
+ def hotel(seed):
103
+ rng = random.Random(seed * 104729 + 3)
104
+ trigger = rng.random() < 0.3
105
+ c = rng.choice(CITIES)
106
+ cin = TODAY + dt.timedelta(days=rng.randint(2, 70)); nights = rng.randint(1, 7); cout = cin + dt.timedelta(days=nights)
107
+ guests = rng.choices([1, 2, 3, 4], weights=[2, 5, 1, 1])[0]
108
+ date_done = pick(rng, [None, "Done", "Apply"])
109
+ lab = dict(dest=pick(rng, ["Destination", "Where are you going?", "City", "Location", "Going to"]),
110
+ cin=pick(rng, ["Check-in", "Check in", "Arrival"]), cout=pick(rng, ["Check-out", "Check out", "Departure"]),
111
+ guests=pick(rng, ["Guests", "Adults", "Travelers"]), submit=pick(rng, ["Search", "Search hotels", "Find stays", "Show hotels"]))
112
+ fields = [
113
+ {"w": "combo", "key": "dest", "label": lab["dest"], "trigger": trigger, "suggest": True, "options": city_options(rng, False),
114
+ "placeholder": pick(rng, ["", "Where to?", "Search destinations"])},
115
+ {"w": "date", "key": "cin", "label": lab["cin"], "impl": "picker", "done": date_done, "start": [TODAY.year, TODAY.month - 1]},
116
+ {"w": "date", "key": "cout", "label": lab["cout"], "impl": "picker", "done": date_done, "start": [TODAY.year, TODAY.month - 1]},
117
+ {"w": "count", "key": "guests", "label": lab["guests"], "impl": impl(rng, ["select", "stepper", "popup"]), "default": 2, "min": 1, "max": 8,
118
+ "one": "guest", "many": "guests"},
119
+ ]
120
+ target = {"dest": c[0], "cin": cin.isoformat(), "cout": cout.isoformat(), "guests": guests}
121
+ post = {}
122
+ if rng.random() < 0.5:
123
+ post["filter"] = rng.choice(["Free cancellation", "Breakfast included", "Pool", "Pet friendly"])
124
+ if rng.random() < 0.4:
125
+ post["sort"] = rng.choice(["Price: low to high", "Guest rating", "Distance to center"])
126
+ who = {1: "for one guest", 2: pick(rng, ["for two guests", "for 2 adults", ""]), 3: "for three guests", 4: "for 4 guests"}[guests]
127
+ goal = f"{pick(rng, ['Find a hotel', 'Search for hotels', 'Look for a place to stay', 'Find stays'])} in {c[1]} from {say_date(cin, rng)} to {say_date(cout, rng)} {who}".strip()
128
+ if post.get("filter"):
129
+ goal += f", {pick(rng, ['only showing', 'filtered to', 'with'])} {post['filter'].lower()}"
130
+ if post.get("sort"):
131
+ goal += f", sorted by {post['sort'].lower()}"
132
+ goal += "."
133
+ subgoals = [("dest", f"Set the destination (city, location) to {c[1]}"), ("cin", f"Set the check-in date to {MONTHS[cin.month-1]} {cin.day}, {cin.year}"),
134
+ ("cout", f"Set the check-out date to {MONTHS[cout.month-1]} {cout.day}, {cout.year}"), ("guests", f"Set the number of guests to {guests}"),
135
+ ("submit", "Search for hotels and show the results")]
136
+ if post.get("filter"):
137
+ subgoals.append(("filter", f"Turn on the '{post['filter']}' filter"))
138
+ if post.get("sort"):
139
+ subgoals.append(("sort", f"Sort the results by {post['sort'].lower()}"))
140
+ return common(rng, "hotel", seed, fields, target, goal, subgoals, lab["submit"], results_title=f"Stays in {c[1]}", post=post)
141
+
142
+
143
+ # ------------------------------------------------------------------------------------------------ shop listing
144
+ BRANDS = ["Acme", "Globex", "Initech", "Umbrella", "Hooli", "Stark", "Wayne", "Tyrell"]
145
+ PRODUCTS = ["Laptop", "Headphones", "Backpack", "Coffee maker", "Desk lamp", "Keyboard", "Monitor", "Water bottle", "Running shoes", "Camera",
146
+ "Blender", "Jacket", "Tent", "Watch", "Speaker", "Router"]
147
+
148
+
149
+ def shop(seed):
150
+ rng = random.Random(seed * 15485863 + 5)
151
+ cat = rng.choice(["Electronics", "Home", "Outdoor", "Fashion", "Kitchen"])
152
+ items = []
153
+ for i in range(48):
154
+ r = random.Random(seed * 1000 + i)
155
+ items.append({"id": i, "name": f"{r.choice(BRANDS)} {r.choice(PRODUCTS)} {r.choice(['Pro', 'Lite', 'Max', 'Mini', 'Plus', 'X', '2', 'S'])}",
156
+ "brand": None, "price": round(r.uniform(9, 900), 2)})
157
+ items[-1]["brand"] = items[-1]["name"].split()[0]
158
+ per_page = rng.choice([12, 16])
159
+ task = rng.choice(["page", "sort", "brand", "search", "search_sort", "brand_page", "open_on_page"])
160
+ post, goal, subgoals = {}, "", []
161
+ if task == "page":
162
+ n = rng.choice([2, 2, 3])
163
+ post["page"] = n
164
+ goal = pick(rng, [f"Go to page {n} of the products.", f"Show page {n}.", f"Open page {n} of the listing.", "Go to the next page of products." if n == 2 else f"Go to page {n}."])
165
+ subgoals = [("page", f"Go to page {n} of the product list")]
166
+ elif task == "sort":
167
+ s = rng.choice(["Price: low to high", "Price: high to low", "Newest", "Top rated"])
168
+ post["sort"] = s
169
+ goal = pick(rng, [f"Sort the products by {s.lower()}.", f"Show the products sorted by {s.lower()}.", f"{s}, please."])
170
+ subgoals = [("sort", f"Sort the products by {s.lower()}")]
171
+ elif task == "brand":
172
+ b = rng.choice(BRANDS); post["brand"] = b
173
+ goal = pick(rng, [f"Show only {b} products.", f"Filter the list to the brand {b}.", f"I only want to see {b} items."])
174
+ subgoals = [("brand", f"Turn on the brand filter for {b}")]
175
+ elif task == "search":
176
+ q = rng.choice(PRODUCTS); post["q"] = q.lower()
177
+ goal = pick(rng, [f"Search the shop for '{q.lower()}'.", f"Find {q.lower()}s.", f"Search for {q.lower()} and show the results."])
178
+ subgoals = [("q", f"Search for '{q.lower()}' and show the results")]
179
+ elif task == "search_sort":
180
+ q = rng.choice(PRODUCTS); s = rng.choice(["Price: low to high", "Price: high to low"]); post.update(q=q.lower(), sort=s)
181
+ goal = f"Search for {q.lower()} and sort the results by {s.lower()}."
182
+ subgoals = [("q", f"Search for '{q.lower()}' and show the results"), ("sort", f"Sort the results by {s.lower()}")]
183
+ elif task == "brand_page":
184
+ counts = {x: sum(i["brand"] == x for i in items) for x in BRANDS}
185
+ ok = [x for x in BRANDS if counts[x] > per_page] or [max(counts, key=counts.get)]
186
+ b = rng.choice(ok); post.update(brand=b, page=2)
187
+ if counts[b] <= per_page: # not enough items for a second page: make it a plain brand task
188
+ post.pop("page"); goal = f"Show only {b} products."; subgoals = [("brand", f"Turn on the brand filter for {b}")]
189
+ return shop_spec(rng, seed, cat, items, per_page, post, goal, subgoals)
190
+ goal = f"Show only {b} products and go to page 2."
191
+ subgoals = [("brand", f"Turn on the brand filter for {b}"), ("page", "Go to page 2 of the product list")]
192
+ else:
193
+ idx = rng.randint(per_page, min(47, 2 * per_page - 1)); post.update(page=2, open=idx)
194
+ goal = f"Open the product '{items[idx]['name']}' (it is on page 2)." if rng.random() < 0.5 else f"Go to page 2 and open '{items[idx]['name']}'."
195
+ subgoals = [("page", "Go to page 2 of the product list"), ("open", f"Open the product page of '{items[idx]['name']}'")]
196
+ return shop_spec(rng, seed, cat, items, per_page, post, goal, subgoals)
197
+
198
+
199
+ def shop_spec(rng, seed, cat, items, per_page, post, goal, subgoals):
200
+ return {"kind": "shop", "seed": seed, "category": cat, "items": items, "per_page": per_page, "post": post, "goal": goal, "subgoals": subgoals,
201
+ "search_button": rng.random() < 0.5, "sort_impl": impl(rng, ["select", "dropdown"]), "pager": pick(rng, ["numbers", "next", "both"]),
202
+ "hero": rng.choice([0, 0, 200, 450]), "cookie": rng.random() < 0.25, "held_out": seed % 10 == 0,
203
+ "labels": {"search": pick(rng, ["Search products", "Search", "What are you looking for?"]), "sort": pick(rng, ["Sort by", "Sort", "Order by"]),
204
+ "brand": pick(rng, ["Brand", "Brands", "Manufacturer"]), "next": pick(rng, ["Next", "Next ›", "Next page", "›"])}}
205
+
206
+
207
+ # ------------------------------------------------------------------------------------------------ shared
208
+ def common(rng, kind, seed, fields, target, goal, subgoals, submit, results_title, post=None):
209
+ rng.shuffle(order := [f["key"] for f in fields])
210
+ # keep a natural order most of the time (trip type first, then places, dates, counts, class), shuffled otherwise
211
+ natural = rng.random() < 0.7
212
+ return {"kind": kind, "seed": seed, "fields": fields, "target": target, "goal": goal, "subgoals": subgoals, "submit": submit,
213
+ "order": [f["key"] for f in fields] if natural else order, "results_title": results_title, "post": post or {},
214
+ "hero": rng.choice([0, 0, 0, 300, 650]), "cookie": rng.random() < 0.25, "held_out": seed % 10 == 0,
215
+ "decoys": rng.sample(["Deals", "Help", "Sign in", "Manage booking", "Explore", "Travel guides", "Gift cards", "Careers", "Blog"], 4)}
216
+
217
+
218
+ KINDS = {"flight": flight, "hotel": hotel, "shop": shop}
219
+
220
+
221
+ def make(kind, seed):
222
+ return KINDS[kind](seed)
code/finetune/webgym/widgets.js ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // webgym widget library: every widget keeps its committed value in window.__gym.state, exactly like a real site
2
+ // (typing into an autocomplete field does NOT commit a value until an option is chosen).
3
+ (function () {
4
+ const G = window.__gym = window.__gym || { state: {}, fields: {} };
5
+ const $ = (s, r = document) => r.querySelector(s);
6
+ const el = (tag, attrs = {}, ...kids) => {
7
+ const e = document.createElement(tag);
8
+ for (const [k, v] of Object.entries(attrs)) {
9
+ if (k === "text") e.textContent = v; else if (k.startsWith("on")) e.addEventListener(k.slice(2), v); else e.setAttribute(k, v);
10
+ }
11
+ for (const k of kids) e.append(k);
12
+ return e;
13
+ };
14
+ const norm = s => s.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase();
15
+ const close = d => { d.hidden = true; };
16
+
17
+ // ---------------------------------------------------------------- autocomplete (inline or behind a trigger button)
18
+ G.combo = function (host, f) {
19
+ const id = f.key;
20
+ const input = el("input", { id: id + "-input", "data-g": id + "-input", type: "text", autocomplete: "off", role: "combobox",
21
+ "aria-autocomplete": "list", "aria-expanded": "false", "aria-controls": id + "-list", placeholder: f.placeholder || "" });
22
+ const label = el("label", { for: id + "-input", text: f.label });
23
+ const list = el("ul", { id: id + "-list", role: "listbox", class: "list" }); list.hidden = true;
24
+ const commit = opt => {
25
+ G.state[id] = opt.key; input.value = opt.short; list.hidden = true; input.setAttribute("aria-expanded", "false");
26
+ if (trigger) { trigger.querySelector(".v").textContent = opt.short; close(dialog); }
27
+ };
28
+ const render = () => {
29
+ const q = norm(input.value.trim()); list.innerHTML = "";
30
+ if (!f.suggest) { G.state[id] = input.value.trim() ? "text:" + input.value.trim() : null; return; }
31
+ if (q.length < 2) { list.hidden = true; input.setAttribute("aria-expanded", "false"); return; }
32
+ const hits = f.options.filter(o => norm(o.label).includes(q) || norm(o.alias || "").includes(q)).slice(0, 6);
33
+ hits.forEach((o, i) => list.append(el("li", { role: "option", tabindex: "-1", "data-g": id + "-opt-" + o.key, class: "opt",
34
+ onclick: () => commit(o) }, o.label)));
35
+ list.hidden = !hits.length; input.setAttribute("aria-expanded", String(!!hits.length));
36
+ };
37
+ input.addEventListener("input", render);
38
+ input.addEventListener("blur", () => setTimeout(() => { list.hidden = true; input.setAttribute("aria-expanded", "false"); }, 250));
39
+ input.addEventListener("focus", () => { if (input.value.trim().length >= 2 && f.suggest) render(); });
40
+ input.addEventListener("keydown", e => {
41
+ if (e.key === "Enter") { e.preventDefault(); const first = list.querySelector("[role=option]"); if (first && !list.hidden) first.click(); }
42
+ });
43
+ let trigger = null, dialog = null;
44
+ if (f.trigger) { // Google-style: a button shows the value; clicking it opens a dialog with the real input
45
+ trigger = el("button", { type: "button", "data-g": id + "-trigger", "aria-haspopup": "dialog", class: "trig" },
46
+ el("span", { class: "k", text: f.label + " " }), el("span", { class: "v", text: f.empty || "" }));
47
+ dialog = el("div", { role: "dialog", "aria-label": f.label, class: "dlg", "data-g": id + "-dialog" }, label, input, list,
48
+ el("button", { type: "button", "data-g": id + "-close", onclick: () => close(dialog), text: "Close" }));
49
+ dialog.hidden = true;
50
+ trigger.addEventListener("click", () => { dialog.hidden = false; input.value = ""; input.focus(); });
51
+ host.append(trigger, dialog);
52
+ } else host.append(label, input, list);
53
+ G.fields[id] = { kind: "combo", trigger: !!f.trigger, suggest: !!f.suggest };
54
+ G.state[id] = null;
55
+ };
56
+
57
+ // ---------------------------------------------------------------- one-of: radio group, segmented buttons, native select, custom dropdown
58
+ G.choice = function (host, f) {
59
+ const id = f.key; G.state[id] = f.default; G.fields[id] = { kind: "choice", impl: f.impl };
60
+ const legend = f.label;
61
+ if (f.impl === "radio") {
62
+ const fs = el("fieldset", {}, el("legend", { text: legend }));
63
+ f.options.forEach(o => {
64
+ const r = el("input", { type: "radio", name: id, id: id + "-" + o.key, value: o.key, "data-g": id + "-" + o.key });
65
+ if (o.key === f.default) r.checked = true;
66
+ r.addEventListener("change", () => { G.state[id] = o.key; });
67
+ fs.append(el("span", { class: "ro" }, r, el("label", { for: id + "-" + o.key, text: o.label })));
68
+ });
69
+ host.append(fs);
70
+ } else if (f.impl === "segmented") {
71
+ const g = el("div", { role: "group", "aria-label": legend, class: "seg" });
72
+ f.options.forEach(o => {
73
+ const b = el("button", { type: "button", "data-g": id + "-" + o.key, "aria-pressed": String(o.key === f.default), text: o.label });
74
+ b.addEventListener("click", () => { G.state[id] = o.key; g.querySelectorAll("button").forEach(x => x.setAttribute("aria-pressed", String(x === b))); });
75
+ g.append(b);
76
+ });
77
+ host.append(el("span", { class: "k", text: legend + ": " }), g);
78
+ } else if (f.impl === "select") {
79
+ const s = el("select", { id: id + "-select", "data-g": id + "-select" });
80
+ f.options.forEach(o => { const op = el("option", { value: o.key, text: o.label }); if (o.key === f.default) op.selected = true; s.append(op); });
81
+ s.addEventListener("change", () => { G.state[id] = s.value; });
82
+ host.append(el("label", { for: id + "-select", text: legend }), s);
83
+ } else { // custom dropdown: button showing the value -> listbox of options
84
+ const cur = () => f.options.find(o => o.key === G.state[id]).label;
85
+ const b = el("button", { type: "button", "data-g": id + "-trigger", "aria-haspopup": "listbox", "aria-expanded": "false",
86
+ "aria-label": legend + ": " + cur(), text: cur() + " ▾" });
87
+ const lb = el("div", { role: "listbox", "aria-label": legend, class: "list" }); lb.hidden = true;
88
+ f.options.forEach(o => lb.append(el("div", { role: "option", "data-g": id + "-" + o.key, tabindex: "-1", class: "opt",
89
+ onclick: () => { G.state[id] = o.key; b.textContent = o.label + " ▾"; b.setAttribute("aria-label", legend + ": " + o.label);
90
+ lb.hidden = true; b.setAttribute("aria-expanded", "false"); } }, o.label)));
91
+ b.addEventListener("click", () => { lb.hidden = !lb.hidden; b.setAttribute("aria-expanded", String(!lb.hidden)); });
92
+ host.append(el("span", { class: "k", text: legend + " " }), b, lb);
93
+ }
94
+ };
95
+
96
+ // ---------------------------------------------------------------- date picker (month grid) or a typed date field
97
+ const MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
98
+ const DAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
99
+ G.fmt = d => `${DAYS[d.getDay()]}, ${MONTHS[d.getMonth()]} ${d.getDate()}, ${d.getFullYear()}`;
100
+ G.date = function (host, f) {
101
+ const id = f.key; G.state[id] = null; G.fields[id] = { kind: "date", impl: f.impl, done: !!f.done };
102
+ if (f.impl === "typed") {
103
+ const i = el("input", { id: id + "-input", "data-g": id + "-input", type: "text", placeholder: "MM/DD/YYYY" });
104
+ i.addEventListener("input", () => {
105
+ const m = i.value.trim().match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/) || i.value.trim().match(/^(\d{4})-(\d{2})-(\d{2})$/);
106
+ if (!m) { G.state[id] = null; return; }
107
+ const d = i.value.includes("/") ? new Date(+m[3], +m[1] - 1, +m[2]) : new Date(+m[1], +m[2] - 1, +m[3]);
108
+ G.state[id] = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
109
+ });
110
+ host.append(el("label", { for: id + "-input", text: f.label }), i);
111
+ return;
112
+ }
113
+ let view = new Date(f.start[0], f.start[1], 1), picked = null;
114
+ const shown = el("span", { class: "v", text: f.empty || "" });
115
+ const trig = el("button", { type: "button", "data-g": id + "-trigger", "aria-haspopup": "dialog", class: "trig" },
116
+ el("span", { class: "k", text: f.label + " " }), shown);
117
+ const dlg = el("div", { role: "dialog", "aria-label": f.label + " calendar", class: "dlg cal", "data-g": id + "-dialog" }); dlg.hidden = true;
118
+ const title = el("strong", {});
119
+ const grid = el("div", { role: "grid", class: "grid" });
120
+ const draw = () => {
121
+ title.textContent = MONTHS[view.getMonth()] + " " + view.getFullYear(); grid.innerHTML = "";
122
+ const n = new Date(view.getFullYear(), view.getMonth() + 1, 0).getDate();
123
+ for (let day = 1; day <= n; day++) {
124
+ const d = new Date(view.getFullYear(), view.getMonth(), day), iso = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
125
+ const b = el("button", { type: "button", "data-g": id + "-day-" + iso, "aria-label": G.fmt(d), "aria-pressed": String(picked === iso), text: String(day) });
126
+ b.addEventListener("click", () => {
127
+ picked = iso; shown.textContent = G.fmt(d).slice(0, -6); draw();
128
+ if (!f.done) { G.state[id] = iso; dlg.hidden = true; }
129
+ });
130
+ grid.append(b);
131
+ }
132
+ };
133
+ const nav = (k, lab) => el("button", { type: "button", "data-g": id + "-" + k, "aria-label": lab, text: k === "prev" ? "‹" : "›",
134
+ onclick: () => { view = new Date(view.getFullYear(), view.getMonth() + (k === "prev" ? -1 : 1), 1); draw(); } });
135
+ dlg.append(el("div", { class: "hdr" }, nav("prev", "Previous month"), title, nav("next", "Next month")), grid,
136
+ el("button", { type: "button", "data-g": id + "-close", "aria-label": "Close calendar", text: "\u2715", onclick: () => { dlg.hidden = true; } }));
137
+ if (f.done) dlg.append(el("button", { type: "button", "data-g": id + "-done", text: f.done,
138
+ onclick: () => { if (picked) G.state[id] = picked; dlg.hidden = true; } }));
139
+ trig.addEventListener("click", () => { dlg.hidden = false; draw(); });
140
+ host.append(trig, dlg);
141
+ };
142
+
143
+ // ---------------------------------------------------------------- counts: native select, stepper, or a popup with steppers
144
+ G.count = function (host, f) {
145
+ const id = f.key; G.state[id] = f.default; G.fields[id] = { kind: "count", impl: f.impl };
146
+ const noun = n => n + " " + (n === 1 ? f.one : f.many);
147
+ if (f.impl === "select") {
148
+ const s = el("select", { id: id + "-select", "data-g": id + "-select" });
149
+ for (let n = f.min; n <= f.max; n++) { const o = el("option", { value: String(n), text: noun(n) }); if (n === f.default) o.selected = true; s.append(o); }
150
+ s.addEventListener("change", () => { G.state[id] = +s.value; });
151
+ host.append(el("label", { for: id + "-select", text: f.label }), s);
152
+ return;
153
+ }
154
+ const val = el("span", { class: "v", "aria-live": "polite", text: String(f.default) });
155
+ const step = d => { G.state[id] = Math.max(f.min, Math.min(f.max, G.state[id] + d)); val.textContent = String(G.state[id]);
156
+ if (sum) sum.textContent = noun(G.state[id]); };
157
+ const box = el("div", { class: "step" }, el("span", { class: "k", text: f.label + " " }),
158
+ el("button", { type: "button", "data-g": id + "-dec", "aria-label": "Decrease " + f.many, text: "−", onclick: () => step(-1) }), val,
159
+ el("button", { type: "button", "data-g": id + "-inc", "aria-label": "Increase " + f.many, text: "+", onclick: () => step(1) }));
160
+ let sum = null;
161
+ if (f.impl === "popup") {
162
+ sum = el("span", { class: "v", text: noun(f.default) });
163
+ const dlg = el("div", { role: "dialog", "aria-label": f.label, class: "dlg", "data-g": id + "-dialog" }, box,
164
+ el("button", { type: "button", "data-g": id + "-done", text: "Done", onclick: () => { dlg.hidden = true; } }));
165
+ dlg.hidden = true;
166
+ const trig = el("button", { type: "button", "data-g": id + "-trigger", "aria-haspopup": "dialog", class: "trig" }, sum);
167
+ trig.addEventListener("click", () => { dlg.hidden = false; });
168
+ host.append(trig, dlg);
169
+ } else host.append(box);
170
+ };
171
+
172
+ // ---------------------------------------------------------------- plumbing for the expert
173
+ G.status = () => {
174
+ const open = [...document.querySelectorAll("[role=dialog],[role=listbox]")].filter(d => !d.hidden && d.offsetParent !== null)
175
+ .map(d => d.getAttribute("data-g") || d.id || d.getAttribute("aria-label"));
176
+ return { state: G.state, fields: G.fields, open, url: location.href };
177
+ };
178
+ G.node = sel => { const e = document.querySelector(sel); const c = window.__jevFast; return e && c ? (c.ids.get(e) || null) : null; };
179
+ G.nodeText = (sel, text) => {
180
+ const c = window.__jevFast; if (!c) return null;
181
+ const e = [...document.querySelectorAll(sel)].find(x => x.textContent.trim() === text);
182
+ return e ? (c.ids.get(e) || null) : null;
183
+ };
184
+ G.where = sel => { // -1 above the viewport, 0 inside, 1 below, null missing/hidden
185
+ const e = document.querySelector(sel); if (!e || !e.checkVisibility()) return null; const r = e.getBoundingClientRect();
186
+ const cy = r.y + r.height / 2; // jev offers an element only when its center is inside the viewport
187
+ return cy < 0 ? -1 : cy >= innerHeight ? 1 : 0;
188
+ };
189
+ G.attr = (sel, a) => { const e = document.querySelector(sel); return e ? e.getAttribute(a) : null; };
190
+ G.visible = sel => {
191
+ const e = document.querySelector(sel); if (!e) return false; const r = e.getBoundingClientRect();
192
+ return r.width > 0 && r.bottom > 0 && r.top < innerHeight && e.checkVisibility();
193
+ };
194
+ })();
code/jev-ultrafast.patch CHANGED
The diff for this file is too large to render. See raw diff
 
code/kernels/fast.py CHANGED
@@ -190,8 +190,25 @@ class FastLaya:
190
  p = torch.softmax(logits, -1)
191
  k = marker_mask.sum(-1).clamp(min=2).float()
192
  ent = -(p * torch.log(p.clamp_min(1e-9))).sum(-1) / torch.log(k)
193
- top2 = p.topk(2, -1).values
 
194
  feats = torch.stack([top2[:, 0], top2[:, 0] - top2[:, 1], ent, k / 255.0], -1)
195
  pooled = h[:, 0].float()
196
  act_logits = m.act_head(torch.cat([pooled, feats], -1))
197
  return logits, act_logits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  p = torch.softmax(logits, -1)
191
  k = marker_mask.sum(-1).clamp(min=2).float()
192
  ent = -(p * torch.log(p.clamp_min(1e-9))).sum(-1) / torch.log(k)
193
+ # a choice with a single option (e.g. only WAIT left after exclusions): pad the second slot, as upstream does
194
+ top2 = p.topk(2, -1).values if p.shape[-1] >= 2 else torch.stack([p[:, 0], torch.zeros_like(p[:, 0])], dim=-1)
195
  feats = torch.stack([top2[:, 0], top2[:, 0] - top2[:, 1], ent, k / 255.0], -1)
196
  pooled = h[:, 0].float()
197
  act_logits = m.act_head(torch.cat([pooled, feats], -1))
198
  return logits, act_logits
199
+
200
+
201
+ def accelerate(agent, use_graphs=True, verbose=False):
202
+ """Patch a laya Agent in place so agent.predict() uses the TileLang fast path. Returns the FastLaya."""
203
+ fast = FastLaya(agent.model, max_len=agent.cfg.get("max_len", 1024), use_graphs=use_graphs, verbose=verbose)
204
+ if not hasattr(agent, "_orig_forward"):
205
+ agent._orig_forward = agent.model.forward
206
+ agent.model.forward = fast.forward
207
+ agent.fast = fast
208
+ return fast
209
+
210
+
211
+ def restore(agent):
212
+ if hasattr(agent, "_orig_forward"):
213
+ agent.model.forward = agent._orig_forward
214
+ del agent._orig_forward
results/round3/gym_eval_v14s.json ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "kind": "flight",
4
+ "seed": 900000,
5
+ "ok": false,
6
+ "steps": 1,
7
+ "status": "done",
8
+ "wall": 1.5,
9
+ "url": "http://127.0.0.1:8811/t/flight/900000#pop-ber",
10
+ "goal": "Show me a return flight from Oslo to Berlin on October 18, returning 23 October 2026 for 3 adults in premium economy. Stop when matching flight options are visible.",
11
+ "plan": [
12
+ "Show me a return flight from Oslo to Berlin on October 18, returning 23 October 2026 for 3 adults in premium economy. Stop when matching flight options are visible."
13
+ ]
14
+ },
15
+ {
16
+ "kind": "flight",
17
+ "seed": 900010,
18
+ "ok": false,
19
+ "steps": 2,
20
+ "status": "done",
21
+ "wall": 1.3,
22
+ "url": "http://127.0.0.1:8811/t/flight/900010",
23
+ "goal": "Look up round-trip flights from Tokyo to Amsterdam on October 13, returning 20 October 2026 for two adults in first class.",
24
+ "plan": [
25
+ "Look up round-trip flights from Tokyo to Amsterdam on October 13, returning 20 October 2026 for two adults in first class."
26
+ ]
27
+ },
28
+ {
29
+ "kind": "flight",
30
+ "seed": 900020,
31
+ "ok": false,
32
+ "steps": 1,
33
+ "status": "done",
34
+ "wall": 1.1,
35
+ "url": "http://127.0.0.1:8811/t/flight/900020",
36
+ "goal": "Search for one-way flights from Roma to Seoul on 15 October 2026 for two adults. Stop when matching flight options are visible.",
37
+ "plan": [
38
+ "Search for one-way flights from Roma to Seoul on 15 October 2026 for two adults. Stop when matching flight options are visible."
39
+ ]
40
+ },
41
+ {
42
+ "kind": "flight",
43
+ "seed": 900030,
44
+ "ok": false,
45
+ "steps": 40,
46
+ "status": "ready",
47
+ "wall": 6.2,
48
+ "url": "http://127.0.0.1:8811/t/flight/900030",
49
+ "goal": "Show me a one-way flight from Helsinki to Munich on 26 October 2026 for four adults in business class.",
50
+ "plan": [
51
+ "Show me a one-way flight from Helsinki to Munich on 26 October 2026 for four adults in business class."
52
+ ]
53
+ },
54
+ {
55
+ "kind": "flight",
56
+ "seed": 900040,
57
+ "ok": false,
58
+ "steps": 4,
59
+ "status": "done",
60
+ "wall": 1.6,
61
+ "url": "http://127.0.0.1:8811/t/flight/900040/results?trip=round&adults=1&cabin=economy#flight-3",
62
+ "goal": "Show me one way flights from Manchester to Bangkok on November 21 for 3 adults in business class.",
63
+ "plan": [
64
+ "Show me one way flights from Manchester to Bangkok on November 21 for 3 adults in business class."
65
+ ]
66
+ },
67
+ {
68
+ "kind": "flight",
69
+ "seed": 900050,
70
+ "ok": false,
71
+ "steps": 7,
72
+ "status": "blocked",
73
+ "wall": 1.9,
74
+ "url": "http://127.0.0.1:8811/t/flight/900050",
75
+ "goal": "Show me a one-way flight from Amsterdam to Barcelona on November 8, 2026 for 1 adult in economy.",
76
+ "plan": [
77
+ "Show me a one-way flight from Amsterdam to Barcelona on November 8, 2026 for 1 adult in economy."
78
+ ]
79
+ },
80
+ {
81
+ "kind": "flight",
82
+ "seed": 900060,
83
+ "ok": false,
84
+ "steps": 21,
85
+ "status": "blocked",
86
+ "wall": 3.2,
87
+ "url": "http://127.0.0.1:8811/t/flight/900060",
88
+ "goal": "Find one-way flights from Seoul to Copenhagen on 10 October 2026 for two adults in business class.",
89
+ "plan": [
90
+ "Find one-way flights from Seoul to Copenhagen on 10 October 2026 for two adults in business class."
91
+ ]
92
+ },
93
+ {
94
+ "kind": "flight",
95
+ "seed": 900070,
96
+ "ok": false,
97
+ "steps": 40,
98
+ "status": "ready",
99
+ "wall": 10.3,
100
+ "url": "http://127.0.0.1:8811/t/flight/900070",
101
+ "goal": "Look up a return flight from Barcelona to New York on November 13, returning November 27 for 1 adult. Stop when matching flight options are visible.",
102
+ "plan": [
103
+ "Look up a return flight from Barcelona to New York on November 13, returning November 27 for 1 adult. Stop when matching flight options are visible."
104
+ ]
105
+ },
106
+ {
107
+ "kind": "hotel",
108
+ "seed": 900000,
109
+ "ok": false,
110
+ "steps": 2,
111
+ "status": "done",
112
+ "wall": 1.1,
113
+ "url": "http://127.0.0.1:8811/t/hotel/900000/results?guests=2&sort=Price%3A+low+to+high",
114
+ "goal": "Find a hotel in Toronto from 31 October 2026 to November 2, sorted by price: low to high.",
115
+ "plan": [
116
+ "Find a hotel in Toronto from 31 October 2026 to November 2, sorted by price: low to high."
117
+ ]
118
+ },
119
+ {
120
+ "kind": "hotel",
121
+ "seed": 900010,
122
+ "ok": false,
123
+ "steps": 1,
124
+ "status": "done",
125
+ "wall": 1.1,
126
+ "url": "http://127.0.0.1:8811/t/hotel/900010/results?guests=2",
127
+ "goal": "Search for hotels in Chicago from 30 October 2026 to November 1 for three guests, sorted by price: low to high.",
128
+ "plan": [
129
+ "Search for hotels in Chicago from 30 October 2026 to November 1 for three guests, sorted by price: low to high."
130
+ ]
131
+ },
132
+ {
133
+ "kind": "hotel",
134
+ "seed": 900020,
135
+ "ok": false,
136
+ "steps": 40,
137
+ "status": "ready",
138
+ "wall": 5.3,
139
+ "url": "http://127.0.0.1:8811/t/hotel/900020/results?guests=2#home",
140
+ "goal": "Find a hotel in Oslo from 30 October 2026 to November 3, 2026 for one guest, only showing pet friendly.",
141
+ "plan": [
142
+ "Find a hotel in Oslo from 30 October 2026 to November 3, 2026 for one guest, only showing pet friendly."
143
+ ]
144
+ },
145
+ {
146
+ "kind": "hotel",
147
+ "seed": 900030,
148
+ "ok": false,
149
+ "steps": 4,
150
+ "status": "done",
151
+ "wall": 1.6,
152
+ "url": "http://127.0.0.1:8811/t/hotel/900030",
153
+ "goal": "Find stays in Toronto from November 16, 2026 to November 21, 2026, filtered to pet friendly.",
154
+ "plan": [
155
+ "Find stays in Toronto from November 16, 2026 to November 21, 2026, filtered to pet friendly."
156
+ ]
157
+ },
158
+ {
159
+ "kind": "hotel",
160
+ "seed": 900040,
161
+ "ok": false,
162
+ "steps": 2,
163
+ "status": "done",
164
+ "wall": 1.4,
165
+ "url": "http://127.0.0.1:8811/t/hotel/900040",
166
+ "goal": "Search for hotels in Tokyo from 14 November 2026 to 15 November 2026, with pet friendly.",
167
+ "plan": [
168
+ "Search for hotels in Tokyo from 14 November 2026 to 15 November 2026, with pet friendly."
169
+ ]
170
+ },
171
+ {
172
+ "kind": "hotel",
173
+ "seed": 900050,
174
+ "ok": false,
175
+ "steps": 40,
176
+ "status": "ready",
177
+ "wall": 4.5,
178
+ "url": "http://127.0.0.1:8811/t/hotel/900050/results?guests=2&sort=Guest+rating#home",
179
+ "goal": "Find stays in Copenhagen from December 4 to December 7, 2026 for one guest, sorted by guest rating.",
180
+ "plan": [
181
+ "Find stays in Copenhagen from December 4 to December 7, 2026 for one guest, sorted by guest rating."
182
+ ]
183
+ },
184
+ {
185
+ "kind": "hotel",
186
+ "seed": 900060,
187
+ "ok": false,
188
+ "steps": 2,
189
+ "status": "done",
190
+ "wall": 1.3,
191
+ "url": "http://127.0.0.1:8811/t/hotel/900060",
192
+ "goal": "Find stays in Rome from November 3, 2026 to 10 November 2026 for 4 guests.",
193
+ "plan": [
194
+ "Find stays in Rome from November 3, 2026 to 10 November 2026 for 4 guests."
195
+ ]
196
+ },
197
+ {
198
+ "kind": "hotel",
199
+ "seed": 900070,
200
+ "ok": false,
201
+ "steps": 40,
202
+ "status": "ready",
203
+ "wall": 4.5,
204
+ "url": "http://127.0.0.1:8811/t/hotel/900070/results?guests=4&filter=Free+cancellation#home",
205
+ "goal": "Find a hotel in Chicago from 27 September 2026 to October 4, only showing free cancellation.",
206
+ "plan": [
207
+ "Find a hotel in Chicago from 27 September 2026 to October 4, only showing free cancellation."
208
+ ]
209
+ },
210
+ {
211
+ "kind": "shop",
212
+ "seed": 900000,
213
+ "ok": false,
214
+ "steps": 2,
215
+ "status": "done",
216
+ "wall": 1.2,
217
+ "url": "http://127.0.0.1:8811/t/shop/900000/p/4",
218
+ "goal": "Go to page 2 and open 'Hooli Water bottle X'.",
219
+ "plan": [
220
+ "Go to page 2 and open 'Hooli Water bottle X'."
221
+ ]
222
+ },
223
+ {
224
+ "kind": "shop",
225
+ "seed": 900010,
226
+ "ok": true,
227
+ "steps": 1,
228
+ "status": "done",
229
+ "wall": 1.1,
230
+ "url": "http://127.0.0.1:8811/t/shop/900010?sort=Price%3A+low+to+high",
231
+ "goal": "Sort the products by price: low to high.",
232
+ "plan": [
233
+ "Sort the products by price: low to high."
234
+ ]
235
+ },
236
+ {
237
+ "kind": "shop",
238
+ "seed": 900020,
239
+ "ok": false,
240
+ "steps": 8,
241
+ "status": "blocked",
242
+ "wall": 1.9,
243
+ "url": "http://127.0.0.1:8811/t/shop/900020/p/8#home",
244
+ "goal": "Show page 3.",
245
+ "plan": [
246
+ "Show page 3."
247
+ ]
248
+ },
249
+ {
250
+ "kind": "shop",
251
+ "seed": 900030,
252
+ "ok": false,
253
+ "steps": 0,
254
+ "status": "done",
255
+ "wall": 1.0,
256
+ "url": "http://127.0.0.1:8811/t/shop/900030",
257
+ "goal": "Find water bottles.",
258
+ "plan": [
259
+ "Find water bottles."
260
+ ]
261
+ },
262
+ {
263
+ "kind": "shop",
264
+ "seed": 900040,
265
+ "ok": false,
266
+ "steps": 1,
267
+ "status": "done",
268
+ "wall": 1.2,
269
+ "url": "http://127.0.0.1:8811/t/shop/900040/p/2",
270
+ "goal": "Show only Hooli products.",
271
+ "plan": [
272
+ "Show only Hooli products."
273
+ ]
274
+ },
275
+ {
276
+ "kind": "shop",
277
+ "seed": 900050,
278
+ "ok": true,
279
+ "steps": 2,
280
+ "status": "done",
281
+ "wall": 1.1,
282
+ "url": "http://127.0.0.1:8811/t/shop/900050?brand=Acme&sort=Price%3A+low+to+high",
283
+ "goal": "Filter the list to the brand Acme.",
284
+ "plan": [
285
+ "Filter the list to the brand Acme."
286
+ ]
287
+ },
288
+ {
289
+ "kind": "shop",
290
+ "seed": 900060,
291
+ "ok": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 1.4,
295
+ "url": "http://127.0.0.1:8811/t/shop/900060?q=backpack",
296
+ "goal": "Search the shop for 'backpack'.",
297
+ "plan": [
298
+ "Search the shop for 'backpack'."
299
+ ]
300
+ },
301
+ {
302
+ "kind": "shop",
303
+ "seed": 900070,
304
+ "ok": true,
305
+ "steps": 1,
306
+ "status": "done",
307
+ "wall": 1.1,
308
+ "url": "http://127.0.0.1:8811/t/shop/900070?brand=Umbrella",
309
+ "goal": "I only want to see Umbrella items.",
310
+ "plan": [
311
+ "I only want to see Umbrella items."
312
+ ]
313
+ }
314
+ ]
results/round3/gym_eval_v14s.log ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FAIL flight seed=900000 steps= 1 done 1.5s Show me a return flight from Oslo to Berlin on October 18, returning 2
2
+ FAIL flight seed=900010 steps= 2 done 1.3s Look up round-trip flights from Tokyo to Amsterdam on October 13, retu
3
+ FAIL flight seed=900020 steps= 1 done 1.1s Search for one-way flights from Roma to Seoul on 15 October 2026 for t
4
+ FAIL flight seed=900030 steps=40 ready 6.2s Show me a one-way flight from Helsinki to Munich on 26 October 2026 fo
5
+ FAIL flight seed=900040 steps= 4 done 1.6s Show me one way flights from Manchester to Bangkok on November 21 for
6
+ FAIL flight seed=900050 steps= 7 blocked 1.9s Show me a one-way flight from Amsterdam to Barcelona on November 8, 20
7
+ FAIL flight seed=900060 steps=21 blocked 3.2s Find one-way flights from Seoul to Copenhagen on 10 October 2026 for t
8
+ FAIL flight seed=900070 steps=40 ready 10.3s Look up a return flight from Barcelona to New York on November 13, ret
9
+ FAIL hotel seed=900000 steps= 2 done 1.1s Find a hotel in Toronto from 31 October 2026 to November 2, sorted by
10
+ FAIL hotel seed=900010 steps= 1 done 1.1s Search for hotels in Chicago from 30 October 2026 to November 1 for th
11
+ FAIL hotel seed=900020 steps=40 ready 5.3s Find a hotel in Oslo from 30 October 2026 to November 3, 2026 for one
12
+ FAIL hotel seed=900030 steps= 4 done 1.6s Find stays in Toronto from November 16, 2026 to November 21, 2026, fil
13
+ FAIL hotel seed=900040 steps= 2 done 1.4s Search for hotels in Tokyo from 14 November 2026 to 15 November 2026,
14
+ FAIL hotel seed=900050 steps=40 ready 4.5s Find stays in Copenhagen from December 4 to December 7, 2026 for one g
15
+ FAIL hotel seed=900060 steps= 2 done 1.3s Find stays in Rome from November 3, 2026 to 10 November 2026 for 4 gue
16
+ FAIL hotel seed=900070 steps=40 ready 4.5s Find a hotel in Chicago from 27 September 2026 to October 4, only show
17
+ FAIL shop seed=900000 steps= 2 done 1.2s Go to page 2 and open 'Hooli Water bottle X'.
18
+ PASS shop seed=900010 steps= 1 done 1.1s Sort the products by price: low to high.
19
+ FAIL shop seed=900020 steps= 8 blocked 1.9s Show page 3.
20
+ FAIL shop seed=900030 steps= 0 done 1.0s Find water bottles.
21
+ FAIL shop seed=900040 steps= 1 done 1.2s Show only Hooli products.
22
+ PASS shop seed=900050 steps= 2 done 1.1s Filter the list to the brand Acme.
23
+ PASS shop seed=900060 steps= 2 done 1.4s Search the shop for 'backpack'.
24
+ PASS shop seed=900070 steps= 1 done 1.1s I only want to see Umbrella items.
25
+ == flight: 0/8 median steps 7
26
+ == hotel: 0/8 median steps 4
27
+ == shop: 4/8 median steps 2
28
+ == total 4/24 (17%)
results/round3/gym_eval_v14s_plan.json ADDED
@@ -0,0 +1,391 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "kind": "flight",
4
+ "seed": 900000,
5
+ "ok": false,
6
+ "steps": 40,
7
+ "status": "ready",
8
+ "wall": 6.5,
9
+ "url": "http://127.0.0.1:8811/t/flight/900000",
10
+ "goal": "Show me a return flight from Oslo to Berlin on October 18, returning 23 October 2026 for 3 adults in premium economy. Stop when matching flight options are visible.",
11
+ "plan": [
12
+ "Set origin (departure) to Oslo",
13
+ "Set destination (arrival) to Berlin",
14
+ "Set departure date to October 18, 2026",
15
+ "Set return date to October 23, 2026",
16
+ "Set number of passengers to 3",
17
+ "Set class to premium economy",
18
+ "Set trip type to return flight",
19
+ "Stop when matching flight options are visible"
20
+ ]
21
+ },
22
+ {
23
+ "kind": "flight",
24
+ "seed": 900010,
25
+ "ok": false,
26
+ "steps": 2,
27
+ "status": "blocked",
28
+ "wall": 2.6,
29
+ "url": "http://127.0.0.1:8811/t/flight/900010",
30
+ "goal": "Look up round-trip flights from Tokyo to Amsterdam on October 13, returning 20 October 2026 for two adults in first class.",
31
+ "plan": [
32
+ "Set where from (origin, departure) to Tokyo",
33
+ "Set where to (destination, arrival) to Amsterdam",
34
+ "Set the departure date to October 13, 2026",
35
+ "Set the return date to October 20, 2026",
36
+ "Set the number of passengers to 2",
37
+ "Set the class to first class",
38
+ "Set trip type to round-trip",
39
+ "Submit the search and view the results"
40
+ ]
41
+ },
42
+ {
43
+ "kind": "flight",
44
+ "seed": 900020,
45
+ "ok": false,
46
+ "steps": 40,
47
+ "status": "ready",
48
+ "wall": 6.3,
49
+ "url": "http://127.0.0.1:8811/t/flight/900020",
50
+ "goal": "Search for one-way flights from Roma to Seoul on 15 October 2026 for two adults. Stop when matching flight options are visible.",
51
+ "plan": [
52
+ "Set where from (origin, departure) to Roma",
53
+ "Set where to (destination, arrival) to Seoul",
54
+ "Set the departure date to October 15, 2026",
55
+ "Set the number of passengers to 2",
56
+ "Set passenger type to adult",
57
+ "Set trip type to one-way",
58
+ "Submit the search and stop when matching flight options are visible"
59
+ ]
60
+ },
61
+ {
62
+ "kind": "flight",
63
+ "seed": 900030,
64
+ "ok": false,
65
+ "steps": 40,
66
+ "status": "ready",
67
+ "wall": 6.8,
68
+ "url": "http://127.0.0.1:8811/t/flight/900030",
69
+ "goal": "Show me a one-way flight from Helsinki to Munich on 26 October 2026 for four adults in business class.",
70
+ "plan": [
71
+ "Set where from (origin, departure) to Helsinki",
72
+ "Set where to (destination, arrival) to Munich",
73
+ "Set the departure date to October 26, 2026",
74
+ "Set the number of passengers to 4",
75
+ "Set the class to business",
76
+ "Set trip type to one-way",
77
+ "Submit the search and view the results"
78
+ ]
79
+ },
80
+ {
81
+ "kind": "flight",
82
+ "seed": 900040,
83
+ "ok": false,
84
+ "steps": 40,
85
+ "status": "ready",
86
+ "wall": 7.6,
87
+ "url": "http://127.0.0.1:8811/t/flight/900040/results?trip=round&adults=1&cabin=first#flight-1",
88
+ "goal": "Show me one way flights from Manchester to Bangkok on November 21 for 3 adults in business class.",
89
+ "plan": [
90
+ "Set where from (origin, departure) to Manchester",
91
+ "Set where to (destination, arrival) to Bangkok",
92
+ "Set the departure date to November 21",
93
+ "Set the number of passengers to 3",
94
+ "Set the class to business",
95
+ "Set trip type to one-way",
96
+ "Submit the search and view the results"
97
+ ]
98
+ },
99
+ {
100
+ "kind": "flight",
101
+ "seed": 900050,
102
+ "ok": false,
103
+ "steps": 40,
104
+ "status": "ready",
105
+ "wall": 6.2,
106
+ "url": "http://127.0.0.1:8811/t/flight/900050",
107
+ "goal": "Show me a one-way flight from Amsterdam to Barcelona on November 8, 2026 for 1 adult in economy.",
108
+ "plan": [
109
+ "Set the origin (from) to Amsterdam",
110
+ "Set the destination (to) to Barcelona",
111
+ "Set the departure date to November 8, 2026",
112
+ "Set the number of passengers to 1",
113
+ "Set the class to economy",
114
+ "Set the trip type to one-way",
115
+ "Submit the search and view the results"
116
+ ]
117
+ },
118
+ {
119
+ "kind": "flight",
120
+ "seed": 900060,
121
+ "ok": false,
122
+ "steps": 2,
123
+ "status": "blocked",
124
+ "wall": 2.4,
125
+ "url": "http://127.0.0.1:8811/t/flight/900060",
126
+ "goal": "Find one-way flights from Seoul to Copenhagen on 10 October 2026 for two adults in business class.",
127
+ "plan": [
128
+ "Set origin (from) to Seoul",
129
+ "Set destination (to) to Copenhagen",
130
+ "Set departure date to October 10, 2026",
131
+ "Set number of passengers to 2",
132
+ "Set class to Business",
133
+ "Set trip type to One-way",
134
+ "Submit the search and view the results"
135
+ ]
136
+ },
137
+ {
138
+ "kind": "flight",
139
+ "seed": 900070,
140
+ "ok": false,
141
+ "steps": 5,
142
+ "status": "blocked",
143
+ "wall": 2.7,
144
+ "url": "http://127.0.0.1:8811/t/flight/900070",
145
+ "goal": "Look up a return flight from Barcelona to New York on November 13, returning November 27 for 1 adult. Stop when matching flight options are visible.",
146
+ "plan": [
147
+ "Set where from (origin, departure) to Barcelona",
148
+ "Set where to (destination, arrival) to New York",
149
+ "Set the departure date to November 13, 2026",
150
+ "Set the return date to November 27, 2026",
151
+ "Set the number of passengers to 1",
152
+ "Set the trip type to return",
153
+ "Submit the search and stop when matching flight options are visible"
154
+ ]
155
+ },
156
+ {
157
+ "kind": "hotel",
158
+ "seed": 900000,
159
+ "ok": false,
160
+ "steps": 1,
161
+ "status": "blocked",
162
+ "wall": 1.6,
163
+ "url": "http://127.0.0.1:8811/t/hotel/900000",
164
+ "goal": "Find a hotel in Toronto from 31 October 2026 to November 2, sorted by price: low to high.",
165
+ "plan": [
166
+ "Set the arrival date to October 31, 2026",
167
+ "Set the departure date to November 2, 2026",
168
+ "Sort hotels by price: low to high"
169
+ ]
170
+ },
171
+ {
172
+ "kind": "hotel",
173
+ "seed": 900010,
174
+ "ok": false,
175
+ "steps": 40,
176
+ "status": "ready",
177
+ "wall": 5.5,
178
+ "url": "http://127.0.0.1:8811/t/hotel/900010",
179
+ "goal": "Search for hotels in Chicago from 30 October 2026 to November 1 for three guests, sorted by price: low to high.",
180
+ "plan": [
181
+ "Set the origin (departure) to Chicago",
182
+ "Set the departure date to October 30, 2026",
183
+ "Set the return date to November 1, 2026",
184
+ "Set the number of guests to 3",
185
+ "Sort the results by price: low to high"
186
+ ]
187
+ },
188
+ {
189
+ "kind": "hotel",
190
+ "seed": 900020,
191
+ "ok": false,
192
+ "steps": 4,
193
+ "status": "blocked",
194
+ "wall": 3.4,
195
+ "url": "http://127.0.0.1:8811/t/hotel/900020",
196
+ "goal": "Find a hotel in Oslo from 30 October 2026 to November 3, 2026 for one guest, only showing pet friendly.",
197
+ "plan": [
198
+ "Set the arrival date to October 30, 2026",
199
+ "Set the departure date to November 3, 2026",
200
+ "Set the number of guests to 1",
201
+ "Set the pet friendly filter to enabled",
202
+ "Submit the search and view the results"
203
+ ]
204
+ },
205
+ {
206
+ "kind": "hotel",
207
+ "seed": 900030,
208
+ "ok": false,
209
+ "steps": 40,
210
+ "status": "ready",
211
+ "wall": 5.8,
212
+ "url": "http://127.0.0.1:8811/t/hotel/900030",
213
+ "goal": "Find stays in Toronto from November 16, 2026 to November 21, 2026, filtered to pet friendly.",
214
+ "plan": [
215
+ "Set the arrival date to November 16, 2026",
216
+ "Set the departure date to November 21, 2026",
217
+ "Set the destination (city) to Toronto",
218
+ "Set the filter to pet friendly"
219
+ ]
220
+ },
221
+ {
222
+ "kind": "hotel",
223
+ "seed": 900040,
224
+ "ok": false,
225
+ "steps": 40,
226
+ "status": "ready",
227
+ "wall": 6.6,
228
+ "url": "http://127.0.0.1:8811/t/hotel/900040",
229
+ "goal": "Search for hotels in Tokyo from 14 November 2026 to 15 November 2026, with pet friendly.",
230
+ "plan": [
231
+ "Set the departure date to November 14, 2026",
232
+ "Set the return date to November 15, 2026",
233
+ "Set the destination (city) to Tokyo",
234
+ "Set the pet friendly filter to enabled",
235
+ "Submit the search and view the results"
236
+ ]
237
+ },
238
+ {
239
+ "kind": "hotel",
240
+ "seed": 900050,
241
+ "ok": false,
242
+ "steps": 40,
243
+ "status": "ready",
244
+ "wall": 6.4,
245
+ "url": "http://127.0.0.1:8811/t/hotel/900050",
246
+ "goal": "Find stays in Copenhagen from December 4 to December 7, 2026 for one guest, sorted by guest rating.",
247
+ "plan": [
248
+ "Set the origin (from) to Copenhagen",
249
+ "Set the departure date to December 4, 2026",
250
+ "Set the return date to December 7, 2026",
251
+ "Set the number of guests to 1",
252
+ "Sort by guest rating"
253
+ ]
254
+ },
255
+ {
256
+ "kind": "hotel",
257
+ "seed": 900060,
258
+ "ok": false,
259
+ "steps": 40,
260
+ "status": "ready",
261
+ "wall": 6.0,
262
+ "url": "http://127.0.0.1:8811/t/hotel/900060",
263
+ "goal": "Find stays in Rome from November 3, 2026 to 10 November 2026 for 4 guests.",
264
+ "plan": [
265
+ "Set the arrival date to November 3, 2026",
266
+ "Set the departure date to November 10, 2026",
267
+ "Set the number of guests to 4",
268
+ "Search for stays in Rome"
269
+ ]
270
+ },
271
+ {
272
+ "kind": "hotel",
273
+ "seed": 900070,
274
+ "ok": false,
275
+ "steps": 40,
276
+ "status": "ready",
277
+ "wall": 5.5,
278
+ "url": "http://127.0.0.1:8811/t/hotel/900070",
279
+ "goal": "Find a hotel in Chicago from 27 September 2026 to October 4, only showing free cancellation.",
280
+ "plan": [
281
+ "Set the arrival date to September 27, 2026",
282
+ "Set the departure date to October 4, 2026",
283
+ "Set the filter to only show free cancellation hotels"
284
+ ]
285
+ },
286
+ {
287
+ "kind": "shop",
288
+ "seed": 900000,
289
+ "ok": false,
290
+ "steps": 5,
291
+ "status": "blocked",
292
+ "wall": 2.5,
293
+ "url": "http://127.0.0.1:8811/t/shop/900000/p/4#home",
294
+ "goal": "Go to page 2 and open 'Hooli Water bottle X'.",
295
+ "plan": [
296
+ "Go to page 2",
297
+ "Open 'Hooli Water bottle X'"
298
+ ]
299
+ },
300
+ {
301
+ "kind": "shop",
302
+ "seed": 900010,
303
+ "ok": true,
304
+ "steps": 1,
305
+ "status": "done",
306
+ "wall": 1.3,
307
+ "url": "http://127.0.0.1:8811/t/shop/900010?sort=Price%3A+low+to+high",
308
+ "goal": "Sort the products by price: low to high.",
309
+ "plan": [
310
+ "Sort products by price from low to high"
311
+ ]
312
+ },
313
+ {
314
+ "kind": "shop",
315
+ "seed": 900020,
316
+ "ok": false,
317
+ "steps": 8,
318
+ "status": "blocked",
319
+ "wall": 1.9,
320
+ "url": "http://127.0.0.1:8811/t/shop/900020/p/8#home",
321
+ "goal": "Show page 3.",
322
+ "plan": [
323
+ "Go to page 3"
324
+ ]
325
+ },
326
+ {
327
+ "kind": "shop",
328
+ "seed": 900030,
329
+ "ok": false,
330
+ "steps": 0,
331
+ "status": "done",
332
+ "wall": 1.3,
333
+ "url": "http://127.0.0.1:8811/t/shop/900030",
334
+ "goal": "Find water bottles.",
335
+ "plan": [
336
+ "Find water bottles"
337
+ ]
338
+ },
339
+ {
340
+ "kind": "shop",
341
+ "seed": 900040,
342
+ "ok": false,
343
+ "steps": 1,
344
+ "status": "done",
345
+ "wall": 1.4,
346
+ "url": "http://127.0.0.1:8811/t/shop/900040/p/2",
347
+ "goal": "Show only Hooli products.",
348
+ "plan": [
349
+ "Filter products to show only Hooli products"
350
+ ]
351
+ },
352
+ {
353
+ "kind": "shop",
354
+ "seed": 900050,
355
+ "ok": true,
356
+ "steps": 1,
357
+ "status": "done",
358
+ "wall": 1.5,
359
+ "url": "http://127.0.0.1:8811/t/shop/900050?brand=Acme",
360
+ "goal": "Filter the list to the brand Acme.",
361
+ "plan": [
362
+ "Filter the list to show only items from the brand Acme"
363
+ ]
364
+ },
365
+ {
366
+ "kind": "shop",
367
+ "seed": 900060,
368
+ "ok": true,
369
+ "steps": 2,
370
+ "status": "done",
371
+ "wall": 1.9,
372
+ "url": "http://127.0.0.1:8811/t/shop/900060?q=backpack",
373
+ "goal": "Search the shop for 'backpack'.",
374
+ "plan": [
375
+ "Search the shop for 'backpack'"
376
+ ]
377
+ },
378
+ {
379
+ "kind": "shop",
380
+ "seed": 900070,
381
+ "ok": true,
382
+ "steps": 2,
383
+ "status": "done",
384
+ "wall": 1.5,
385
+ "url": "http://127.0.0.1:8811/t/shop/900070?brand=Umbrella&sort=Price%3A+low+to+high",
386
+ "goal": "I only want to see Umbrella items.",
387
+ "plan": [
388
+ "Set the item type to Umbrella"
389
+ ]
390
+ }
391
+ ]
results/round3/gym_eval_v14s_plan.log ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FAIL flight seed=900000 steps=40 ready 6.5s Show me a return flight from Oslo to Berlin on October 18, returning 2
2
+ FAIL flight seed=900010 steps= 2 blocked 2.6s Look up round-trip flights from Tokyo to Amsterdam on October 13, retu
3
+ FAIL flight seed=900020 steps=40 ready 6.3s Search for one-way flights from Roma to Seoul on 15 October 2026 for t
4
+ FAIL flight seed=900030 steps=40 ready 6.8s Show me a one-way flight from Helsinki to Munich on 26 October 2026 fo
5
+ FAIL flight seed=900040 steps=40 ready 7.6s Show me one way flights from Manchester to Bangkok on November 21 for
6
+ FAIL flight seed=900050 steps=40 ready 6.2s Show me a one-way flight from Amsterdam to Barcelona on November 8, 20
7
+ FAIL flight seed=900060 steps= 2 blocked 2.4s Find one-way flights from Seoul to Copenhagen on 10 October 2026 for t
8
+ FAIL flight seed=900070 steps= 5 blocked 2.7s Look up a return flight from Barcelona to New York on November 13, ret
9
+ FAIL hotel seed=900000 steps= 1 blocked 1.6s Find a hotel in Toronto from 31 October 2026 to November 2, sorted by
10
+ FAIL hotel seed=900010 steps=40 ready 5.5s Search for hotels in Chicago from 30 October 2026 to November 1 for th
11
+ FAIL hotel seed=900020 steps= 4 blocked 3.4s Find a hotel in Oslo from 30 October 2026 to November 3, 2026 for one
12
+ FAIL hotel seed=900030 steps=40 ready 5.8s Find stays in Toronto from November 16, 2026 to November 21, 2026, fil
13
+ FAIL hotel seed=900040 steps=40 ready 6.6s Search for hotels in Tokyo from 14 November 2026 to 15 November 2026,
14
+ FAIL hotel seed=900050 steps=40 ready 6.4s Find stays in Copenhagen from December 4 to December 7, 2026 for one g
15
+ FAIL hotel seed=900060 steps=40 ready 6.0s Find stays in Rome from November 3, 2026 to 10 November 2026 for 4 gue
16
+ FAIL hotel seed=900070 steps=40 ready 5.5s Find a hotel in Chicago from 27 September 2026 to October 4, only show
17
+ FAIL shop seed=900000 steps= 5 blocked 2.5s Go to page 2 and open 'Hooli Water bottle X'.
18
+ PASS shop seed=900010 steps= 1 done 1.3s Sort the products by price: low to high.
19
+ FAIL shop seed=900020 steps= 8 blocked 1.9s Show page 3.
20
+ FAIL shop seed=900030 steps= 0 done 1.3s Find water bottles.
21
+ FAIL shop seed=900040 steps= 1 done 1.4s Show only Hooli products.
22
+ PASS shop seed=900050 steps= 1 done 1.5s Filter the list to the brand Acme.
23
+ PASS shop seed=900060 steps= 2 done 1.9s Search the shop for 'backpack'.
24
+ PASS shop seed=900070 steps= 2 done 1.5s I only want to see Umbrella items.
25
+ == flight: 0/8 median steps 40
26
+ == hotel: 0/8 median steps 40
27
+ == shop: 4/8 median steps 2
28
+ == total 4/24 (17%)
results/round3/suiteA_v13s.json ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "wiki-einstein",
4
+ "pass": false,
5
+ "steps": 3,
6
+ "status": "done",
7
+ "wall": 5.852099657058716
8
+ },
9
+ {
10
+ "name": "wiki-einstein",
11
+ "pass": false,
12
+ "steps": 3,
13
+ "status": "done",
14
+ "wall": 3.777109146118164
15
+ },
16
+ {
17
+ "name": "wiki-einstein",
18
+ "pass": false,
19
+ "steps": 3,
20
+ "status": "blocked",
21
+ "wall": 3.5345683097839355
22
+ },
23
+ {
24
+ "name": "wiki-search",
25
+ "pass": true,
26
+ "steps": 2,
27
+ "status": "done",
28
+ "wall": 4.188246726989746
29
+ },
30
+ {
31
+ "name": "wiki-search",
32
+ "pass": true,
33
+ "steps": 2,
34
+ "status": "done",
35
+ "wall": 4.308509111404419
36
+ },
37
+ {
38
+ "name": "wiki-search",
39
+ "pass": true,
40
+ "steps": 2,
41
+ "status": "done",
42
+ "wall": 4.4918646812438965
43
+ },
44
+ {
45
+ "name": "hn-new",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 4.145602226257324
50
+ },
51
+ {
52
+ "name": "hn-new",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 2.6322431564331055
57
+ },
58
+ {
59
+ "name": "hn-new",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.6054000854492188
64
+ },
65
+ {
66
+ "name": "hn-login-page",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 2.7457010746002197
71
+ },
72
+ {
73
+ "name": "hn-login-page",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 2.4926605224609375
78
+ },
79
+ {
80
+ "name": "hn-login-page",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 2.5525999069213867
85
+ },
86
+ {
87
+ "name": "gh-issues",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 7.7928466796875
92
+ },
93
+ {
94
+ "name": "gh-issues",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 3.424391984939575
99
+ },
100
+ {
101
+ "name": "gh-issues",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 3.2397661209106445
106
+ },
107
+ {
108
+ "name": "py-downloads",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 4.143227577209473
113
+ },
114
+ {
115
+ "name": "py-downloads",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 2.3897807598114014
120
+ },
121
+ {
122
+ "name": "py-downloads",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 2.97131085395813
127
+ },
128
+ {
129
+ "name": "books-travel",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 2.0191097259521484
134
+ },
135
+ {
136
+ "name": "books-travel",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 1.9415113925933838
141
+ },
142
+ {
143
+ "name": "books-travel",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 1.9320547580718994
148
+ },
149
+ {
150
+ "name": "books-open-book",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 2.2813827991485596
155
+ },
156
+ {
157
+ "name": "books-open-book",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 1.896589994430542
162
+ },
163
+ {
164
+ "name": "books-open-book",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 1.8832671642303467
169
+ },
170
+ {
171
+ "name": "internet-dropdown",
172
+ "pass": true,
173
+ "steps": 1,
174
+ "status": "done",
175
+ "wall": 3.4084954261779785
176
+ },
177
+ {
178
+ "name": "internet-dropdown",
179
+ "pass": true,
180
+ "steps": 1,
181
+ "status": "done",
182
+ "wall": 2.18304181098938
183
+ },
184
+ {
185
+ "name": "internet-dropdown",
186
+ "pass": true,
187
+ "steps": 1,
188
+ "status": "done",
189
+ "wall": 2.2253031730651855
190
+ },
191
+ {
192
+ "name": "internet-checkbox",
193
+ "pass": true,
194
+ "steps": 1,
195
+ "status": "done",
196
+ "wall": 2.534019947052002
197
+ },
198
+ {
199
+ "name": "internet-checkbox",
200
+ "pass": true,
201
+ "steps": 1,
202
+ "status": "done",
203
+ "wall": 2.08272123336792
204
+ },
205
+ {
206
+ "name": "internet-checkbox",
207
+ "pass": true,
208
+ "steps": 1,
209
+ "status": "done",
210
+ "wall": 2.201373815536499
211
+ },
212
+ {
213
+ "name": "books-page2",
214
+ "pass": false,
215
+ "steps": 1,
216
+ "status": "done",
217
+ "wall": 1.7590856552124023
218
+ },
219
+ {
220
+ "name": "books-page2",
221
+ "pass": false,
222
+ "steps": 1,
223
+ "status": "done",
224
+ "wall": 1.9029622077941895
225
+ },
226
+ {
227
+ "name": "books-page2",
228
+ "pass": false,
229
+ "steps": 1,
230
+ "status": "done",
231
+ "wall": 1.9843285083770752
232
+ },
233
+ {
234
+ "name": "quotes-tag-love",
235
+ "pass": true,
236
+ "steps": 1,
237
+ "status": "done",
238
+ "wall": 3.8725624084472656
239
+ },
240
+ {
241
+ "name": "quotes-tag-love",
242
+ "pass": true,
243
+ "steps": 1,
244
+ "status": "done",
245
+ "wall": 2.835207939147949
246
+ },
247
+ {
248
+ "name": "quotes-tag-love",
249
+ "pass": true,
250
+ "steps": 1,
251
+ "status": "done",
252
+ "wall": 2.7795658111572266
253
+ },
254
+ {
255
+ "name": "hn-past",
256
+ "pass": true,
257
+ "steps": 1,
258
+ "status": "done",
259
+ "wall": 3.0871634483337402
260
+ },
261
+ {
262
+ "name": "hn-past",
263
+ "pass": true,
264
+ "steps": 1,
265
+ "status": "done",
266
+ "wall": 4.41726279258728
267
+ },
268
+ {
269
+ "name": "hn-past",
270
+ "pass": true,
271
+ "steps": 1,
272
+ "status": "done",
273
+ "wall": 2.973738670349121
274
+ },
275
+ {
276
+ "name": "web-search",
277
+ "pass": true,
278
+ "steps": 2,
279
+ "status": "done",
280
+ "wall": 5.196753025054932
281
+ },
282
+ {
283
+ "name": "web-search",
284
+ "pass": true,
285
+ "steps": 2,
286
+ "status": "done",
287
+ "wall": 3.8438737392425537
288
+ },
289
+ {
290
+ "name": "web-search",
291
+ "pass": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 3.0845510959625244
295
+ },
296
+ {
297
+ "name": "arxiv-search",
298
+ "pass": false,
299
+ "steps": 2,
300
+ "status": "error:ValueError",
301
+ "wall": 14.285512685775757
302
+ },
303
+ {
304
+ "name": "arxiv-search",
305
+ "pass": false,
306
+ "steps": 2,
307
+ "status": "error:ValueError",
308
+ "wall": 12.945858716964722
309
+ },
310
+ {
311
+ "name": "arxiv-search",
312
+ "pass": false,
313
+ "steps": 2,
314
+ "status": "error:ValueError",
315
+ "wall": 13.426517963409424
316
+ },
317
+ {
318
+ "name": "flights",
319
+ "pass": false,
320
+ "steps": 19,
321
+ "status": "blocked",
322
+ "wall": 7.32370924949646
323
+ },
324
+ {
325
+ "name": "flights",
326
+ "pass": false,
327
+ "steps": 20,
328
+ "status": "ready",
329
+ "wall": 5.2465996742248535
330
+ },
331
+ {
332
+ "name": "flights",
333
+ "pass": false,
334
+ "steps": 20,
335
+ "status": "ready",
336
+ "wall": 5.680525064468384
337
+ }
338
+ ]
results/round3/suiteA_v14s.json ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "wiki-einstein",
4
+ "pass": false,
5
+ "steps": 2,
6
+ "status": "done",
7
+ "wall": 7.153369426727295
8
+ },
9
+ {
10
+ "name": "wiki-einstein",
11
+ "pass": true,
12
+ "steps": 2,
13
+ "status": "done",
14
+ "wall": 4.913437843322754
15
+ },
16
+ {
17
+ "name": "wiki-einstein",
18
+ "pass": false,
19
+ "steps": 2,
20
+ "status": "done",
21
+ "wall": 5.909303903579712
22
+ },
23
+ {
24
+ "name": "wiki-search",
25
+ "pass": true,
26
+ "steps": 2,
27
+ "status": "done",
28
+ "wall": 5.399548768997192
29
+ },
30
+ {
31
+ "name": "wiki-search",
32
+ "pass": true,
33
+ "steps": 2,
34
+ "status": "done",
35
+ "wall": 5.0288166999816895
36
+ },
37
+ {
38
+ "name": "wiki-search",
39
+ "pass": true,
40
+ "steps": 2,
41
+ "status": "done",
42
+ "wall": 4.731976270675659
43
+ },
44
+ {
45
+ "name": "hn-new",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 3.587008476257324
50
+ },
51
+ {
52
+ "name": "hn-new",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 2.5481419563293457
57
+ },
58
+ {
59
+ "name": "hn-new",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.49631929397583
64
+ },
65
+ {
66
+ "name": "hn-login-page",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 2.745541572570801
71
+ },
72
+ {
73
+ "name": "hn-login-page",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 2.5028481483459473
78
+ },
79
+ {
80
+ "name": "hn-login-page",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 2.3588883876800537
85
+ },
86
+ {
87
+ "name": "gh-issues",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 6.790970325469971
92
+ },
93
+ {
94
+ "name": "gh-issues",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 3.614898681640625
99
+ },
100
+ {
101
+ "name": "gh-issues",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 3.7601253986358643
106
+ },
107
+ {
108
+ "name": "py-downloads",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 5.211635589599609
113
+ },
114
+ {
115
+ "name": "py-downloads",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 3.601041793823242
120
+ },
121
+ {
122
+ "name": "py-downloads",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 2.5883960723876953
127
+ },
128
+ {
129
+ "name": "books-travel",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 2.084430694580078
134
+ },
135
+ {
136
+ "name": "books-travel",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 1.985591173171997
141
+ },
142
+ {
143
+ "name": "books-travel",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 1.959421157836914
148
+ },
149
+ {
150
+ "name": "books-open-book",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 2.1794636249542236
155
+ },
156
+ {
157
+ "name": "books-open-book",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 1.842677116394043
162
+ },
163
+ {
164
+ "name": "books-open-book",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 1.9249365329742432
169
+ },
170
+ {
171
+ "name": "internet-dropdown",
172
+ "pass": true,
173
+ "steps": 1,
174
+ "status": "done",
175
+ "wall": 3.38923716545105
176
+ },
177
+ {
178
+ "name": "internet-dropdown",
179
+ "pass": true,
180
+ "steps": 1,
181
+ "status": "done",
182
+ "wall": 2.0766379833221436
183
+ },
184
+ {
185
+ "name": "internet-dropdown",
186
+ "pass": true,
187
+ "steps": 1,
188
+ "status": "done",
189
+ "wall": 2.203416347503662
190
+ },
191
+ {
192
+ "name": "internet-checkbox",
193
+ "pass": true,
194
+ "steps": 1,
195
+ "status": "done",
196
+ "wall": 2.5841612815856934
197
+ },
198
+ {
199
+ "name": "internet-checkbox",
200
+ "pass": true,
201
+ "steps": 1,
202
+ "status": "done",
203
+ "wall": 2.088857412338257
204
+ },
205
+ {
206
+ "name": "internet-checkbox",
207
+ "pass": true,
208
+ "steps": 1,
209
+ "status": "done",
210
+ "wall": 2.1360607147216797
211
+ },
212
+ {
213
+ "name": "books-page2",
214
+ "pass": false,
215
+ "steps": 1,
216
+ "status": "done",
217
+ "wall": 1.98116135597229
218
+ },
219
+ {
220
+ "name": "books-page2",
221
+ "pass": false,
222
+ "steps": 1,
223
+ "status": "done",
224
+ "wall": 1.9536120891571045
225
+ },
226
+ {
227
+ "name": "books-page2",
228
+ "pass": false,
229
+ "steps": 1,
230
+ "status": "done",
231
+ "wall": 1.9566633701324463
232
+ },
233
+ {
234
+ "name": "quotes-tag-love",
235
+ "pass": true,
236
+ "steps": 1,
237
+ "status": "done",
238
+ "wall": 3.7906875610351562
239
+ },
240
+ {
241
+ "name": "quotes-tag-love",
242
+ "pass": true,
243
+ "steps": 1,
244
+ "status": "done",
245
+ "wall": 2.9570891857147217
246
+ },
247
+ {
248
+ "name": "quotes-tag-love",
249
+ "pass": true,
250
+ "steps": 1,
251
+ "status": "done",
252
+ "wall": 2.9571480751037598
253
+ },
254
+ {
255
+ "name": "hn-past",
256
+ "pass": true,
257
+ "steps": 1,
258
+ "status": "done",
259
+ "wall": 3.0445728302001953
260
+ },
261
+ {
262
+ "name": "hn-past",
263
+ "pass": true,
264
+ "steps": 1,
265
+ "status": "done",
266
+ "wall": 2.6037495136260986
267
+ },
268
+ {
269
+ "name": "hn-past",
270
+ "pass": true,
271
+ "steps": 1,
272
+ "status": "done",
273
+ "wall": 2.5883827209472656
274
+ },
275
+ {
276
+ "name": "web-search",
277
+ "pass": true,
278
+ "steps": 2,
279
+ "status": "done",
280
+ "wall": 6.664576530456543
281
+ },
282
+ {
283
+ "name": "web-search",
284
+ "pass": true,
285
+ "steps": 2,
286
+ "status": "done",
287
+ "wall": 4.646151781082153
288
+ },
289
+ {
290
+ "name": "web-search",
291
+ "pass": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 5.23597264289856
295
+ },
296
+ {
297
+ "name": "arxiv-search",
298
+ "pass": false,
299
+ "steps": 4,
300
+ "status": "done",
301
+ "wall": 6.1844401359558105
302
+ },
303
+ {
304
+ "name": "arxiv-search",
305
+ "pass": true,
306
+ "steps": 8,
307
+ "status": "done",
308
+ "wall": 3.808042526245117
309
+ },
310
+ {
311
+ "name": "arxiv-search",
312
+ "pass": true,
313
+ "steps": 14,
314
+ "status": "done",
315
+ "wall": 10.105110168457031
316
+ },
317
+ {
318
+ "name": "flights",
319
+ "pass": false,
320
+ "steps": 20,
321
+ "status": "ready",
322
+ "wall": 7.139219760894775
323
+ },
324
+ {
325
+ "name": "flights",
326
+ "pass": false,
327
+ "steps": 20,
328
+ "status": "ready",
329
+ "wall": 5.5144500732421875
330
+ },
331
+ {
332
+ "name": "flights",
333
+ "pass": false,
334
+ "steps": 20,
335
+ "status": "ready",
336
+ "wall": 5.720807313919067
337
+ }
338
+ ]
results/round3/suiteB_v12s_c40.json ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "sqlite-download",
4
+ "pass": true,
5
+ "steps": 1,
6
+ "status": "done",
7
+ "wall": 5.6703267097473145
8
+ },
9
+ {
10
+ "name": "sqlite-download",
11
+ "pass": true,
12
+ "steps": 1,
13
+ "status": "done",
14
+ "wall": 1.8731908798217773
15
+ },
16
+ {
17
+ "name": "haskell-downloads",
18
+ "pass": true,
19
+ "steps": 1,
20
+ "status": "done",
21
+ "wall": 3.509976387023926
22
+ },
23
+ {
24
+ "name": "haskell-downloads",
25
+ "pass": true,
26
+ "steps": 1,
27
+ "status": "done",
28
+ "wall": 2.0649473667144775
29
+ },
30
+ {
31
+ "name": "zig-download",
32
+ "pass": true,
33
+ "steps": 1,
34
+ "status": "done",
35
+ "wall": 3.1759567260742188
36
+ },
37
+ {
38
+ "name": "zig-download",
39
+ "pass": true,
40
+ "steps": 1,
41
+ "status": "done",
42
+ "wall": 2.014357089996338
43
+ },
44
+ {
45
+ "name": "openbsd-faq",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 2.8925137519836426
50
+ },
51
+ {
52
+ "name": "openbsd-faq",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 1.8947360515594482
57
+ },
58
+ {
59
+ "name": "nginx-download",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 3.0906717777252197
64
+ },
65
+ {
66
+ "name": "nginx-download",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 2.008801221847534
71
+ },
72
+ {
73
+ "name": "xkcd-archive",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 5.957569599151611
78
+ },
79
+ {
80
+ "name": "xkcd-archive",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 4.6660614013671875
85
+ },
86
+ {
87
+ "name": "elixir-install",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 2.626530647277832
92
+ },
93
+ {
94
+ "name": "elixir-install",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 1.8818230628967285
99
+ },
100
+ {
101
+ "name": "prometheus-download",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 6.250592947006226
106
+ },
107
+ {
108
+ "name": "prometheus-download",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 3.139995574951172
113
+ },
114
+ {
115
+ "name": "ocaml-install",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 5.652239084243774
120
+ },
121
+ {
122
+ "name": "ocaml-install",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 3.2106099128723145
127
+ },
128
+ {
129
+ "name": "rosetta-quicksort",
130
+ "pass": true,
131
+ "steps": 2,
132
+ "status": "done",
133
+ "wall": 4.763736963272095
134
+ },
135
+ {
136
+ "name": "rosetta-quicksort",
137
+ "pass": true,
138
+ "steps": 2,
139
+ "status": "done",
140
+ "wall": 2.696882724761963
141
+ },
142
+ {
143
+ "name": "arch-man-grep",
144
+ "pass": true,
145
+ "steps": 2,
146
+ "status": "done",
147
+ "wall": 4.270788192749023
148
+ },
149
+ {
150
+ "name": "arch-man-grep",
151
+ "pass": true,
152
+ "steps": 2,
153
+ "status": "done",
154
+ "wall": 2.530022621154785
155
+ },
156
+ {
157
+ "name": "debian-man-tar",
158
+ "pass": true,
159
+ "steps": 2,
160
+ "status": "done",
161
+ "wall": 2.517338991165161
162
+ },
163
+ {
164
+ "name": "debian-man-tar",
165
+ "pass": true,
166
+ "steps": 2,
167
+ "status": "done",
168
+ "wall": 2.0429556369781494
169
+ },
170
+ {
171
+ "name": "rfc-http-semantics",
172
+ "pass": true,
173
+ "steps": 2,
174
+ "status": "done",
175
+ "wall": 4.772353887557983
176
+ },
177
+ {
178
+ "name": "rfc-http-semantics",
179
+ "pass": true,
180
+ "steps": 2,
181
+ "status": "done",
182
+ "wall": 3.16965389251709
183
+ },
184
+ {
185
+ "name": "nixos-ripgrep",
186
+ "pass": true,
187
+ "steps": 2,
188
+ "status": "done",
189
+ "wall": 5.179338216781616
190
+ },
191
+ {
192
+ "name": "nixos-ripgrep",
193
+ "pass": true,
194
+ "steps": 2,
195
+ "status": "done",
196
+ "wall": 3.827910900115967
197
+ },
198
+ {
199
+ "name": "ocaml-pkg-yojson",
200
+ "pass": true,
201
+ "steps": 2,
202
+ "status": "done",
203
+ "wall": 3.698476791381836
204
+ },
205
+ {
206
+ "name": "ocaml-pkg-yojson",
207
+ "pass": true,
208
+ "steps": 2,
209
+ "status": "done",
210
+ "wall": 2.673051357269287
211
+ },
212
+ {
213
+ "name": "shop-search-jacket",
214
+ "pass": true,
215
+ "steps": 2,
216
+ "status": "done",
217
+ "wall": 4.619678258895874
218
+ },
219
+ {
220
+ "name": "shop-search-jacket",
221
+ "pass": true,
222
+ "steps": 2,
223
+ "status": "done",
224
+ "wall": 2.966660261154175
225
+ },
226
+ {
227
+ "name": "shop-page2",
228
+ "pass": true,
229
+ "steps": 2,
230
+ "status": "done",
231
+ "wall": 3.731016159057617
232
+ },
233
+ {
234
+ "name": "shop-page2",
235
+ "pass": true,
236
+ "steps": 2,
237
+ "status": "done",
238
+ "wall": 4.623927116394043
239
+ },
240
+ {
241
+ "name": "shop-sort-price",
242
+ "pass": false,
243
+ "steps": 1,
244
+ "status": "error:ValueError",
245
+ "wall": 2.9405176639556885
246
+ },
247
+ {
248
+ "name": "shop-sort-price",
249
+ "pass": false,
250
+ "steps": 3,
251
+ "status": "done",
252
+ "wall": 4.098207473754883
253
+ }
254
+ ]
results/round3/suiteB_v13s.json ADDED
@@ -0,0 +1,380 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "sqlite-download",
4
+ "pass": true,
5
+ "steps": 1,
6
+ "status": "done",
7
+ "wall": 5.695581436157227
8
+ },
9
+ {
10
+ "name": "sqlite-download",
11
+ "pass": true,
12
+ "steps": 1,
13
+ "status": "done",
14
+ "wall": 1.869412899017334
15
+ },
16
+ {
17
+ "name": "sqlite-download",
18
+ "pass": true,
19
+ "steps": 1,
20
+ "status": "done",
21
+ "wall": 1.8962252140045166
22
+ },
23
+ {
24
+ "name": "haskell-downloads",
25
+ "pass": true,
26
+ "steps": 1,
27
+ "status": "done",
28
+ "wall": 3.8517751693725586
29
+ },
30
+ {
31
+ "name": "haskell-downloads",
32
+ "pass": true,
33
+ "steps": 1,
34
+ "status": "done",
35
+ "wall": 2.8190269470214844
36
+ },
37
+ {
38
+ "name": "haskell-downloads",
39
+ "pass": true,
40
+ "steps": 1,
41
+ "status": "done",
42
+ "wall": 2.199798345565796
43
+ },
44
+ {
45
+ "name": "zig-download",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 2.331904411315918
50
+ },
51
+ {
52
+ "name": "zig-download",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 1.9637272357940674
57
+ },
58
+ {
59
+ "name": "zig-download",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.1597702503204346
64
+ },
65
+ {
66
+ "name": "openbsd-faq",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 2.0122523307800293
71
+ },
72
+ {
73
+ "name": "openbsd-faq",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 1.7669165134429932
78
+ },
79
+ {
80
+ "name": "openbsd-faq",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 1.949770212173462
85
+ },
86
+ {
87
+ "name": "nginx-download",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 2.1853749752044678
92
+ },
93
+ {
94
+ "name": "nginx-download",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 1.7542953491210938
99
+ },
100
+ {
101
+ "name": "nginx-download",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 1.918290138244629
106
+ },
107
+ {
108
+ "name": "xkcd-archive",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 8.402779340744019
113
+ },
114
+ {
115
+ "name": "xkcd-archive",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 4.298560857772827
120
+ },
121
+ {
122
+ "name": "xkcd-archive",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 4.158369779586792
127
+ },
128
+ {
129
+ "name": "elixir-install",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 3.858856201171875
134
+ },
135
+ {
136
+ "name": "elixir-install",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 2.169969320297241
141
+ },
142
+ {
143
+ "name": "elixir-install",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 1.9936721324920654
148
+ },
149
+ {
150
+ "name": "prometheus-download",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 5.214618682861328
155
+ },
156
+ {
157
+ "name": "prometheus-download",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 3.1169214248657227
162
+ },
163
+ {
164
+ "name": "prometheus-download",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 3.1795413494110107
169
+ },
170
+ {
171
+ "name": "ocaml-install",
172
+ "pass": true,
173
+ "steps": 1,
174
+ "status": "done",
175
+ "wall": 4.403536081314087
176
+ },
177
+ {
178
+ "name": "ocaml-install",
179
+ "pass": true,
180
+ "steps": 1,
181
+ "status": "done",
182
+ "wall": 3.2332334518432617
183
+ },
184
+ {
185
+ "name": "ocaml-install",
186
+ "pass": true,
187
+ "steps": 1,
188
+ "status": "done",
189
+ "wall": 3.269718885421753
190
+ },
191
+ {
192
+ "name": "rosetta-quicksort",
193
+ "pass": true,
194
+ "steps": 2,
195
+ "status": "done",
196
+ "wall": 4.526256084442139
197
+ },
198
+ {
199
+ "name": "rosetta-quicksort",
200
+ "pass": true,
201
+ "steps": 2,
202
+ "status": "done",
203
+ "wall": 2.611555576324463
204
+ },
205
+ {
206
+ "name": "rosetta-quicksort",
207
+ "pass": true,
208
+ "steps": 2,
209
+ "status": "done",
210
+ "wall": 2.591611862182617
211
+ },
212
+ {
213
+ "name": "arch-man-grep",
214
+ "pass": true,
215
+ "steps": 2,
216
+ "status": "done",
217
+ "wall": 4.365265130996704
218
+ },
219
+ {
220
+ "name": "arch-man-grep",
221
+ "pass": true,
222
+ "steps": 2,
223
+ "status": "done",
224
+ "wall": 2.4871649742126465
225
+ },
226
+ {
227
+ "name": "arch-man-grep",
228
+ "pass": true,
229
+ "steps": 2,
230
+ "status": "done",
231
+ "wall": 2.5202934741973877
232
+ },
233
+ {
234
+ "name": "debian-man-tar",
235
+ "pass": true,
236
+ "steps": 3,
237
+ "status": "done",
238
+ "wall": 6.339969158172607
239
+ },
240
+ {
241
+ "name": "debian-man-tar",
242
+ "pass": true,
243
+ "steps": 3,
244
+ "status": "done",
245
+ "wall": 2.552432060241699
246
+ },
247
+ {
248
+ "name": "debian-man-tar",
249
+ "pass": true,
250
+ "steps": 3,
251
+ "status": "done",
252
+ "wall": 2.5456464290618896
253
+ },
254
+ {
255
+ "name": "rfc-http-semantics",
256
+ "pass": true,
257
+ "steps": 2,
258
+ "status": "done",
259
+ "wall": 15.8356351852417
260
+ },
261
+ {
262
+ "name": "rfc-http-semantics",
263
+ "pass": true,
264
+ "steps": 2,
265
+ "status": "done",
266
+ "wall": 2.7176716327667236
267
+ },
268
+ {
269
+ "name": "rfc-http-semantics",
270
+ "pass": true,
271
+ "steps": 2,
272
+ "status": "done",
273
+ "wall": 2.710045099258423
274
+ },
275
+ {
276
+ "name": "nixos-ripgrep",
277
+ "pass": true,
278
+ "steps": 2,
279
+ "status": "done",
280
+ "wall": 4.8107569217681885
281
+ },
282
+ {
283
+ "name": "nixos-ripgrep",
284
+ "pass": true,
285
+ "steps": 2,
286
+ "status": "done",
287
+ "wall": 2.727369546890259
288
+ },
289
+ {
290
+ "name": "nixos-ripgrep",
291
+ "pass": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 3.1598076820373535
295
+ },
296
+ {
297
+ "name": "ocaml-pkg-yojson",
298
+ "pass": true,
299
+ "steps": 2,
300
+ "status": "done",
301
+ "wall": 3.899163007736206
302
+ },
303
+ {
304
+ "name": "ocaml-pkg-yojson",
305
+ "pass": true,
306
+ "steps": 2,
307
+ "status": "done",
308
+ "wall": 2.642282485961914
309
+ },
310
+ {
311
+ "name": "ocaml-pkg-yojson",
312
+ "pass": true,
313
+ "steps": 2,
314
+ "status": "done",
315
+ "wall": 2.9193930625915527
316
+ },
317
+ {
318
+ "name": "shop-search-jacket",
319
+ "pass": true,
320
+ "steps": 2,
321
+ "status": "done",
322
+ "wall": 4.8924782276153564
323
+ },
324
+ {
325
+ "name": "shop-search-jacket",
326
+ "pass": true,
327
+ "steps": 2,
328
+ "status": "done",
329
+ "wall": 2.8857860565185547
330
+ },
331
+ {
332
+ "name": "shop-search-jacket",
333
+ "pass": true,
334
+ "steps": 2,
335
+ "status": "done",
336
+ "wall": 2.837737798690796
337
+ },
338
+ {
339
+ "name": "shop-page2",
340
+ "pass": true,
341
+ "steps": 2,
342
+ "status": "done",
343
+ "wall": 3.3639087677001953
344
+ },
345
+ {
346
+ "name": "shop-page2",
347
+ "pass": true,
348
+ "steps": 2,
349
+ "status": "done",
350
+ "wall": 4.182849407196045
351
+ },
352
+ {
353
+ "name": "shop-page2",
354
+ "pass": false,
355
+ "steps": 3,
356
+ "status": "blocked",
357
+ "wall": 2.9457852840423584
358
+ },
359
+ {
360
+ "name": "shop-sort-price",
361
+ "pass": false,
362
+ "steps": 2,
363
+ "status": "done",
364
+ "wall": 6.215277910232544
365
+ },
366
+ {
367
+ "name": "shop-sort-price",
368
+ "pass": false,
369
+ "steps": 2,
370
+ "status": "done",
371
+ "wall": 3.446885585784912
372
+ },
373
+ {
374
+ "name": "shop-sort-price",
375
+ "pass": false,
376
+ "steps": 2,
377
+ "status": "done",
378
+ "wall": 3.414456844329834
379
+ }
380
+ ]
results/round3/suiteB_v14s.json ADDED
@@ -0,0 +1,380 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "sqlite-download",
4
+ "pass": true,
5
+ "steps": 1,
6
+ "status": "done",
7
+ "wall": 6.361268043518066
8
+ },
9
+ {
10
+ "name": "sqlite-download",
11
+ "pass": true,
12
+ "steps": 1,
13
+ "status": "done",
14
+ "wall": 1.9992897510528564
15
+ },
16
+ {
17
+ "name": "sqlite-download",
18
+ "pass": true,
19
+ "steps": 1,
20
+ "status": "done",
21
+ "wall": 1.970348596572876
22
+ },
23
+ {
24
+ "name": "haskell-downloads",
25
+ "pass": true,
26
+ "steps": 1,
27
+ "status": "done",
28
+ "wall": 3.513546943664551
29
+ },
30
+ {
31
+ "name": "haskell-downloads",
32
+ "pass": true,
33
+ "steps": 1,
34
+ "status": "done",
35
+ "wall": 2.0639684200286865
36
+ },
37
+ {
38
+ "name": "haskell-downloads",
39
+ "pass": true,
40
+ "steps": 1,
41
+ "status": "done",
42
+ "wall": 2.178180694580078
43
+ },
44
+ {
45
+ "name": "zig-download",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 5.86093807220459
50
+ },
51
+ {
52
+ "name": "zig-download",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 1.9833033084869385
57
+ },
58
+ {
59
+ "name": "zig-download",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.164769172668457
64
+ },
65
+ {
66
+ "name": "openbsd-faq",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 1.9758775234222412
71
+ },
72
+ {
73
+ "name": "openbsd-faq",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 1.984276533126831
78
+ },
79
+ {
80
+ "name": "openbsd-faq",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 1.9708170890808105
85
+ },
86
+ {
87
+ "name": "nginx-download",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 2.156858444213867
92
+ },
93
+ {
94
+ "name": "nginx-download",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 1.7520651817321777
99
+ },
100
+ {
101
+ "name": "nginx-download",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 1.9046032428741455
106
+ },
107
+ {
108
+ "name": "xkcd-archive",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 7.542937278747559
113
+ },
114
+ {
115
+ "name": "xkcd-archive",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 4.576859474182129
120
+ },
121
+ {
122
+ "name": "xkcd-archive",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 4.049166440963745
127
+ },
128
+ {
129
+ "name": "elixir-install",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 4.433667898178101
134
+ },
135
+ {
136
+ "name": "elixir-install",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 2.2110342979431152
141
+ },
142
+ {
143
+ "name": "elixir-install",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 2.0132791996002197
148
+ },
149
+ {
150
+ "name": "prometheus-download",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 9.333859920501709
155
+ },
156
+ {
157
+ "name": "prometheus-download",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 3.161487340927124
162
+ },
163
+ {
164
+ "name": "prometheus-download",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 3.020197629928589
169
+ },
170
+ {
171
+ "name": "ocaml-install",
172
+ "pass": true,
173
+ "steps": 2,
174
+ "status": "done",
175
+ "wall": 4.945269823074341
176
+ },
177
+ {
178
+ "name": "ocaml-install",
179
+ "pass": true,
180
+ "steps": 2,
181
+ "status": "done",
182
+ "wall": 4.126190185546875
183
+ },
184
+ {
185
+ "name": "ocaml-install",
186
+ "pass": true,
187
+ "steps": 2,
188
+ "status": "done",
189
+ "wall": 4.143099784851074
190
+ },
191
+ {
192
+ "name": "rosetta-quicksort",
193
+ "pass": true,
194
+ "steps": 2,
195
+ "status": "done",
196
+ "wall": 3.9808945655822754
197
+ },
198
+ {
199
+ "name": "rosetta-quicksort",
200
+ "pass": true,
201
+ "steps": 2,
202
+ "status": "done",
203
+ "wall": 2.70145320892334
204
+ },
205
+ {
206
+ "name": "rosetta-quicksort",
207
+ "pass": true,
208
+ "steps": 2,
209
+ "status": "done",
210
+ "wall": 2.6665432453155518
211
+ },
212
+ {
213
+ "name": "arch-man-grep",
214
+ "pass": true,
215
+ "steps": 2,
216
+ "status": "done",
217
+ "wall": 4.003252267837524
218
+ },
219
+ {
220
+ "name": "arch-man-grep",
221
+ "pass": true,
222
+ "steps": 2,
223
+ "status": "done",
224
+ "wall": 2.5729293823242188
225
+ },
226
+ {
227
+ "name": "arch-man-grep",
228
+ "pass": true,
229
+ "steps": 2,
230
+ "status": "done",
231
+ "wall": 2.561814308166504
232
+ },
233
+ {
234
+ "name": "debian-man-tar",
235
+ "pass": true,
236
+ "steps": 2,
237
+ "status": "done",
238
+ "wall": 5.128390312194824
239
+ },
240
+ {
241
+ "name": "debian-man-tar",
242
+ "pass": true,
243
+ "steps": 2,
244
+ "status": "done",
245
+ "wall": 2.061967134475708
246
+ },
247
+ {
248
+ "name": "debian-man-tar",
249
+ "pass": true,
250
+ "steps": 2,
251
+ "status": "done",
252
+ "wall": 1.9078538417816162
253
+ },
254
+ {
255
+ "name": "rfc-http-semantics",
256
+ "pass": true,
257
+ "steps": 2,
258
+ "status": "done",
259
+ "wall": 5.725454807281494
260
+ },
261
+ {
262
+ "name": "rfc-http-semantics",
263
+ "pass": true,
264
+ "steps": 2,
265
+ "status": "done",
266
+ "wall": 3.664327383041382
267
+ },
268
+ {
269
+ "name": "rfc-http-semantics",
270
+ "pass": true,
271
+ "steps": 2,
272
+ "status": "done",
273
+ "wall": 3.0745277404785156
274
+ },
275
+ {
276
+ "name": "nixos-ripgrep",
277
+ "pass": true,
278
+ "steps": 2,
279
+ "status": "done",
280
+ "wall": 3.9704113006591797
281
+ },
282
+ {
283
+ "name": "nixos-ripgrep",
284
+ "pass": true,
285
+ "steps": 2,
286
+ "status": "done",
287
+ "wall": 2.753455638885498
288
+ },
289
+ {
290
+ "name": "nixos-ripgrep",
291
+ "pass": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 2.771595001220703
295
+ },
296
+ {
297
+ "name": "ocaml-pkg-yojson",
298
+ "pass": true,
299
+ "steps": 2,
300
+ "status": "done",
301
+ "wall": 3.7241852283477783
302
+ },
303
+ {
304
+ "name": "ocaml-pkg-yojson",
305
+ "pass": true,
306
+ "steps": 2,
307
+ "status": "done",
308
+ "wall": 2.646784782409668
309
+ },
310
+ {
311
+ "name": "ocaml-pkg-yojson",
312
+ "pass": true,
313
+ "steps": 2,
314
+ "status": "done",
315
+ "wall": 2.8170480728149414
316
+ },
317
+ {
318
+ "name": "shop-search-jacket",
319
+ "pass": true,
320
+ "steps": 2,
321
+ "status": "done",
322
+ "wall": 5.183164119720459
323
+ },
324
+ {
325
+ "name": "shop-search-jacket",
326
+ "pass": true,
327
+ "steps": 2,
328
+ "status": "done",
329
+ "wall": 2.852771520614624
330
+ },
331
+ {
332
+ "name": "shop-search-jacket",
333
+ "pass": true,
334
+ "steps": 2,
335
+ "status": "done",
336
+ "wall": 2.919358253479004
337
+ },
338
+ {
339
+ "name": "shop-page2",
340
+ "pass": true,
341
+ "steps": 1,
342
+ "status": "done",
343
+ "wall": 3.1722159385681152
344
+ },
345
+ {
346
+ "name": "shop-page2",
347
+ "pass": true,
348
+ "steps": 1,
349
+ "status": "done",
350
+ "wall": 3.6293818950653076
351
+ },
352
+ {
353
+ "name": "shop-page2",
354
+ "pass": true,
355
+ "steps": 1,
356
+ "status": "done",
357
+ "wall": 3.4879581928253174
358
+ },
359
+ {
360
+ "name": "shop-sort-price",
361
+ "pass": true,
362
+ "steps": 1,
363
+ "status": "done",
364
+ "wall": 3.8961870670318604
365
+ },
366
+ {
367
+ "name": "shop-sort-price",
368
+ "pass": true,
369
+ "steps": 1,
370
+ "status": "done",
371
+ "wall": 3.308035135269165
372
+ },
373
+ {
374
+ "name": "shop-sort-price",
375
+ "pass": true,
376
+ "steps": 1,
377
+ "status": "done",
378
+ "wall": 3.4196367263793945
379
+ }
380
+ ]
results/round3/suite_h2_laya-browser-v10s.json ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "wiki-einstein",
4
+ "pass": false,
5
+ "steps": 2,
6
+ "status": "done",
7
+ "wall": 3.83627986907959
8
+ },
9
+ {
10
+ "name": "wiki-einstein",
11
+ "pass": false,
12
+ "steps": 2,
13
+ "status": "done",
14
+ "wall": 3.2153303623199463
15
+ },
16
+ {
17
+ "name": "wiki-einstein",
18
+ "pass": false,
19
+ "steps": 2,
20
+ "status": "done",
21
+ "wall": 2.7771353721618652
22
+ },
23
+ {
24
+ "name": "wiki-search",
25
+ "pass": false,
26
+ "steps": 20,
27
+ "status": "ready",
28
+ "wall": 7.70431661605835
29
+ },
30
+ {
31
+ "name": "wiki-search",
32
+ "pass": false,
33
+ "steps": 11,
34
+ "status": "blocked",
35
+ "wall": 6.307146072387695
36
+ },
37
+ {
38
+ "name": "wiki-search",
39
+ "pass": false,
40
+ "steps": 20,
41
+ "status": "ready",
42
+ "wall": 7.217585802078247
43
+ },
44
+ {
45
+ "name": "hn-new",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 3.1100358963012695
50
+ },
51
+ {
52
+ "name": "hn-new",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 2.744152069091797
57
+ },
58
+ {
59
+ "name": "hn-new",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.5624217987060547
64
+ },
65
+ {
66
+ "name": "hn-login-page",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 2.7742652893066406
71
+ },
72
+ {
73
+ "name": "hn-login-page",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 2.3693900108337402
78
+ },
79
+ {
80
+ "name": "hn-login-page",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 2.5206425189971924
85
+ },
86
+ {
87
+ "name": "gh-issues",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 4.734229564666748
92
+ },
93
+ {
94
+ "name": "gh-issues",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 3.3147778511047363
99
+ },
100
+ {
101
+ "name": "gh-issues",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 3.5175280570983887
106
+ },
107
+ {
108
+ "name": "py-downloads",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 2.399106502532959
113
+ },
114
+ {
115
+ "name": "py-downloads",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 2.375485897064209
120
+ },
121
+ {
122
+ "name": "py-downloads",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 2.5823707580566406
127
+ },
128
+ {
129
+ "name": "books-travel",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 1.9549450874328613
134
+ },
135
+ {
136
+ "name": "books-travel",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 2.0089175701141357
141
+ },
142
+ {
143
+ "name": "books-travel",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 1.9885730743408203
148
+ },
149
+ {
150
+ "name": "books-open-book",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 2.223175287246704
155
+ },
156
+ {
157
+ "name": "books-open-book",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 1.734677791595459
162
+ },
163
+ {
164
+ "name": "books-open-book",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 1.9055156707763672
169
+ },
170
+ {
171
+ "name": "internet-dropdown",
172
+ "pass": true,
173
+ "steps": 1,
174
+ "status": "done",
175
+ "wall": 2.755065679550171
176
+ },
177
+ {
178
+ "name": "internet-dropdown",
179
+ "pass": true,
180
+ "steps": 1,
181
+ "status": "done",
182
+ "wall": 2.0737600326538086
183
+ },
184
+ {
185
+ "name": "internet-dropdown",
186
+ "pass": true,
187
+ "steps": 1,
188
+ "status": "done",
189
+ "wall": 2.218611240386963
190
+ },
191
+ {
192
+ "name": "internet-checkbox",
193
+ "pass": true,
194
+ "steps": 1,
195
+ "status": "done",
196
+ "wall": 2.42691707611084
197
+ },
198
+ {
199
+ "name": "internet-checkbox",
200
+ "pass": true,
201
+ "steps": 1,
202
+ "status": "done",
203
+ "wall": 2.051815986633301
204
+ },
205
+ {
206
+ "name": "internet-checkbox",
207
+ "pass": true,
208
+ "steps": 1,
209
+ "status": "done",
210
+ "wall": 2.1564059257507324
211
+ },
212
+ {
213
+ "name": "books-page2",
214
+ "pass": false,
215
+ "steps": 1,
216
+ "status": "done",
217
+ "wall": 1.9430482387542725
218
+ },
219
+ {
220
+ "name": "books-page2",
221
+ "pass": false,
222
+ "steps": 1,
223
+ "status": "done",
224
+ "wall": 1.9770045280456543
225
+ },
226
+ {
227
+ "name": "books-page2",
228
+ "pass": false,
229
+ "steps": 1,
230
+ "status": "done",
231
+ "wall": 1.9294829368591309
232
+ },
233
+ {
234
+ "name": "quotes-tag-love",
235
+ "pass": true,
236
+ "steps": 1,
237
+ "status": "done",
238
+ "wall": 3.630563974380493
239
+ },
240
+ {
241
+ "name": "quotes-tag-love",
242
+ "pass": true,
243
+ "steps": 1,
244
+ "status": "done",
245
+ "wall": 2.9477081298828125
246
+ },
247
+ {
248
+ "name": "quotes-tag-love",
249
+ "pass": true,
250
+ "steps": 1,
251
+ "status": "done",
252
+ "wall": 2.8947083950042725
253
+ },
254
+ {
255
+ "name": "hn-past",
256
+ "pass": true,
257
+ "steps": 1,
258
+ "status": "done",
259
+ "wall": 3.8496310710906982
260
+ },
261
+ {
262
+ "name": "hn-past",
263
+ "pass": true,
264
+ "steps": 1,
265
+ "status": "done",
266
+ "wall": 3.1609859466552734
267
+ },
268
+ {
269
+ "name": "hn-past",
270
+ "pass": true,
271
+ "steps": 1,
272
+ "status": "done",
273
+ "wall": 2.4889137744903564
274
+ },
275
+ {
276
+ "name": "web-search",
277
+ "pass": false,
278
+ "steps": 8,
279
+ "status": "error:ValueError",
280
+ "wall": 15.667231559753418
281
+ },
282
+ {
283
+ "name": "web-search",
284
+ "pass": false,
285
+ "steps": 9,
286
+ "status": "error:ValueError",
287
+ "wall": 13.118170261383057
288
+ },
289
+ {
290
+ "name": "web-search",
291
+ "pass": false,
292
+ "steps": 6,
293
+ "status": "error:ValueError",
294
+ "wall": 14.582857608795166
295
+ },
296
+ {
297
+ "name": "arxiv-search",
298
+ "pass": false,
299
+ "steps": 2,
300
+ "status": "error:ValueError",
301
+ "wall": 9.322384357452393
302
+ },
303
+ {
304
+ "name": "arxiv-search",
305
+ "pass": false,
306
+ "steps": 2,
307
+ "status": "error:ValueError",
308
+ "wall": 10.208577632904053
309
+ },
310
+ {
311
+ "name": "arxiv-search",
312
+ "pass": false,
313
+ "steps": 2,
314
+ "status": "error:ValueError",
315
+ "wall": 10.149547815322876
316
+ },
317
+ {
318
+ "name": "flights",
319
+ "pass": false,
320
+ "steps": 14,
321
+ "status": "error:ValueError",
322
+ "wall": 9.853911638259888
323
+ },
324
+ {
325
+ "name": "flights",
326
+ "pass": false,
327
+ "steps": 14,
328
+ "status": "error:ValueError",
329
+ "wall": 9.251529693603516
330
+ },
331
+ {
332
+ "name": "flights",
333
+ "pass": false,
334
+ "steps": 20,
335
+ "status": "ready",
336
+ "wall": 6.629589080810547
337
+ }
338
+ ]
results/round3/suite_h2_laya-browser-v12s.json ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "wiki-einstein",
4
+ "pass": true,
5
+ "steps": 3,
6
+ "status": "done",
7
+ "wall": 6.088091135025024
8
+ },
9
+ {
10
+ "name": "wiki-einstein",
11
+ "pass": true,
12
+ "steps": 3,
13
+ "status": "done",
14
+ "wall": 4.1120641231536865
15
+ },
16
+ {
17
+ "name": "wiki-einstein",
18
+ "pass": true,
19
+ "steps": 3,
20
+ "status": "done",
21
+ "wall": 4.785888195037842
22
+ },
23
+ {
24
+ "name": "wiki-search",
25
+ "pass": true,
26
+ "steps": 2,
27
+ "status": "done",
28
+ "wall": 4.805815935134888
29
+ },
30
+ {
31
+ "name": "wiki-search",
32
+ "pass": true,
33
+ "steps": 2,
34
+ "status": "done",
35
+ "wall": 4.1727588176727295
36
+ },
37
+ {
38
+ "name": "wiki-search",
39
+ "pass": true,
40
+ "steps": 2,
41
+ "status": "done",
42
+ "wall": 3.9865856170654297
43
+ },
44
+ {
45
+ "name": "hn-new",
46
+ "pass": false,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 3.6679415702819824
50
+ },
51
+ {
52
+ "name": "hn-new",
53
+ "pass": false,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 2.4920201301574707
57
+ },
58
+ {
59
+ "name": "hn-new",
60
+ "pass": false,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.4279229640960693
64
+ },
65
+ {
66
+ "name": "hn-login-page",
67
+ "pass": false,
68
+ "steps": 3,
69
+ "status": "done",
70
+ "wall": 4.908161878585815
71
+ },
72
+ {
73
+ "name": "hn-login-page",
74
+ "pass": false,
75
+ "steps": 3,
76
+ "status": "done",
77
+ "wall": 3.3291561603546143
78
+ },
79
+ {
80
+ "name": "hn-login-page",
81
+ "pass": false,
82
+ "steps": 3,
83
+ "status": "done",
84
+ "wall": 3.2981934547424316
85
+ },
86
+ {
87
+ "name": "gh-issues",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 7.582534551620483
92
+ },
93
+ {
94
+ "name": "gh-issues",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 3.5515997409820557
99
+ },
100
+ {
101
+ "name": "gh-issues",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 3.4299209117889404
106
+ },
107
+ {
108
+ "name": "py-downloads",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 4.59052300453186
113
+ },
114
+ {
115
+ "name": "py-downloads",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 2.7227585315704346
120
+ },
121
+ {
122
+ "name": "py-downloads",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 2.298168897628784
127
+ },
128
+ {
129
+ "name": "books-travel",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 3.351111650466919
134
+ },
135
+ {
136
+ "name": "books-travel",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 1.9312889575958252
141
+ },
142
+ {
143
+ "name": "books-travel",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 2.046699285507202
148
+ },
149
+ {
150
+ "name": "books-open-book",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 2.01000714302063
155
+ },
156
+ {
157
+ "name": "books-open-book",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 1.8002934455871582
162
+ },
163
+ {
164
+ "name": "books-open-book",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 1.8848111629486084
169
+ },
170
+ {
171
+ "name": "internet-dropdown",
172
+ "pass": true,
173
+ "steps": 1,
174
+ "status": "done",
175
+ "wall": 4.636353254318237
176
+ },
177
+ {
178
+ "name": "internet-dropdown",
179
+ "pass": true,
180
+ "steps": 1,
181
+ "status": "done",
182
+ "wall": 2.068424701690674
183
+ },
184
+ {
185
+ "name": "internet-dropdown",
186
+ "pass": true,
187
+ "steps": 1,
188
+ "status": "done",
189
+ "wall": 2.11932373046875
190
+ },
191
+ {
192
+ "name": "internet-checkbox",
193
+ "pass": true,
194
+ "steps": 1,
195
+ "status": "done",
196
+ "wall": 2.576756000518799
197
+ },
198
+ {
199
+ "name": "internet-checkbox",
200
+ "pass": true,
201
+ "steps": 1,
202
+ "status": "done",
203
+ "wall": 2.0067596435546875
204
+ },
205
+ {
206
+ "name": "internet-checkbox",
207
+ "pass": true,
208
+ "steps": 1,
209
+ "status": "done",
210
+ "wall": 2.1043567657470703
211
+ },
212
+ {
213
+ "name": "books-page2",
214
+ "pass": false,
215
+ "steps": 1,
216
+ "status": "done",
217
+ "wall": 1.9515693187713623
218
+ },
219
+ {
220
+ "name": "books-page2",
221
+ "pass": false,
222
+ "steps": 1,
223
+ "status": "done",
224
+ "wall": 2.0128142833709717
225
+ },
226
+ {
227
+ "name": "books-page2",
228
+ "pass": false,
229
+ "steps": 1,
230
+ "status": "done",
231
+ "wall": 1.850271224975586
232
+ },
233
+ {
234
+ "name": "quotes-tag-love",
235
+ "pass": true,
236
+ "steps": 1,
237
+ "status": "done",
238
+ "wall": 3.917008399963379
239
+ },
240
+ {
241
+ "name": "quotes-tag-love",
242
+ "pass": true,
243
+ "steps": 1,
244
+ "status": "done",
245
+ "wall": 2.8107078075408936
246
+ },
247
+ {
248
+ "name": "quotes-tag-love",
249
+ "pass": true,
250
+ "steps": 1,
251
+ "status": "done",
252
+ "wall": 2.968144655227661
253
+ },
254
+ {
255
+ "name": "hn-past",
256
+ "pass": false,
257
+ "steps": 7,
258
+ "status": "blocked",
259
+ "wall": 4.717610836029053
260
+ },
261
+ {
262
+ "name": "hn-past",
263
+ "pass": false,
264
+ "steps": 7,
265
+ "status": "blocked",
266
+ "wall": 3.822110176086426
267
+ },
268
+ {
269
+ "name": "hn-past",
270
+ "pass": false,
271
+ "steps": 7,
272
+ "status": "blocked",
273
+ "wall": 3.8178353309631348
274
+ },
275
+ {
276
+ "name": "web-search",
277
+ "pass": false,
278
+ "steps": 14,
279
+ "status": "done",
280
+ "wall": 16.275484323501587
281
+ },
282
+ {
283
+ "name": "web-search",
284
+ "pass": true,
285
+ "steps": 2,
286
+ "status": "done",
287
+ "wall": 4.697402477264404
288
+ },
289
+ {
290
+ "name": "web-search",
291
+ "pass": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 4.85608983039856
295
+ },
296
+ {
297
+ "name": "arxiv-search",
298
+ "pass": true,
299
+ "steps": 3,
300
+ "status": "done",
301
+ "wall": 5.771880865097046
302
+ },
303
+ {
304
+ "name": "arxiv-search",
305
+ "pass": true,
306
+ "steps": 3,
307
+ "status": "done",
308
+ "wall": 4.881175994873047
309
+ },
310
+ {
311
+ "name": "arxiv-search",
312
+ "pass": true,
313
+ "steps": 3,
314
+ "status": "done",
315
+ "wall": 3.4859631061553955
316
+ },
317
+ {
318
+ "name": "flights",
319
+ "pass": false,
320
+ "steps": 20,
321
+ "status": "ready",
322
+ "wall": 9.096100568771362
323
+ },
324
+ {
325
+ "name": "flights",
326
+ "pass": false,
327
+ "steps": 14,
328
+ "status": "blocked",
329
+ "wall": 5.75098180770874
330
+ },
331
+ {
332
+ "name": "flights",
333
+ "pass": false,
334
+ "steps": 15,
335
+ "status": "blocked",
336
+ "wall": 6.6374828815460205
337
+ }
338
+ ]
results/round3/suite_h2c40_laya-browser-v12s.json ADDED
@@ -0,0 +1,338 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "name": "wiki-einstein",
4
+ "pass": false,
5
+ "steps": 1,
6
+ "status": "done",
7
+ "wall": 3.807706832885742
8
+ },
9
+ {
10
+ "name": "wiki-einstein",
11
+ "pass": false,
12
+ "steps": 1,
13
+ "status": "done",
14
+ "wall": 2.3761672973632812
15
+ },
16
+ {
17
+ "name": "wiki-einstein",
18
+ "pass": false,
19
+ "steps": 1,
20
+ "status": "done",
21
+ "wall": 2.567605495452881
22
+ },
23
+ {
24
+ "name": "wiki-search",
25
+ "pass": true,
26
+ "steps": 2,
27
+ "status": "done",
28
+ "wall": 4.4094016551971436
29
+ },
30
+ {
31
+ "name": "wiki-search",
32
+ "pass": true,
33
+ "steps": 2,
34
+ "status": "done",
35
+ "wall": 4.763357162475586
36
+ },
37
+ {
38
+ "name": "wiki-search",
39
+ "pass": true,
40
+ "steps": 2,
41
+ "status": "done",
42
+ "wall": 4.382323265075684
43
+ },
44
+ {
45
+ "name": "hn-new",
46
+ "pass": true,
47
+ "steps": 1,
48
+ "status": "done",
49
+ "wall": 2.7456138134002686
50
+ },
51
+ {
52
+ "name": "hn-new",
53
+ "pass": true,
54
+ "steps": 1,
55
+ "status": "done",
56
+ "wall": 2.794174909591675
57
+ },
58
+ {
59
+ "name": "hn-new",
60
+ "pass": true,
61
+ "steps": 1,
62
+ "status": "done",
63
+ "wall": 2.594071626663208
64
+ },
65
+ {
66
+ "name": "hn-login-page",
67
+ "pass": true,
68
+ "steps": 1,
69
+ "status": "done",
70
+ "wall": 2.8987975120544434
71
+ },
72
+ {
73
+ "name": "hn-login-page",
74
+ "pass": true,
75
+ "steps": 1,
76
+ "status": "done",
77
+ "wall": 2.7102601528167725
78
+ },
79
+ {
80
+ "name": "hn-login-page",
81
+ "pass": true,
82
+ "steps": 1,
83
+ "status": "done",
84
+ "wall": 2.4696624279022217
85
+ },
86
+ {
87
+ "name": "gh-issues",
88
+ "pass": true,
89
+ "steps": 1,
90
+ "status": "done",
91
+ "wall": 5.98798680305481
92
+ },
93
+ {
94
+ "name": "gh-issues",
95
+ "pass": true,
96
+ "steps": 1,
97
+ "status": "done",
98
+ "wall": 3.4403786659240723
99
+ },
100
+ {
101
+ "name": "gh-issues",
102
+ "pass": true,
103
+ "steps": 1,
104
+ "status": "done",
105
+ "wall": 3.37373423576355
106
+ },
107
+ {
108
+ "name": "py-downloads",
109
+ "pass": true,
110
+ "steps": 1,
111
+ "status": "done",
112
+ "wall": 2.724518299102783
113
+ },
114
+ {
115
+ "name": "py-downloads",
116
+ "pass": true,
117
+ "steps": 1,
118
+ "status": "done",
119
+ "wall": 2.5852811336517334
120
+ },
121
+ {
122
+ "name": "py-downloads",
123
+ "pass": true,
124
+ "steps": 1,
125
+ "status": "done",
126
+ "wall": 2.565865993499756
127
+ },
128
+ {
129
+ "name": "books-travel",
130
+ "pass": true,
131
+ "steps": 1,
132
+ "status": "done",
133
+ "wall": 2.0555620193481445
134
+ },
135
+ {
136
+ "name": "books-travel",
137
+ "pass": true,
138
+ "steps": 1,
139
+ "status": "done",
140
+ "wall": 2.0139927864074707
141
+ },
142
+ {
143
+ "name": "books-travel",
144
+ "pass": true,
145
+ "steps": 1,
146
+ "status": "done",
147
+ "wall": 1.9735207557678223
148
+ },
149
+ {
150
+ "name": "books-open-book",
151
+ "pass": true,
152
+ "steps": 1,
153
+ "status": "done",
154
+ "wall": 2.1686925888061523
155
+ },
156
+ {
157
+ "name": "books-open-book",
158
+ "pass": true,
159
+ "steps": 1,
160
+ "status": "done",
161
+ "wall": 1.7811036109924316
162
+ },
163
+ {
164
+ "name": "books-open-book",
165
+ "pass": true,
166
+ "steps": 1,
167
+ "status": "done",
168
+ "wall": 1.8474400043487549
169
+ },
170
+ {
171
+ "name": "internet-dropdown",
172
+ "pass": true,
173
+ "steps": 1,
174
+ "status": "done",
175
+ "wall": 2.797389507293701
176
+ },
177
+ {
178
+ "name": "internet-dropdown",
179
+ "pass": true,
180
+ "steps": 1,
181
+ "status": "done",
182
+ "wall": 2.0917704105377197
183
+ },
184
+ {
185
+ "name": "internet-dropdown",
186
+ "pass": true,
187
+ "steps": 1,
188
+ "status": "done",
189
+ "wall": 2.2623064517974854
190
+ },
191
+ {
192
+ "name": "internet-checkbox",
193
+ "pass": true,
194
+ "steps": 1,
195
+ "status": "done",
196
+ "wall": 2.3313634395599365
197
+ },
198
+ {
199
+ "name": "internet-checkbox",
200
+ "pass": true,
201
+ "steps": 1,
202
+ "status": "done",
203
+ "wall": 2.104766368865967
204
+ },
205
+ {
206
+ "name": "internet-checkbox",
207
+ "pass": true,
208
+ "steps": 1,
209
+ "status": "done",
210
+ "wall": 2.1607117652893066
211
+ },
212
+ {
213
+ "name": "books-page2",
214
+ "pass": false,
215
+ "steps": 1,
216
+ "status": "done",
217
+ "wall": 1.7619709968566895
218
+ },
219
+ {
220
+ "name": "books-page2",
221
+ "pass": false,
222
+ "steps": 1,
223
+ "status": "done",
224
+ "wall": 1.8645665645599365
225
+ },
226
+ {
227
+ "name": "books-page2",
228
+ "pass": false,
229
+ "steps": 1,
230
+ "status": "done",
231
+ "wall": 1.977370023727417
232
+ },
233
+ {
234
+ "name": "quotes-tag-love",
235
+ "pass": true,
236
+ "steps": 1,
237
+ "status": "done",
238
+ "wall": 3.4522359371185303
239
+ },
240
+ {
241
+ "name": "quotes-tag-love",
242
+ "pass": true,
243
+ "steps": 1,
244
+ "status": "done",
245
+ "wall": 2.9943950176239014
246
+ },
247
+ {
248
+ "name": "quotes-tag-love",
249
+ "pass": true,
250
+ "steps": 1,
251
+ "status": "done",
252
+ "wall": 2.8459112644195557
253
+ },
254
+ {
255
+ "name": "hn-past",
256
+ "pass": true,
257
+ "steps": 1,
258
+ "status": "done",
259
+ "wall": 2.764420747756958
260
+ },
261
+ {
262
+ "name": "hn-past",
263
+ "pass": true,
264
+ "steps": 1,
265
+ "status": "done",
266
+ "wall": 2.925821304321289
267
+ },
268
+ {
269
+ "name": "hn-past",
270
+ "pass": true,
271
+ "steps": 1,
272
+ "status": "done",
273
+ "wall": 2.6401472091674805
274
+ },
275
+ {
276
+ "name": "web-search",
277
+ "pass": true,
278
+ "steps": 2,
279
+ "status": "done",
280
+ "wall": 7.507221460342407
281
+ },
282
+ {
283
+ "name": "web-search",
284
+ "pass": true,
285
+ "steps": 2,
286
+ "status": "done",
287
+ "wall": 3.8072285652160645
288
+ },
289
+ {
290
+ "name": "web-search",
291
+ "pass": true,
292
+ "steps": 2,
293
+ "status": "done",
294
+ "wall": 4.1349287033081055
295
+ },
296
+ {
297
+ "name": "arxiv-search",
298
+ "pass": false,
299
+ "steps": 1,
300
+ "status": "error:ValueError",
301
+ "wall": 1.9037411212921143
302
+ },
303
+ {
304
+ "name": "arxiv-search",
305
+ "pass": false,
306
+ "steps": 1,
307
+ "status": "error:ValueError",
308
+ "wall": 0.8892548084259033
309
+ },
310
+ {
311
+ "name": "arxiv-search",
312
+ "pass": false,
313
+ "steps": 1,
314
+ "status": "error:ValueError",
315
+ "wall": 0.9213480949401855
316
+ },
317
+ {
318
+ "name": "flights",
319
+ "pass": false,
320
+ "steps": 20,
321
+ "status": "ready",
322
+ "wall": 8.24284815788269
323
+ },
324
+ {
325
+ "name": "flights",
326
+ "pass": false,
327
+ "steps": 20,
328
+ "status": "ready",
329
+ "wall": 6.250298261642456
330
+ },
331
+ {
332
+ "name": "flights",
333
+ "pass": false,
334
+ "steps": 20,
335
+ "status": "blocked",
336
+ "wall": 6.608509063720703
337
+ }
338
+ ]
results/round3/suite_v12s.log ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ == suite laya-browser-v12s x3 (patched harness)
2
+ PASS wiki-einstein steps= 3 status=done 6.1s https://en.wikipedia.org/wiki/Albert_Einstein
3
+ PASS wiki-einstein steps= 3 status=done 4.1s https://en.wikipedia.org/wiki/Albert_Einstein
4
+ PASS wiki-einstein steps= 3 status=done 4.8s https://en.wikipedia.org/wiki/Albert_Einstein
5
+ PASS wiki-search steps= 2 status=done 4.8s https://en.wikipedia.org/wiki/Python_(programming_language)
6
+ PASS wiki-search steps= 2 status=done 4.2s https://en.wikipedia.org/wiki/Python_(programming_language)
7
+ PASS wiki-search steps= 2 status=done 4.0s https://en.wikipedia.org/wiki/Python_(programming_language)
8
+ FAIL hn-new steps= 1 status=done 3.7s https://news.ycombinator.com/front
9
+ FAIL hn-new steps= 1 status=done 2.5s https://news.ycombinator.com/front
10
+ FAIL hn-new steps= 1 status=done 2.4s https://news.ycombinator.com/front
11
+ FAIL hn-login-page steps= 3 status=done 4.9s https://news.ycombinator.com/submit
12
+ FAIL hn-login-page steps= 3 status=done 3.3s https://news.ycombinator.com/submit
13
+ FAIL hn-login-page steps= 3 status=done 3.3s https://news.ycombinator.com/submit
14
+ PASS gh-issues steps= 1 status=done 7.6s https://github.com/tile-ai/tilelang/issues
15
+ PASS gh-issues steps= 1 status=done 3.6s https://github.com/tile-ai/tilelang/issues
16
+ PASS gh-issues steps= 1 status=done 3.4s https://github.com/tile-ai/tilelang/issues
17
+ PASS py-downloads steps= 1 status=done 4.6s https://www.python.org/downloads/
18
+ PASS py-downloads steps= 1 status=done 2.7s https://www.python.org/downloads/
19
+ PASS py-downloads steps= 1 status=done 2.3s https://www.python.org/downloads/
20
+ PASS books-travel steps= 1 status=done 3.4s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
21
+ PASS books-travel steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
22
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
23
+ PASS books-open-book steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
24
+ PASS books-open-book steps= 1 status=done 1.8s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
25
+ PASS books-open-book steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
26
+ PASS internet-dropdown steps= 1 status=done 4.6s https://the-internet.herokuapp.com/dropdown
27
+ PASS internet-dropdown steps= 1 status=done 2.1s https://the-internet.herokuapp.com/dropdown
28
+ PASS internet-dropdown steps= 1 status=done 2.1s https://the-internet.herokuapp.com/dropdown
29
+ PASS internet-checkbox steps= 1 status=done 2.6s https://the-internet.herokuapp.com/checkboxes
30
+ PASS internet-checkbox steps= 1 status=done 2.0s https://the-internet.herokuapp.com/checkboxes
31
+ PASS internet-checkbox steps= 1 status=done 2.1s https://the-internet.herokuapp.com/checkboxes
32
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
33
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
34
+ FAIL books-page2 steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
35
+ PASS quotes-tag-love steps= 1 status=done 3.9s https://quotes.toscrape.com/tag/love/
36
+ PASS quotes-tag-love steps= 1 status=done 2.8s https://quotes.toscrape.com/tag/love/
37
+ PASS quotes-tag-love steps= 1 status=done 3.0s https://quotes.toscrape.com/tag/love/
38
+ FAIL hn-past steps= 7 status=blocked 4.7s https://news.ycombinator.com/login?goto=news
39
+ FAIL hn-past steps= 7 status=blocked 3.8s https://news.ycombinator.com/login?goto=news
40
+ FAIL hn-past steps= 7 status=blocked 3.8s https://news.ycombinator.com/login?goto=news
41
+ FAIL web-search steps=14 status=done 16.3s https://marginalia-search.com/
42
+ PASS web-search steps= 2 status=done 4.7s https://marginalia-search.com/search?query=tilelang+github&profile=cor
43
+ PASS web-search steps= 2 status=done 4.9s https://marginalia-search.com/search?query=tilelang+github&profile=cor
44
+ PASS arxiv-search steps= 3 status=done 5.8s https://arxiv.org/search/?query=flash+attention&searchtype=all&source=
45
+ PASS arxiv-search steps= 3 status=done 4.9s https://arxiv.org/search/?query=flash+attention&searchtype=all&source=
46
+ PASS arxiv-search steps= 3 status=done 3.5s https://arxiv.org/search/?query=flash+attention&searchtype=all&source=
47
+ FAIL flights steps=20 status=ready 9.1s https://www.google.com/travel/flights/search?tfs=CBwQAhooEgoyMDI2LTEwL
48
+ FAIL flights steps=14 status=blocked 5.8s https://www.google.com/travel/flights?hl=en
49
+ FAIL flights steps=15 status=blocked 6.6s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
50
+ == 32/48 passed (67%, 3 run(s) per task) | median wall 3.6s
51
+ per task: wiki-einstein=3/3 wiki-search=3/3 hn-new=0/3 hn-login-page=0/3 gh-issues=3/3 py-downloads=3/3 books-travel=3/3 books-open-book=3/3 internet-dropdown=3/3 internet-checkbox=3/3 books-page2=0/3 quotes-tag-love=3/3 hn-past=0/3 web-search=2/3 arxiv-search=3/3 flights=0/3
52
+ == suite laya-browser-v10s x3 (patched harness)
53
+ FAIL wiki-einstein steps= 2 status=done 3.8s https://en.wikipedia.org/wiki/Main_Page
54
+ FAIL wiki-einstein steps= 2 status=done 3.2s https://en.wikipedia.org/wiki/Main_Page
55
+ FAIL wiki-einstein steps= 2 status=done 2.8s https://en.wikipedia.org/wiki/Main_Page
56
+ FAIL wiki-search steps=20 status=ready 7.7s https://en.wikipedia.org/w/index.php?search=&title=Special%3ASearch&pr
57
+ FAIL wiki-search steps=11 status=blocked 6.3s https://en.wikipedia.org/w/index.php?search=&title=Special%3ASearch
58
+ FAIL wiki-search steps=20 status=ready 7.2s https://en.wikipedia.org/w/index.php?search=&title=Special%3ASearch
59
+ PASS hn-new steps= 1 status=done 3.1s https://news.ycombinator.com/newest
60
+ PASS hn-new steps= 1 status=done 2.7s https://news.ycombinator.com/newest
61
+ PASS hn-new steps= 1 status=done 2.6s https://news.ycombinator.com/newest
62
+ PASS hn-login-page steps= 1 status=done 2.8s https://news.ycombinator.com/login?goto=news
63
+ PASS hn-login-page steps= 1 status=done 2.4s https://news.ycombinator.com/login?goto=news
64
+ PASS hn-login-page steps= 1 status=done 2.5s https://news.ycombinator.com/login?goto=news
65
+ PASS gh-issues steps= 1 status=done 4.7s https://github.com/tile-ai/tilelang/issues
66
+ PASS gh-issues steps= 1 status=done 3.3s https://github.com/tile-ai/tilelang/issues
67
+ PASS gh-issues steps= 1 status=done 3.5s https://github.com/tile-ai/tilelang/issues
68
+ PASS py-downloads steps= 1 status=done 2.4s https://www.python.org/downloads/
69
+ PASS py-downloads steps= 1 status=done 2.4s https://www.python.org/downloads/
70
+ PASS py-downloads steps= 1 status=done 2.6s https://www.python.org/downloads/
71
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
72
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
73
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
74
+ PASS books-open-book steps= 1 status=done 2.2s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
75
+ PASS books-open-book steps= 1 status=done 1.7s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
76
+ PASS books-open-book steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
77
+ PASS internet-dropdown steps= 1 status=done 2.8s https://the-internet.herokuapp.com/dropdown
78
+ PASS internet-dropdown steps= 1 status=done 2.1s https://the-internet.herokuapp.com/dropdown
79
+ PASS internet-dropdown steps= 1 status=done 2.2s https://the-internet.herokuapp.com/dropdown
80
+ PASS internet-checkbox steps= 1 status=done 2.4s https://the-internet.herokuapp.com/checkboxes
81
+ PASS internet-checkbox steps= 1 status=done 2.1s https://the-internet.herokuapp.com/checkboxes
82
+ PASS internet-checkbox steps= 1 status=done 2.2s https://the-internet.herokuapp.com/checkboxes
83
+ FAIL books-page2 steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
84
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
85
+ FAIL books-page2 steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
86
+ PASS quotes-tag-love steps= 1 status=done 3.6s https://quotes.toscrape.com/tag/love/
87
+ PASS quotes-tag-love steps= 1 status=done 2.9s https://quotes.toscrape.com/tag/love/
88
+ PASS quotes-tag-love steps= 1 status=done 2.9s https://quotes.toscrape.com/tag/love/
89
+ PASS hn-past steps= 1 status=done 3.8s https://news.ycombinator.com/front
90
+ PASS hn-past steps= 1 status=done 3.2s https://news.ycombinator.com/front
91
+ PASS hn-past steps= 1 status=done 2.5s https://news.ycombinator.com/front
92
+ FAIL web-search steps= 8 status=error:ValueError 15.7s https://github.com/MarginaliaSearch/MarginaliaSearch/issues?q=is%3Aiss
93
+ FAIL web-search steps= 9 status=error:ValueError 13.1s https://github.com/MarginaliaSearch/MarginaliaSearch/issues?q=is%3Aiss
94
+ FAIL web-search steps= 6 status=error:ValueError 14.6s https://github.com/MarginaliaSearch/MarginaliaSearch/issues?q=is%3Aiss
95
+ FAIL arxiv-search steps= 2 status=error:ValueError 9.3s https://arxiv.org/
96
+ FAIL arxiv-search steps= 2 status=error:ValueError 10.2s https://arxiv.org/
97
+ FAIL arxiv-search steps= 2 status=error:ValueError 10.1s https://arxiv.org/
98
+ FAIL flights steps=14 status=error:ValueError 9.9s https://www.google.com/travel/flights?tfs=CBwQARocagwIAxIIL20vMDg5NjZy
99
+ FAIL flights steps=14 status=error:ValueError 9.3s https://www.google.com/travel/flights?tfs=CBwQARocagwIAxIIL20vMDg5NjZy
100
+ FAIL flights steps=20 status=ready 6.6s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
101
+ == 30/48 passed (62%, 3 run(s) per task) | median wall 2.8s
102
+ per task: wiki-einstein=0/3 wiki-search=0/3 hn-new=3/3 hn-login-page=3/3 gh-issues=3/3 py-downloads=3/3 books-travel=3/3 books-open-book=3/3 internet-dropdown=3/3 internet-checkbox=3/3 books-page2=0/3 quotes-tag-love=3/3 hn-past=3/3 web-search=0/3 arxiv-search=0/3 flights=0/3
103
+ SUITE_V12S_DONE
results/round3/suite_v12s_c40.log ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FAIL wiki-einstein steps= 1 status=done 3.8s https://en.wikipedia.org/wiki/Main_Page#/media/File:SMRT_C151_set_065-
2
+ FAIL wiki-einstein steps= 1 status=done 2.4s https://en.wikipedia.org/wiki/Main_Page#/media/File:SMRT_C151_set_065-
3
+ FAIL wiki-einstein steps= 1 status=done 2.6s https://en.wikipedia.org/wiki/Main_Page#/media/File:SMRT_C151_set_065-
4
+ PASS wiki-search steps= 2 status=done 4.4s https://en.wikipedia.org/wiki/Python_(programming_language)
5
+ PASS wiki-search steps= 2 status=done 4.8s https://en.wikipedia.org/wiki/Python_(programming_language)
6
+ PASS wiki-search steps= 2 status=done 4.4s https://en.wikipedia.org/wiki/Python_(programming_language)
7
+ PASS hn-new steps= 1 status=done 2.7s https://news.ycombinator.com/newest
8
+ PASS hn-new steps= 1 status=done 2.8s https://news.ycombinator.com/newest
9
+ PASS hn-new steps= 1 status=done 2.6s https://news.ycombinator.com/newest
10
+ PASS hn-login-page steps= 1 status=done 2.9s https://news.ycombinator.com/login?goto=news
11
+ PASS hn-login-page steps= 1 status=done 2.7s https://news.ycombinator.com/login?goto=news
12
+ PASS hn-login-page steps= 1 status=done 2.5s https://news.ycombinator.com/login?goto=news
13
+ PASS gh-issues steps= 1 status=done 6.0s https://github.com/tile-ai/tilelang/issues
14
+ PASS gh-issues steps= 1 status=done 3.4s https://github.com/tile-ai/tilelang/issues
15
+ PASS gh-issues steps= 1 status=done 3.4s https://github.com/tile-ai/tilelang/issues
16
+ PASS py-downloads steps= 1 status=done 2.7s https://www.python.org/downloads/
17
+ PASS py-downloads steps= 1 status=done 2.6s https://www.python.org/downloads/
18
+ PASS py-downloads steps= 1 status=done 2.6s https://www.python.org/downloads/
19
+ PASS books-travel steps= 1 status=done 2.1s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
20
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
21
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
22
+ PASS books-open-book steps= 1 status=done 2.2s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
23
+ PASS books-open-book steps= 1 status=done 1.8s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
24
+ PASS books-open-book steps= 1 status=done 1.8s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
25
+ PASS internet-dropdown steps= 1 status=done 2.8s https://the-internet.herokuapp.com/dropdown
26
+ PASS internet-dropdown steps= 1 status=done 2.1s https://the-internet.herokuapp.com/dropdown
27
+ PASS internet-dropdown steps= 1 status=done 2.3s https://the-internet.herokuapp.com/dropdown
28
+ PASS internet-checkbox steps= 1 status=done 2.3s https://the-internet.herokuapp.com/checkboxes
29
+ PASS internet-checkbox steps= 1 status=done 2.1s https://the-internet.herokuapp.com/checkboxes
30
+ PASS internet-checkbox steps= 1 status=done 2.2s https://the-internet.herokuapp.com/checkboxes
31
+ FAIL books-page2 steps= 1 status=done 1.8s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
32
+ FAIL books-page2 steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
33
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
34
+ PASS quotes-tag-love steps= 1 status=done 3.5s https://quotes.toscrape.com/tag/love/
35
+ PASS quotes-tag-love steps= 1 status=done 3.0s https://quotes.toscrape.com/tag/love/
36
+ PASS quotes-tag-love steps= 1 status=done 2.8s https://quotes.toscrape.com/tag/love/
37
+ PASS hn-past steps= 1 status=done 2.8s https://news.ycombinator.com/front
38
+ PASS hn-past steps= 1 status=done 2.9s https://news.ycombinator.com/front
39
+ PASS hn-past steps= 1 status=done 2.6s https://news.ycombinator.com/front
40
+ PASS web-search steps= 2 status=done 7.5s https://marginalia-search.com/search?query=tilelang+github&profile=cor
41
+ PASS web-search steps= 2 status=done 3.8s https://marginalia-search.com/search?query=tilelang+github&sst=SE-655d
42
+ PASS web-search steps= 2 status=done 4.1s https://marginalia-search.com/search?query=tilelang+github&profile=cor
43
+ FAIL arxiv-search steps= 1 status=error:ValueError 1.9s https://arxiv.org/login
44
+ FAIL arxiv-search steps= 1 status=error:ValueError 0.9s https://arxiv.org/login
45
+ FAIL arxiv-search steps= 1 status=error:ValueError 0.9s https://arxiv.org/login
46
+ FAIL flights steps=20 status=ready 8.2s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
47
+ FAIL flights steps=20 status=ready 6.3s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIBBIIL20vMDJqNzEa
48
+ FAIL flights steps=20 status=blocked 6.6s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
49
+ == 36/48 passed (75%, 3 run(s) per task) | median wall 2.7s
50
+ per task: wiki-einstein=0/3 wiki-search=3/3 hn-new=3/3 hn-login-page=3/3 gh-issues=3/3 py-downloads=3/3 books-travel=3/3 books-open-book=3/3 internet-dropdown=3/3 internet-checkbox=3/3 books-page2=0/3 quotes-tag-love=3/3 hn-past=3/3 web-search=3/3 arxiv-search=0/3 flights=0/3
results/round3/train_domains.json ADDED
@@ -0,0 +1 @@
 
 
1
+ ["14945.blackbaudhosting.com", "aa", "aa.com", "abc.net.au", "about.gitlab.com", "about.google", "accessmedicalrehab.com", "account.apple.com", "account.bbc.com", "account.wolfram.com", "accounts.google.com", "aclanthology.org", "admissions.duke.edu", "ads.google.com", "agoda", "agoda.com", "ai.google", "airbnb", "airbnb.com", "aliexpress.com", "aljazeera.com", "alliedartsguild.org", "allrecipes.com", "alternativeto.net", "amazon", "amazon.com", "amctheatres", "amctheatres.com", "amtrak", "amtrak.com", "aoschat.apple.com", "apache.org", "api.bfl.ml", "api.endpoints.huggingface.cloud", "apnews.com", "apple", "apple.com", "apps.apple.com", "archive.org", "archlinux.org", "arrowheadpride.com", "arstechnica.com", "arxiv.org", "askubuntu.com", "aur.archlinux.org", "australia.gov.au", "auth.allrecipes.com", "auth.wikimedia.org", "automationexercise.com", "autotrader.com", "baidu.com", "bandcamp.com", "bbc.co.uk", "bbc.com", "bbcgoodfood.com", "berkeley.edu", "bestbuy.com", "bgr.com", "bilibili.com", "bing.com", "biodiversitylibrary.org", "biorxiv.org", "bits.debian.org", "blanchardgold.com", "blog.coursera.org", "blog.google", "blog.packagist.com", "blog.rust-lang.org", "bluezones.com", "boardgamegeek", "boardgamegeek.com", "bookdepository", "bookdepository.com", "booking", "booking.com", "books.toscrape.com", "britannica.com", "bsky.app", "budget", "budget.com", "budgetbytes.com", "builtinla.com", "bulatov.org", "bundesregierung.de", "business.apple.com", "cabelas", "cabelas.com", "calculator.net", "cam.ac.uk", "canada.ca", "capterra.com", "cargurus", "cargurus.com", "carmax", "carmax.com", "carnival", "carnival.com", "catalog.data.gov", "cbc.ca", "cbssports.com", "cdc.gov", "census.gov", "cern.ch", "checkcoverage.apple.com", "chess.com", "chi2023.acm.org", "chooser-beta.creativecommons.org", "circlecare4kids.com", "cli.github.com", "climate.com", "codeberg.org", "codeql.github.com", "colab.research.google.com", "commons.wikimedia.org", "companiesmarketcap.com", "compass.cornwall.gov.uk", "conservatorysf.com", "contactretail.apple.com", "cookingclassy.com", "copilot.github.trust.page", "core.ac.uk", "cornell.edu", "corriere.it", "coursera.org", "cpan.org", "cppreference.com", "craigslist.org", "cran.r-project.org", "crates.io", "creativecommons.org", "csdn.net", "cvent.com", "cvs", "cvs.com", "d1.supercook.com", "data.gov", "datarepository.wolframcloud.com", "dblp.org", "dblp.uni-trier.de", "de.wikipedia.org", "debian.org", "deepl.com", "delta", "delta.com", "demo.nopcommerce.com", "demo.opencart.com", "demoblaze.com", "demoqa.com", "desmos.com", "dev.mysql.com", "dev.to", "devdocs.io", "developer.apple.com", "developer.hashicorp.com", "developer.mozilla.org", "developer.nvidia.com", "dictionary.cambridge.org", "dictionary.com", "dictionaryblog.cambridge.org", "digital.library.upenn.edu", "dis.acm.org", "discogs", "discogs.com", "discuss.huggingface.co", "discussions.apple.com", "dmytro-shyshkin.kit.com", "doaj.org", "doc.rust-lang.org", "docker.com", "docs.ansible.com", "docs.bfl.ml", "docs.djangoproject.com", "docs.docker.com", "docs.github.com", "docs.gitlab.com", "docs.graphene-python.org", "docs.oracle.com", "docs.python.org", "docs.pytorch.org", "docs.readthedocs.com", "docs.readthedocs.io", "docs.rs", "donate.wikimedia.org", "douban.com", "duckduckgo.com", "duke.edu", "duolingo.com", "dw.com", "earthobservatory.nasa.gov", "ebay", "ebay.com", "ecommerce.apple.com", "economist.com", "edx.org", "elcampesinopgh.com", "elpais.com", "en.cppreference.com", "en.wikibooks.org", "en.wikipedia.org", "en.wikiquote.org", "en.wikisource.org", "en.wikivoyage.org", "en.wiktionary.org", "endpoints.huggingface.co", "engadget.com", "enterprise", "enterprise.com", "enterprise.github.com", "epa.gov", "epicurious.com", "eric.ed.gov", "es.wikipedia.org", "esa.int", "espn", "espn.com", "ethz.ch", "etsy.com", "etymonline.com", "euronews.com", "europa.eu", "european-union.europa.eu", "europeana.eu", "eventbrite", "eventbrite.com", "eventupplanner.com", "expedia", "expedia.com", "exploretock", "exploretock.com", "fda.gov", "figshare.com", "finance.yahoo.com", "flask.palletsprojects.com", "flexera.com", "flickr.com", "flightaware", "flightaware.com", "flights.booking.com", "flyus.com", "fontawesome.com", "fonts.google.com", "foodnetwork.com", "fool.com", "formulae.brew.sh", "formy-project.herokuapp.com", "forums.parasoft.com", "foundation.wikimedia.org", "foxsports", "foxsports.com", "fr.wikipedia.org", "france24.com", "freecodecamp.org", "g2.com", "gamestop", "gamestop.com", "gayoarabicacoffee.or.id", "geeksforgeeks.org", "geogebra.org", "geonames.org", "getbootstrap.com", "getsupport.apple.com", "git-scm.com", "git.kernel.org", "gitee.com", "github.blog", "github.com", "githubstatus.com", "gitlab.archlinux.org", "gitlab.com", "glamour.com", "glassdoor.com", "globalsqa.com", "gnu.org", "go.dev", "godocs.io", "gog.com", "goodreads.com", "google.com", "gov.cn", "gov.uk", "graphql.org", "guggenheim.org", "gutenberg.org", "harvard.edu", "hashnode.com", "healthline.com", "help.github.com", "help.ubuntu.com", "hex.pm", "home.cern", "homedepot.com", "https%3a%2f%2fdictionary.cambridge.org%2fdictionary%2fenglish%2fstatuette&text=", "https%3a%2f%2fwww.google.com%2fmaps%2fpreview%2fplace%3fauthuser%3d0%26hl%3den%26gl%3dus%26pb%3d%211m24%211s0x47e671c8ff6946b9%3a0x1194a918177c2ac8%213m12%211m3%211d39369.73246780893%212d2.3643297605770677%213d48.864906460992195%212m3%211f0%212f0%213f0%213m2%211i440%212i720%214f13.1%214m2%213d48.8535799%214d2.3426408%2115m6%211m5%211s0x47e671c8ff6946b9%3a0x1194a918177c2ac8%214s%2fg%2f11l75rskx1%215schijuuzp_8hx5kcrycp8fxiplbe%216s4571445599278015326%217s100590512120706543623%216srestaurants%2bnear%2bparis%2112m4%212m3%211i360%212i120%214i8%2113m48%212m2%211i203%212i100%213m2%212i4%215b1%216m6%211m2%211i86%212i86%211m2%211i408%212i240%217m33%211m3%211e1%212b0%213e3%211m3%211e2%212b1%213e2%211m3%211e2%212b0%213e3%211m3%211e8%212b0%213e3%211m3%211e10%212b0%213e3%211m3%211e10%212b1%213e2%211m3%211e10%212b0%213e4%211m3%211e9%212b1%213e2%212b1%219b0%2114m2%211sthpuz8yuhune0pepiyxe6q0%217e81%2115m107%211m34%214e2%2113m9%212b1%213b1%214b1%216i1%218b1%219b1%2114b1%2120b1%2125b1%2118m22%213b1%214b1%215b1%216b1%219b1%2112b1%2113b1%2114b1%2117b1%2120b1%2121b1%2122b1%2125b1%2127m1%211b0%2128b0%2130b1%2132b0%2133m1%211b1%2134b0%2136e1%2110m1%218e3%2111m1%213e1%2114m1%213b1%2117b1%2120m2%211e3%211e6%2124b1%2125b1%2126b1%2129b1%2130m1%212b1%2136b1%2139m3%212m2%212i1%213i1%2143b1%2152b1%2154m1%211b1%2155b1%2156m1%211b1%2165m5%213m4%211m3%211m2%211i224%212i298%2171b1%2172m19%211m5%211b1%212b1%213b1%215b1%217b1%214b1%218m10%211m6%214m1%211e1%214m1%211e3%214m1%211e4%213sother_user_reviews%216m1%211e1%219b1%2189b1%2198m3%211b1%212b1%213b1%21103b1%21113b1%21114m3%211b1%212m1%211b1%21117b1%21122m1%211b1%21125b0%21126b1%21127b1%2121m0%2122m2%211e81%218e4%2129m0%2130m6%213b1%216m1%212b1%217m1%212b1%219b1%2134m2%217b1%2110b1%2137i715%2138schzszxn0yxvyyw50cybuzwfyifbhcmlzwhgifnjlc3rhdxjhbnrzig5lyxigcgfyaxosarfpbmrpyw5fcmvzdgf1cmfudoabaa%2139spatang%2140b0%2141b1%26q%3dpatang&ihs=5", "https%3a%2f%2fwww.google.com%2fmaps%2fpreview%2fplace%3fauthuser%3d0%26hl%3den%26gl%3dus%26pb%3d%211m24%211s0x808fa4afd47b8fa3%3a0x8d48a6ae94d4207b%213m12%211m3%211d47502.581597019554%212d-122.16297270467842%213d37.46452844837867%212m3%211f0%212f0%213f0%213m2%211i440%212i720%214f13.1%214m2%213d37.452656%214d-122.18331719999999%2115m6%211m5%211s0x808fa4afd47b8fa3%3a0x8d48a6ae94d4207b%214s%2fg%2f1tfv5c5m%215schijo4971k-kj4areydulk6msi0%216s16632359157944504516%217s106796813392715891691%216swheelchair-accessible%2brestaurants%2bnear%2bme%2112m4%212m3%211i360%212i120%214i8%2113m48%212m2%211i203%212i100%213m2%212i4%215b1%216m6%211m2%211i86%212i86%211m2%211i408%212i240%217m33%211m3%211e1%212b0%213e3%211m3%211e2%212b1%213e2%211m3%211e2%212b0%213e3%211m3%211e8%212b0%213e3%211m3%211e10%212b0%213e3%211m3%211e10%212b1%213e2%211m3%211e10%212b0%213e4%211m3%211e9%212b1%213e2%212b1%219b0%2114m2%211szojxz--ab8hd0pep7qs5ua%217e81%2115m107%211m34%214e2%2113m9%212b1%213b1%214b1%216i1%218b1%219b1%2114b1%2120b1%2125b1%2118m22%213b1%214b1%215b1%216b1%219b1%2112b1%2113b1%2114b1%2117b1%2120b1%2121b1%2122b1%2125b1%2127m1%211b0%2128b0%2130b1%2132b0%2133m1%211b1%2134b0%2136e1%2110m1%218e3%2111m1%213e1%2114m1%213b1%2117b1%2120m2%211e3%211e6%2124b1%2125b1%2126b1%2129b1%2130m1%212b1%2136b1%2139m3%212m2%212i1%213i1%2143b1%2152b1%2154m1%211b1%2155b1%2156m1%211b1%2165m5%213m4%211m3%211m2%211i224%212i298%2171b1%2172m19%211m5%211b1%212b1%213b1%215b1%217b1%214b1%218m10%211m6%214m1%211e1%214m1%211e3%214m1%211e4%213sother_user_reviews%216m1%211e1%219b1%2189b1%2198m3%211b1%212b1%213b1%21103b1%21113b1%21114m3%211b1%212m1%211b1%21117b1%21122m1%211b1%21125b0%21126b1%21127b1%2121m0%2122m2%211e81%218e4%2129m0%2130m6%213b1%216m1%212b1%217m1%212b1%219b1%2134m2%217b1%2110b1%2137i715%2138scilxagvlbgnoywlylwfjy2vzc2libgugcmvzdgf1cmfudhmgbmvhcibtzsjduj4vz2vvl3r5cguvzxn0ywjsaxnobwvudf9wb2kvagfzx3dozwvsy2hhaxjfywnjzxnzawjszv9lbnryyw5jzzabavoriil3agvlbgnoywlyigfjy2vzc2libgugcmvzdgf1cmfudhmgbmvhcibtzzibewzyzw5jaf9yzxn0yxvyyw504aea%2139sleft%2bbank%2140b0%2141b1%26q%3dleft%2bbank&ihs=9", "https%3a%2f%2fwww.google.com%2fmaps%2fpreview%2fplace%3fauthuser%3d0%26hl%3den%26gl%3dus%26pb%3d%211m24%211s0x808fbb39c04bc749%3a0xc5d634786e3aba09%213m12%211m3%211d11878.61345184126%212d-122.1621916%213d37.4458386%212m3%211f0%212f0%213f0%213m2%211i440%212i720%214f13.1%214m2%213d37.445838599999995%214d-122.1621916%2115m6%211m5%211s0x808fbb39c04bc749%3a0xc5d634786e3aba09%214s%2fg%2f11b6jh7xz6%215schijscdlwdm7j4arcbo6bng01su%216s15460965790847260555%217s108538787170261119825%216spalo%2balto%2brestaurants%2112m4%212m3%211i360%212i120%214i8%2113m48%212m2%211i203%212i100%213m2%212i4%215b1%216m6%211m2%211i86%212i86%211m2%211i408%212i240%217m33%211m3%211e1%212b0%213e3%211m3%211e2%212b1%213e2%211m3%211e2%212b0%213e3%211m3%211e8%212b0%213e3%211m3%211e10%212b0%213e3%211m3%211e10%212b1%213e2%211m3%211e10%212b0%213e4%211m3%211e9%212b1%213e2%212b1%219b0%2114m2%211s1zzuz4jzn8m80pepr9c4-qy%217e81%2115m107%211m34%214e2%2113m9%212b1%213b1%214b1%216i1%218b1%219b1%2114b1%2120b1%2125b1%2118m22%213b1%214b1%215b1%216b1%219b1%2112b1%2113b1%2114b1%2117b1%2120b1%2121b1%2122b1%2125b1%2127m1%211b0%2128b0%2130b1%2132b0%2133m1%211b1%2134b0%2136e1%2110m1%218e3%2111m1%213e1%2114m1%213b1%2117b1%2120m2%211e3%211e6%2124b1%2125b1%2126b1%2129b1%2130m1%212b1%2136b1%2139m3%212m2%212i1%213i1%2143b1%2152b1%2154m1%211b1%2155b1%2156m1%211b1%2165m5%213m4%211m3%211m2%211i224%212i298%2171b1%2172m19%211m5%211b1%212b1%213b1%215b1%217b1%214b1%218m10%211m6%214m1%211e1%214m1%211e3%214m1%211e4%213sother_user_reviews%216m1%211e1%219b1%2189b1%2198m3%211b1%212b1%213b1%21103b1%21113b1%21114m3%211b1%212m1%211b1%21117b1%21122m1%211b1%21125b0%21126b1%21127b1%2121m0%2122m2%211e81%218e4%2129m0%2130m6%213b1%216m1%212b1%217m1%212b1%219b1%2134m2%217b1%2110b1%2137i715%2138schvqywxviefsdg8gcmvzdgf1cmfudhnafyivcgfsbybhbhrvihjlc3rhdxjhbnrzkgekcmvzdgf1cmfudoabaa%2139slocal%2bunion%2b271%2141b1%26q%3dlocal%2bunion%2b271&ihs=7", "https%3a%2f%2fwww.google.com%2fsearch%3ftbm%3dmap%26authuser%3d0%26hl%3den%26gl%3dus%26pb%3d%214m12%211m3%211d11329.387714118226%212d-73.99018908577365%213d40.78027538426176%212m3%211f0%212f0%213f0%213m2%211i1280%212i720%214f13.1%217i20%2110b1%2112m22%211m3%2118b1%2130b1%2134e1%212m3%215m1%216e2%2120e3%2110b1%2112b1%2113b1%2116b1%2117m1%213e1%2120m3%215e2%216b1%2114b1%2146m1%211b0%2194b1%2196b1%2119m4%212m3%211i360%212i120%214i8%2120m48%212m2%211i203%212i100%213m2%212i4%215b1%216m6%211m2%211i86%212i86%211m2%211i408%212i240%217m33%211m3%211e1%212b0%213e3%211m3%211e2%212b1%213e2%211m3%211e2%212b0%213e3%211m3%211e8%212b0%213e3%211m3%211e10%212b0%213e3%211m3%211e10%212b1%213e2%211m3%211e10%212b0%213e4%211m3%211e9%212b1%213e2%212b1%219b0%2122m6%211semjvz77uou6z0pepqkdjsqs%3a244%212s1i%3a0%2ct%3a11887%2cp%3aemjvz77uou6z0pepqkdjsqs%3a244%217e81%2112e3%2117semjvz77uou6z0pepqkdjsqs%3a327%2118e15%2124m105%211m32%2113m9%212b1%213b1%214b1%216i1%218b1%219b1%2114b1%2120b1%2125b1%2118m21%213b1%214b1%215b1%216b1%219b1%2112b1%2113b1%2114b1%2117b1%2120b1%2121b1%2122b1%2125b1%2127m1%211b0%2128b0%2132b0%2133m1%211b1%2134b0%2136e1%2110m1%218e3%2111m1%213e1%2114m1%213b1%2117b1%2120m2%211e3%211e6%2124b1%2125b1%2126b1%2129b1%2130m1%212b1%2136b1%2139m3%212m2%212i1%213i1%2143b1%2152b1%2154m1%211b1%2155b1%2156m1%211b1%2165m5%213m4%211m3%211m2%211i224%212i298%2171b1%2172m19%211m5%211b1%212b1%213b1%215b1%217b1%214b1%218m10%211m6%214m1%211e1%214m1%211e3%214m1%211e4%213sother_user_reviews%216m1%211e1%219b1%2189b1%2198m3%211b1%212b1%213b1%21103b1%21113b1%21114m3%211b1%212m1%211b1%21117b1%21122m1%211b1%21125b0%21126b1%21127b1%2126m4%212m3%211i80%212i92%214i8%2127m5%212smanhattan%2c%2bnew%2byork%2c%2bny%213s0x89c2588f046ee661%3a0xa0b3281fcecc08c%214m2%213d40.7685167%214d-73.98219379999999%2130m28%211m6%211m2%211i0%212i0%212m2%211i530%212i720%211m6%211m2%211i1230%212i0%212m2%211i1280%212i720%211m6%211m2%211i0%212i0%212m2%211i1280%212i20%211m6%211m2%211i0%212i700%212m2%211i1280%212i720%2134m18%212b1%213b1%214b1%216b1%218m6%211b1%213b1%214b1%215b1%216b1%217b1%219b1%2112b1%2114b1%2120b1%2123b1%2125b1%2126b1%2137m1%211e81%2142b1%2147m0%2149m9%213b1%216m2%211b1%212b1%217m2%211e3%212b1%218b1%219b1%2150m4%212e2%213m2%211b1%213b1%2167m2%217b1%2110b1%2169i715%26q%3dwheelchair%2baccessible%2brestaurants%2bnear%2bnew%2byork%2bcity%26oq%3dwheelchair%2baccessible%2brestaurants%2bnear%2bnew%2byork%2bcity%26gs_l%3dmaps.12...0.0.6.8288.0.0.....0.0..0.....0......maps..0.0.0.0.%26ech%3d6%26psi%3demjvz77uou6z0pepqkdjsqs.1735377425420.1&ihs=13", "https%3a%2f%2fwww.google.com%2fsearch%3ftbm%3dmap%26authuser%3d0%26hl%3den%26gl%3dus%26pb%3d%214m12%211m3%211d23759.89356993355%212d-122.1820416%213d37.437439999999995%212m3%211f0%212f0%213f0%213m2%211i1280%212i720%214f13.1%217i20%2110b1%2112m22%211m3%2118b1%2130b1%2134e1%212m3%215m1%216e2%2120e3%2110b1%2112b1%2113b1%2116b1%2117m1%213e1%2120m3%215e2%216b1%2114b1%2146m1%211b0%2194b1%2196b1%2119m4%212m3%211i360%212i120%214i8%2120m48%212m2%211i203%212i100%213m2%212i4%215b1%216m6%211m2%211i86%212i86%211m2%211i408%212i240%217m33%211m3%211e1%212b0%213e3%211m3%211e2%212b1%213e2%211m3%211e2%212b0%213e3%211m3%211e8%212b0%213e3%211m3%211e10%212b0%213e3%211m3%211e10%212b1%213e2%211m3%211e10%212b0%213e4%211m3%211e9%212b1%213e2%212b1%219b0%2122m6%211snaduz_n7npfd0pep2cwb8aq%3a2%212s1i%3a0%2ct%3a11886%2cp%3anaduz_n7npfd0pep2cwb8aq%3a2%217e81%2112e5%2117snaduz_n7npfd0pep2cwb8aq%3a33%2118e15%2124m105%211m32%2113m9%212b1%213b1%214b1%216i1%218b1%219b1%2114b1%2120b1%2125b1%2118m21%213b1%214b1%215b1%216b1%219b1%2112b1%2113b1%2114b1%2117b1%2120b1%2121b1%2122b1%2125b1%2127m1%211b0%2128b0%2132b0%2133m1%211b1%2134b0%2136e1%2110m1%218e3%2111m1%213e1%2114m1%213b1%2117b1%2120m2%211e3%211e6%2124b1%2125b1%2126b1%2129b1%2130m1%212b1%2136b1%2139m3%212m2%212i1%213i1%2143b1%2152b1%2154m1%211b1%2155b1%2156m1%211b1%2165m5%213m4%211m3%211m2%211i224%212i298%2171b1%2172m19%211m5%211b1%212b1%213b1%215b1%217b1%214b1%218m10%211m6%214m1%211e1%214m1%211e3%214m1%211e4%213sother_user_reviews%216m1%211e1%219b1%2189b1%2198m3%211b1%212b1%213b1%21103b1%21113b1%21114m3%211b1%212m1%211b1%21117b1%21122m1%211b1%21125b0%21126b1%21127b1%2126m4%212m3%211i80%212i92%214i8%2130m28%211m6%211m2%211i0%212i0%212m2%211i530%212i720%211m6%211m2%211i1230%212i0%212m2%211i1280%212i720%211m6%211m2%211i0%212i0%212m2%211i1280%212i20%211m6%211m2%211i0%212i700%212m2%211i1280%212i720%2134m18%212b1%213b1%214b1%216b1%218m6%211b1%213b1%214b1%215b1%216b1%217b1%219b1%2112b1%2114b1%2120b1%2123b1%2125b1%2126b1%2137m1%211e81%2142b1%2147m0%2149m9%213b1%216m2%211b1%212b1%217m2%211e3%212b1%218b1%219b1%2150m4%212e2%213m2%211b1%213b1%2167m2%217b1%2110b1%2169i715%26q%3drestaurants%2bnear%2bstanford%26oq%3drestaurants%2bnear%2bstanford%26gs_l%3dmaps.3..38i72k1l2j38i377i430i444k1j38i72k1l2.4825.4825.1.5846.1.1.....61.61.1.1.....0....1..maps..0.1.67.0.%26ech%3d1%26psi%3dnaduz_n7npfd0pep2cwb8aq.1735264157340.1&ihs=7", "hub.docker.com", "hud.pytorch.org", "huggingface.co", "idmsa.apple.com", "ign", "ign.com", "ikea", "ikea.com", "imdb", "imdb.com", "imf.org", "indeed.com", "indiegogo.com", "info.arxiv.org", "info.dev.arxiv.org", "inspector.pypi.io", "inspirehep.net", "instacart", "instacart.com", "instructables.com", "ipcc.ch", "ironhorsehome.com", "itch.io", "ithaka.org", "ja.wikipedia.org", "jagranjosh.com", "japantimes.co.jp", "jd.com", "jetblue", "jetblue.com", "jianshu.com", "jmlr.org", "jobs.lever.co", "journals.plos.org", "jstor.org", "kaggle.com", "kayak", "kayak.com", "kbb", "kbb.com", "kernel.org", "khanacademy.org", "kickstarter.com", "kidshealth.org", "kimkim.com", "koa", "koa.com", "kohls", "kohls.com", "kubernetes.io", "last.fm", "last.fm.com", "launchpad.net", "layaface.com", "layarestaurant.com", "learn.microsoft.com", "lemonde.fr", "leviathansecurity.com", "lichess.org", "linkedin.com", "llama.com", "llm-grounded-diffusion.github.io", "lobste.rs", "loc.gov", "lonelyplanet.com", "lumenprize.com", "lwn.net", "magento.softwaretestingboard.com", "managore.itch.io", "marriott", "marriott.com", "math.stackexchange.com", "mathworld.wolfram.com", "mayoclinic.org", "mbta", "mbta.com", "medium.com", "medrxiv.org", "menards", "menards.com", "mercadolibre.com.ar", "merriam-webster.com", "metacpan.org", "metacritic.com", "metrics.lecoq.io", "micronews.debian.org", "midsomersetcameraclub.org.uk", "missionjuno.swri.edu", "mit.edu", "modelscope.cn", "mojeek.com", "monroeville.elcampesinopgh.com", "mtu.edu", "musicbrainz.org", "mvnrepository.com", "my.gov.au", "name.design", "nasa.gov", "nationwidechildrens.org", "nature.com", "ncbi.nlm.nih.gov", "ness.com", "new.mta.info", "new.mta.info.com", "newegg", "newegg.com", "news.bbc.co.uk", "news.google.com", "news.ycombinator.com", "nfl", "nfl.com", "nhl.com", "nih.gov", "ninehours.co.jp", "noaa.gov", "nodejs.org", "notion.com", "npmjs.com", "npr.org", "nps.gov", "nps.gov.com", "numpy.org", "nvd.nist.gov", "nyc", "nyc.com", "nytimes.com", "octoverse.github.com", "ocw.mit.edu", "oecd.org", "oeis.org", "openculture.com", "openlibrary.org", "openreview.net", "opensource-demo.orangehrmlive.com", "openstreetmap.org", "openweathermap.org", "orcid.org", "order.pacificcatch.com", "osf.io", "osmfoundation.org", "otter.ai", "otto.de", "ox.ac.uk", "packages.debian.org", "packagist.org", "pandas.pydata.org", "paperswithcode.com", "parabank.parasoft.com", "parking", "parking.com", "patanghotel.com", "patreon.com", "pbs.org", "pbskids.org", "peps.python.org", "pexels.com", "pharmacy.amazon.com", "phoronix.com", "php.net", "pixabay.com", "pkg.go.dev", "plato.stanford.edu", "platogbr.com", "play.google.com", "play.rust-lang.org", "pmc.ncbi.nlm.nih.gov", "postgresql.org", "practice.expandtesting.com", "practicesoftwaretesting.com", "practicetestautomation.com", "prevention.com", "producthunt.com", "profile.theguardian.com", "projects.apache.org", "proxy.golang.org", "pub.dev", "publicpolicy.google", "pubmed.ncbi.nlm.nih.gov", "pypi.org", "python.org", "pytorch.org", "qatarairways", "qatarairways.com", "quora.com", "quotes.toscrape.com", "qwant.com", "rakuten.co.jp", "react.dev", "readthedocs.org", "realpython.github.io", "realty101.com", "rec.stanford.edu", "redbox", "redbox.com", "reddit.com", "redditinc.com", "redis.io", "reference.wolfram.com", "rei", "rei.com", "remoteok.com", "rentalcars", "rentalcars.com", "repology.org", "research.google", "reservation.patanghotel.com", "reservations.limprimeriehotel.com", "resources.github.com", "resy", "resy.com", "reuters.com", "rottentomatoes", "rottentomatoes.com", "ruby-lang.org", "rubycentral.org", "rubygems.org", "rust-lang.org", "ryanair", "ryanair.com", "safety.google", "saucedemo.com", "sbert.net", "scholar.archive.org", "scholar.google.com", "science.nasa.gov", "scikit-learn.org", "scmp.com", "scrapeme.live", "scrapethissite.com", "search.brave.com", "search.epa.gov", "search.maven.org", "search.usa.gov", "searchengineland.com", "seatgeek", "seatgeek.com", "secure8.store.apple.com", "secure9.store.apple.com", "security.archlinux.org", "securitylab.github.com", "selenium.dev", "semanticscholar.org", "serverfault.com", "service-public.fr", "service-public.gouv.fr", "sfmta.com", "simple.wikipedia.org", "sixflags", "sixflags.com", "skyscanner.net", "slashdot.org", "snlab.bme.cornell.edu", "so.com", "so.gitee.com", "sogou.com", "soundcloud", "soundcloud.com", "sourceforge.net", "southampton.ac.uk", "space.com", "spiegel.de", "sports.yahoo", "sports.yahoo.com", "spothero", "spothero.com", "stablediffusionapi.com", "stackexchange.com", "stackoverflow.blog", "stackoverflow.co", "stackoverflow.com", "stanford.edu", "store.google.com", "store.steampowered", "store.steampowered.com", "supercook.com", "superuser.com", "support.apple.com", "support.google.com", "t-mobile.com", "t10.org", "tailwindcss.com", "taobao.com", "target", "target.com", "techaro.lol", "techcrunch.com", "ted.com", "tensorflow.org", "terraform.io", "tesla", "tesla.com", "the-internet.herokuapp.com", "thebluezonesstore.com", "theclimateweb.com", "thefreedictionary.com", "theguardian.com", "thehindu.com", "themelt.com", "thesaurus.com", "thetrainline", "thetrainline.com", "theverge.com", "theweekendwoodworker.com", "thingiverse.com", "ticket.toureiffel.paris", "ticketcenter", "ticketcenter.com", "timeanddate.com", "timesofindia.indiatimes.com", "toureiffel.paris", "translate.google.com", "travelzoo", "travelzoo.com", "trends.google.com", "trends.google.fr", "tripadvisor.com", "trust.weather.com", "trustpilot.com", "tsinghua.edu.cn", "tutorialspoint.com", "tvguide", "tvguide.com", "twitch.tv", "ubuntu.com", "ui.adsabs.harvard.edu", "ultimate-guitar", "ultimate-guitar.com", "un.org", "underarmour", "underarmour.com", "uniqlo", "uniqlo.com", "united", "united.com", "unix.stackexchange.com", "unsplash.com", "us.megabus", "us.megabus.com", "usa.gov", "utoronto.ca", "viator", "viator.com", "vogue.com", "vuejs.org", "w3schools.com", "walmart.com", "washingtonpost.com", "wayfair.com", "weather.com", "web.dev", "webscraper.io", "wedgewoodweddings.com", "weworkremotely.com", "who.int", "wiki.archlinux.org", "wiki.debian.org", "wiki.osgeo.org", "wiki.python.org", "wikidata.org", "wikihow.com", "wikimedia.org", "wikipedia.org", "wiktionary.org", "wired.com", "wolfram.com", "wolframalpha.com", "worldbank.org", "worldcat.org", "wri.org", "xe.com", "yandex.com", "yellowpages", "yellowpages.com", "yelp", "yelp.com", "youtube.com", "zalando.de", "zdnet.com", "zenodo.org", "zh.airbnb.com", "zh.thefreedictionary.com", "zh.wikipedia.org", "zh.wiktionary.org", "zhihu.com", "zillow.com"]
results/round3/v12s.log ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ == rollout2 cases: 818 nnetnav cases: 8917
2
+ == build v12s
3
+ operation label counts: {'TYPE_TEXT': 10107, 'CLICK': 15208, 'SELECT': 1380, 'DONE': 10364, 'SCROLL_DOWN': 3338, 'PRESS_ENTER': 1620, 'SCROLL_UP': 137}
4
+ train items 61191 (op 42154, target 19037), eval cases 5314, skipped 0, seq len mean 786 max 1024
5
+ == train v12s (3 epochs)
6
+ ep 1 step 20/5736 loss 1.867 ce 1.661 reward -1.357 26s
7
+ ep 1 step 40/5736 loss 0.806 ce 1.988 reward -1.635 48s
8
+ ep 1 step 60/5736 loss 2.244 ce 2.367 reward -2.104 73s
9
+ ep 1 step 80/5736 loss 1.748 ce 1.633 reward -1.354 100s
10
+ ep 1 step 100/5736 loss 0.450 ce 0.805 reward -0.451 123s
11
+ ep 1 step 120/5736 loss 1.838 ce 1.455 reward -1.094 150s
12
+ ep 1 step 140/5736 loss 1.511 ce 0.991 reward -0.550 176s
13
+ ep 1 step 160/5736 loss 0.068 ce 0.081 reward 0.647 202s
14
+ ep 1 step 180/5736 loss 1.662 ce 1.634 reward -1.109 229s
15
+ ep 1 step 200/5736 loss 0.155 ce 0.486 reward 0.035 262s
16
+ ep 1 step 220/5736 loss 0.922 ce 0.934 reward -0.485 292s
17
+ ep 1 step 240/5736 loss -0.582 ce 1.647 reward -1.240 315s
18
+ ep 1 step 260/5736 loss 0.030 ce 0.086 reward 0.649 338s
19
+ ep 1 step 280/5736 loss 1.079 ce 0.886 reward -0.323 362s
20
+ ep 1 step 300/5736 loss 1.009 ce 1.515 reward -1.017 385s
21
+ ep 1 step 320/5736 loss 0.501 ce 1.460 reward -0.954 407s
22
+ ep 1 step 340/5736 loss 0.948 ce 1.097 reward -0.542 437s
23
+ ep 1 step 360/5736 loss 2.070 ce 0.914 reward -0.374 462s
24
+ ep 1 step 380/5736 loss 1.567 ce 1.001 reward -0.514 491s
25
+ ep 1 step 400/5736 loss 0.226 ce 0.115 reward 0.625 517s
26
+ ep 1 step 420/5736 loss 1.699 ce 1.414 reward -1.130 541s
27
+ ep 1 step 440/5736 loss 0.594 ce 0.051 reward 0.688 566s
28
+ ep 1 step 460/5736 loss -0.469 ce 0.178 reward 0.498 591s
29
+ ep 1 step 480/5736 loss 1.374 ce 0.395 reward 0.257 614s
30
+ ep 1 step 500/5736 loss 2.047 ce 0.957 reward -0.341 636s
31
+ ep 1 step 520/5736 loss 1.322 ce 1.881 reward -1.510 658s
32
+ ep 1 step 540/5736 loss 1.677 ce 1.290 reward -0.781 681s
33
+ ep 1 step 560/5736 loss 0.978 ce 0.955 reward -0.334 703s
34
+ ep 1 step 580/5736 loss 0.759 ce 1.147 reward -0.779 726s
35
+ ep 1 step 600/5736 loss 0.153 ce 0.252 reward 0.430 751s
36
+ ep 1 step 620/5736 loss 1.371 ce 0.907 reward -0.309 775s
37
+ ep 1 step 640/5736 loss 1.415 ce 1.854 reward -1.247 800s
38
+ ep 1 step 660/5736 loss 1.116 ce 0.642 reward -0.033 825s
39
+ ep 1 step 680/5736 loss 2.978 ce 1.458 reward -0.996 850s
40
+ ep 1 step 700/5736 loss 1.113 ce 1.102 reward -0.652 874s
41
+ ep 1 step 720/5736 loss 2.186 ce 1.739 reward -1.365 896s
42
+ ep 1 step 740/5736 loss 0.807 ce 0.314 reward 0.352 918s
43
+ ep 1 step 760/5736 loss -0.023 ce 0.189 reward 0.520 941s
44
+ ep 1 step 780/5736 loss 0.104 ce 0.405 reward 0.284 963s
45
+ ep 1 step 800/5736 loss 0.616 ce 0.335 reward 0.351 985s
46
+ ep 1 step 820/5736 loss -1.048 ce 1.086 reward -0.633 1008s
47
+ ep 1 step 840/5736 loss 1.684 ce 0.770 reward -0.112 1031s
48
+ ep 1 step 860/5736 loss 1.732 ce 1.397 reward -1.155 1055s
49
+ ep 1 step 880/5736 loss 3.040 ce 3.139 reward -2.820 1080s
50
+ ep 1 step 900/5736 loss 2.128 ce 2.322 reward -2.160 1105s
51
+ ep 1 step 920/5736 loss -0.518 ce 0.000 reward 0.750 1129s
52
+ ep 1 step 940/5736 loss 1.805 ce 2.345 reward -2.121 1154s
53
+ ep 1 step 960/5736 loss -0.430 ce 0.000 reward 0.750 1177s
54
+ ep 1 step 980/5736 loss 2.253 ce 1.044 reward -0.507 1199s
55
+ ep 1 step 1000/5736 loss 0.894 ce 0.654 reward -0.094 1222s
56
+ ep 1 step 1020/5736 loss 1.455 ce 1.017 reward -0.609 1244s
57
+ ep 1 step 1040/5736 loss 0.287 ce 0.555 reward 0.075 1266s
58
+ ep 1 step 1060/5736 loss -0.340 ce 0.005 reward 0.740 1288s
59
+ ep 1 step 1080/5736 loss 0.915 ce 0.219 reward 0.550 1310s
60
+ ep 1 step 1100/5736 loss 0.092 ce 0.278 reward 0.335 1334s
61
+ ep 1 step 1120/5736 loss 2.255 ce 1.808 reward -1.507 1359s
62
+ ep 1 step 1140/5736 loss 1.179 ce 0.495 reward 0.200 1384s
63
+ ep 1 step 1160/5736 loss 0.012 ce 0.004 reward 0.747 1408s
64
+ ep 1 step 1180/5736 loss 0.123 ce 0.754 reward -0.255 1433s
65
+ ep 1 step 1200/5736 loss 0.198 ce 0.326 reward 0.309 1458s
66
+ ep 1 step 1220/5736 loss 0.509 ce 0.000 reward 0.750 1482s
67
+ ep 1 step 1240/5736 loss 0.322 ce 0.074 reward 0.670 1504s
68
+ ep 1 step 1260/5736 loss 1.003 ce 1.388 reward -0.980 1526s
69
+ ep 1 step 1280/5736 loss 0.873 ce 4.870 reward -1.776 1548s
70
+ ep 1 step 1300/5736 loss 0.422 ce 0.007 reward 0.743 1570s
71
+ ep 1 step 1320/5736 loss 0.311 ce 0.001 reward 0.748 1593s
72
+ ep 1 step 1340/5736 loss 5.178 ce 4.459 reward -3.079 1615s
73
+ ep 1 step 1360/5736 loss -0.279 ce 0.000 reward 0.750 1639s
74
+ ep 1 step 1380/5736 loss -0.840 ce 1.816 reward -1.648 1665s
75
+ ep 1 step 1400/5736 loss 2.030 ce 1.714 reward -1.225 1689s
76
+ ep 1 step 1420/5736 loss 1.433 ce 1.163 reward -0.708 1714s
77
+ ep 1 step 1440/5736 loss 0.244 ce 0.753 reward -0.194 1738s
78
+ ep 1 step 1460/5736 loss 2.513 ce 0.902 reward -0.237 1763s
79
+ ep 1 step 1480/5736 loss 1.593 ce 1.058 reward -0.578 1786s
80
+ ep 1 step 1500/5736 loss 0.870 ce 0.267 reward 0.457 1808s
81
+ ep 1 step 1520/5736 loss -0.183 ce 0.027 reward 0.714 1831s
82
+ ep 1 step 1540/5736 loss 1.141 ce 0.604 reward -0.165 1853s
83
+ ep 1 step 1560/5736 loss 1.778 ce 2.143 reward -1.779 1875s
84
+ ep 1 step 1580/5736 loss -1.432 ce 0.043 reward 0.695 1897s
85
+ ep 1 step 1600/5736 loss 1.285 ce 0.893 reward -0.555 1919s
86
+ ep 1 step 1620/5736 loss -0.448 ce 0.026 reward 0.725 1944s
87
+ ep 1 step 1640/5736 loss 1.916 ce 0.766 reward -0.141 1968s
88
+ ep 1 step 1660/5736 loss 0.366 ce 0.288 reward 0.416 1993s
89
+ ep 1 step 1680/5736 loss 0.359 ce 0.506 reward -0.044 2018s
90
+ ep 1 step 1700/5736 loss 1.577 ce 1.610 reward -1.254 2043s
91
+ ep 1 step 1720/5736 loss 0.310 ce 0.000 reward 0.750 2067s
92
+ ep 1 step 1740/5736 loss -0.173 ce 0.082 reward 0.674 2090s
93
+ ep 1 step 1760/5736 loss 2.839 ce 2.416 reward -1.750 2112s
94
+ ep 1 step 1780/5736 loss 0.334 ce 0.251 reward 0.427 2135s
95
+ ep 1 step 1800/5736 loss 6.210 ce 6.935 reward -4.351 2157s
96
+ ep 1 step 1820/5736 loss 1.940 ce 1.649 reward -1.230 2179s
97
+ ep 1 step 1840/5736 loss -0.000 ce -0.000 reward 0.750 2201s
98
+ ep 1 step 1860/5736 loss 0.137 ce 0.154 reward 0.588 2223s
99
+ ep 1 step 1880/5736 loss 3.022 ce 3.763 reward -3.697 2249s
100
+ ep 1 step 1900/5736 loss -0.994 ce 0.000 reward 0.750 2273s
101
+ === epoch 1/3 avg loss 0.9655 2288s
102
+ ep 2 step 1920/5736 loss -0.334 ce 0.004 reward 0.745 2297s
103
+ ep 2 step 1940/5736 loss 2.466 ce 2.807 reward -2.458 2322s
104
+ ep 2 step 1960/5736 loss -0.088 ce 0.014 reward 0.733 2347s
105
+ ep 2 step 1980/5736 loss 0.001 ce 0.000 reward 0.750 2371s
106
+ ep 2 step 2000/5736 loss -1.152 ce 0.257 reward 0.430 2393s
107
+ ep 2 step 2020/5736 loss 1.120 ce 1.008 reward -0.512 2416s
108
+ ep 2 step 2040/5736 loss 0.434 ce 0.852 reward -0.291 2438s
109
+ ep 2 step 2060/5736 loss 0.258 ce 0.137 reward 0.572 2460s
110
+ ep 2 step 2080/5736 loss -0.961 ce 1.669 reward -1.219 2482s
111
+ ep 2 step 2100/5736 loss 0.203 ce 0.268 reward 0.453 2505s
112
+ ep 2 step 2120/5736 loss -2.449 ce 0.003 reward 0.747 2528s
113
+ ep 2 step 2140/5736 loss -1.220 ce 0.003 reward 0.748 2552s
114
+ ep 2 step 2160/5736 loss 1.053 ce 0.486 reward 0.137 2577s
115
+ ep 2 step 2180/5736 loss -0.319 ce 0.342 reward 0.400 2602s
116
+ ep 2 step 2200/5736 loss -0.000 ce -0.000 reward 0.750 2627s
117
+ ep 2 step 2220/5736 loss -0.226 ce 0.424 reward 0.254 2651s
118
+ ep 2 step 2240/5736 loss 4.043 ce 4.104 reward -1.740 2675s
119
+ ep 2 step 2260/5736 loss 1.498 ce 1.368 reward -0.860 2698s
120
+ ep 2 step 2280/5736 loss -0.211 ce 0.000 reward 0.750 2720s
121
+ ep 2 step 2300/5736 loss -0.000 ce -0.000 reward 0.750 2742s
122
+ ep 2 step 2320/5736 loss 0.910 ce 1.463 reward -0.898 2764s
123
+ ep 2 step 2340/5736 loss 2.722 ce 2.704 reward -2.044 2786s
124
+ ep 2 step 2360/5736 loss 4.900 ce 4.703 reward -1.953 2808s
125
+ ep 2 step 2380/5736 loss -0.120 ce 0.008 reward 0.741 2832s
126
+ ep 2 step 2400/5736 loss 4.746 ce 4.734 reward -1.740 2857s
127
+ ep 2 step 2420/5736 loss 0.733 ce 0.408 reward 0.220 2881s
128
+ ep 2 step 2440/5736 loss 2.885 ce 3.230 reward -2.934 2906s
129
+ ep 2 step 2460/5736 loss -0.172 ce 0.000 reward 0.750 2930s
130
+ ep 2 step 2480/5736 loss -0.000 ce -0.000 reward 0.750 2955s
131
+ ep 2 step 2500/5736 loss -1.332 ce 0.024 reward 0.727 2979s
132
+ ep 2 step 2520/5736 loss 0.470 ce 1.203 reward -0.676 3002s
133
+ ep 2 step 2540/5736 loss -0.000 ce -0.000 reward 0.750 3024s
134
+ ep 2 step 2560/5736 loss 5.343 ce 5.343 reward -1.740 3046s
135
+ ep 2 step 2580/5736 loss 2.787 ce 1.669 reward -1.162 3068s
136
+ ep 2 step 2600/5736 loss -2.983 ce 0.709 reward -0.160 3091s
137
+ ep 2 step 2620/5736 loss 0.900 ce 0.000 reward 0.750 3113s
138
+ ep 2 step 2640/5736 loss 0.301 ce 0.370 reward 0.234 3136s
139
+ ep 2 step 2660/5736 loss 0.777 ce 1.571 reward -1.142 3162s
140
+ ep 2 step 2680/5736 loss 0.597 ce 0.584 reward -0.027 3187s
141
+ ep 2 step 2700/5736 loss 0.287 ce 0.329 reward 0.222 3212s
142
+ ep 2 step 2720/5736 loss 1.478 ce 0.387 reward 0.282 3237s
143
+ ep 2 step 2740/5736 loss 0.738 ce 0.507 reward 0.012 3261s
144
+ ep 2 step 2760/5736 loss 3.690 ce 4.616 reward -2.242 3284s
145
+ ep 2 step 2780/5736 loss -0.260 ce 0.193 reward 0.537 3306s
146
+ ep 2 step 2800/5736 loss 4.752 ce 4.766 reward -1.740 3329s
147
+ ep 2 step 2820/5736 loss 0.753 ce 0.179 reward 0.517 3351s
148
+ ep 2 step 2840/5736 loss 0.397 ce 0.280 reward 0.355 3373s
149
+ ep 2 step 2860/5736 loss 4.371 ce 4.577 reward -4.193 3396s
150
+ ep 2 step 2880/5736 loss 3.433 ce 3.418 reward -1.740 3418s
151
+ ep 2 step 2900/5736 loss -0.165 ce 0.302 reward 0.355 3442s
152
+ ep 2 step 2920/5736 loss -1.110 ce 0.000 reward 0.750 3467s
153
+ ep 2 step 2940/5736 loss 0.899 ce 2.142 reward -1.766 3491s
154
+ ep 2 step 2960/5736 loss -0.160 ce 0.002 reward 0.748 3516s
155
+ ep 2 step 2980/5736 loss 0.397 ce 0.076 reward 0.679 3540s
156
+ ep 2 step 3000/5736 loss 8.716 ce 9.129 reward -6.550 3565s
157
+ ep 2 step 3020/5736 loss 0.517 ce 0.504 reward 0.093 3587s
158
+ ep 2 step 3040/5736 loss 0.571 ce 1.267 reward -0.669 3609s
159
+ ep 2 step 3060/5736 loss 10.010 ce 9.623 reward -6.253 3631s
160
+ ep 2 step 3080/5736 loss 0.209 ce 0.092 reward 0.650 3652s
161
+ ep 2 step 3100/5736 loss 1.857 ce 1.848 reward -1.399 3674s
162
+ ep 2 step 3120/5736 loss 2.592 ce 1.673 reward -1.339 3695s
163
+ ep 2 step 3140/5736 loss 0.931 ce 1.065 reward -0.577 3717s
164
+ ep 2 step 3160/5736 loss -0.050 ce 0.524 reward 0.185 3741s
165
+ ep 2 step 3180/5736 loss 1.458 ce 0.869 reward -0.260 3766s
166
+ ep 2 step 3200/5736 loss -0.652 ce 0.678 reward -0.112 3790s
167
+ ep 2 step 3220/5736 loss 1.152 ce 0.740 reward -0.147 3813s
168
+ ep 2 step 3240/5736 loss -0.866 ce 1.132 reward -0.573 3837s
169
+ ep 2 step 3260/5736 loss 0.069 ce 0.347 reward 0.276 3861s
170
+ ep 2 step 3280/5736 loss 3.832 ce 3.105 reward -2.694 3884s
171
+ ep 2 step 3300/5736 loss -1.609 ce 0.866 reward -0.277 3906s
172
+ ep 2 step 3320/5736 loss -1.190 ce 0.540 reward 0.017 3927s
173
+ ep 2 step 3340/5736 loss 0.095 ce 0.000 reward 0.750 3949s
174
+ ep 2 step 3360/5736 loss 0.018 ce 0.000 reward 0.750 3971s
175
+ ep 2 step 3380/5736 loss -0.164 ce 0.000 reward 0.750 3992s
176
+ ep 2 step 3400/5736 loss 3.871 ce 3.871 reward -1.740 4014s
177
+ ep 2 step 3420/5736 loss 1.919 ce 1.431 reward -0.920 4037s
178
+ ep 2 step 3440/5736 loss -0.110 ce 0.000 reward 0.750 4061s
179
+ ep 2 step 3460/5736 loss 2.759 ce 3.016 reward -1.740 4085s
180
+ ep 2 step 3480/5736 loss 1.899 ce 0.326 reward 0.379 4109s
181
+ ep 2 step 3500/5736 loss 0.121 ce 0.015 reward 0.736 4133s
182
+ ep 2 step 3520/5736 loss 1.250 ce 1.704 reward -1.355 4157s
183
+ ep 2 step 3540/5736 loss -0.545 ce 0.141 reward 0.629 4180s
184
+ ep 2 step 3560/5736 loss 1.155 ce 0.648 reward -0.077 4202s
185
+ ep 2 step 3580/5736 loss 0.130 ce 0.000 reward 0.750 4223s
186
+ ep 2 step 3600/5736 loss 13.606 ce 13.596 reward -6.720 4245s
187
+ ep 2 step 3620/5736 loss 2.642 ce 1.323 reward -0.879 4266s
188
+ ep 2 step 3640/5736 loss 2.688 ce 2.795 reward -1.740 4288s
189
+ ep 2 step 3660/5736 loss 0.000 ce 0.000 reward 0.750 4309s
190
+ ep 2 step 3680/5736 loss 0.543 ce 0.526 reward 0.137 4332s
191
+ ep 2 step 3700/5736 loss 0.859 ce 0.061 reward 0.697 4356s
192
+ ep 2 step 3720/5736 loss 0.372 ce 0.000 reward 0.750 4380s
193
+ ep 2 step 3740/5736 loss 0.582 ce 0.795 reward -0.266 4403s
194
+ ep 2 step 3760/5736 loss -0.116 ce 0.000 reward 0.750 4427s
195
+ ep 2 step 3780/5736 loss 3.356 ce 3.557 reward -1.740 4451s
196
+ ep 2 step 3800/5736 loss 2.293 ce 1.484 reward -0.860 4475s
197
+ ep 2 step 3820/5736 loss -0.101 ce 0.000 reward 0.750 4496s
198
+ === epoch 2/3 avg loss 1.1094 4502s
199
+ ep 3 step 3840/5736 loss -0.065 ce 0.102 reward 0.632 4517s
200
+ ep 3 step 3860/5736 loss -0.032 ce 0.000 reward 0.750 4539s
201
+ ep 3 step 3880/5736 loss 5.263 ce 4.626 reward -1.795 4560s
202
+ ep 3 step 3900/5736 loss -0.141 ce 0.752 reward -0.168 4582s
203
+ ep 3 step 3920/5736 loss -0.000 ce -0.000 reward 0.750 4604s
204
+ ep 3 step 3940/5736 loss 4.600 ce 4.187 reward -2.491 4625s
205
+ ep 3 step 3960/5736 loss 9.254 ce 9.254 reward -4.230 4649s
206
+ ep 3 step 3980/5736 loss 0.000 ce 0.000 reward 0.750 4673s
207
+ ep 3 step 4000/5736 loss 1.703 ce 2.893 reward -2.497 4697s
208
+ ep 3 step 4020/5736 loss -0.000 ce -0.000 reward 0.750 4721s
209
+ ep 3 step 4040/5736 loss 3.809 ce 3.816 reward -1.740 4745s
210
+ ep 3 step 4060/5736 loss -0.239 ce 0.000 reward 0.750 4769s
211
+ ep 3 step 4080/5736 loss 2.466 ce 1.558 reward -1.119 4792s
212
+ ep 3 step 4100/5736 loss 2.049 ce 1.311 reward -0.801 4813s
213
+ ep 3 step 4120/5736 loss 0.000 ce 0.000 reward 0.750 4835s
214
+ ep 3 step 4140/5736 loss 0.000 ce 0.000 reward 0.750 4857s
215
+ ep 3 step 4160/5736 loss -0.029 ce 0.000 reward 0.750 4878s
216
+ ep 3 step 4180/5736 loss 3.194 ce 2.636 reward -2.267 4900s
217
+ ep 3 step 4200/5736 loss -0.904 ce 0.138 reward 0.607 4922s
218
+ ep 3 step 4220/5736 loss 10.090 ce 9.401 reward -4.727 4946s
219
+ ep 3 step 4240/5736 loss 4.646 ce 4.656 reward -1.740 4970s
220
+ ep 3 step 4260/5736 loss 0.157 ce 0.000 reward 0.750 4994s
221
+ ep 3 step 4280/5736 loss 0.922 ce 0.055 reward 0.696 5018s
222
+ ep 3 step 4300/5736 loss -0.000 ce -0.000 reward 0.750 5042s
223
+ ep 3 step 4320/5736 loss 0.922 ce 0.000 reward 0.750 5066s
224
+ ep 3 step 4340/5736 loss 0.076 ce 0.000 reward 0.750 5088s
225
+ ep 3 step 4360/5736 loss -0.000 ce -0.000 reward 0.750 5110s
226
+ ep 3 step 4380/5736 loss 1.704 ce 1.207 reward -0.685 5131s
227
+ ep 3 step 4400/5736 loss 4.283 ce 4.309 reward -1.740 5153s
228
+ ep 3 step 4420/5736 loss -0.121 ce 2.678 reward -2.319 5175s
229
+ ep 3 step 4440/5736 loss 1.292 ce 0.812 reward -0.235 5197s
230
+ ep 3 step 4460/5736 loss 0.000 ce 0.000 reward 0.750 5218s
231
+ ep 3 step 4480/5736 loss -0.058 ce 0.170 reward 0.512 5242s
232
+ ep 3 step 4500/5736 loss -0.010 ce 0.000 reward 0.750 5265s
233
+ ep 3 step 4520/5736 loss 0.579 ce 0.225 reward 0.471 5289s
234
+ ep 3 step 4540/5736 loss 0.051 ce 0.135 reward 0.576 5313s
235
+ ep 3 step 4560/5736 loss -0.379 ce 1.452 reward -0.917 5337s
236
+ ep 3 step 4580/5736 loss -0.011 ce 0.000 reward 0.750 5361s
237
+ ep 3 step 4600/5736 loss 1.084 ce 0.575 reward 0.081 5384s
238
+ ep 3 step 4620/5736 loss 2.207 ce 1.260 reward -0.702 5406s
239
+ ep 3 step 4640/5736 loss 0.395 ce 0.169 reward 0.529 5427s
240
+ ep 3 step 4660/5736 loss -0.267 ce 0.305 reward 0.364 5449s
241
+ ep 3 step 4680/5736 loss -0.000 ce -0.000 reward 0.750 5471s
242
+ ep 3 step 4700/5736 loss -0.872 ce 0.273 reward 0.471 5492s
243
+ ep 3 step 4720/5736 loss 0.732 ce 1.012 reward -0.467 5514s
244
+ ep 3 step 4740/5736 loss -0.000 ce -0.000 reward 0.750 5537s
245
+ ep 3 step 4760/5736 loss 0.043 ce 0.000 reward 0.750 5561s
246
+ ep 3 step 4780/5736 loss -0.008 ce 0.000 reward 0.750 5584s
247
+ ep 3 step 4800/5736 loss -0.015 ce 0.000 reward 0.750 5609s
248
+ ep 3 step 4820/5736 loss 7.047 ce 6.954 reward -4.230 5632s
249
+ ep 3 step 4840/5736 loss 0.021 ce 0.024 reward 0.723 5657s
250
+ ep 3 step 4860/5736 loss 2.918 ce 2.794 reward -2.469 5680s
251
+ ep 3 step 4880/5736 loss -0.000 ce -0.000 reward 0.750 5702s
252
+ ep 3 step 4900/5736 loss -0.010 ce 0.000 reward 0.750 5724s
253
+ ep 3 step 4920/5736 loss 0.033 ce 0.000 reward 0.750 5745s
254
+ ep 3 step 4940/5736 loss 4.543 ce 3.750 reward -1.740 5767s
255
+ ep 3 step 4960/5736 loss -0.032 ce 0.000 reward 0.750 5789s
256
+ ep 3 step 4980/5736 loss 1.302 ce 1.697 reward -1.307 5810s
257
+ ep 3 step 5000/5736 loss -0.000 ce -0.000 reward 0.750 5833s
258
+ ep 3 step 5020/5736 loss 7.283 ce 6.728 reward -4.230 5857s
259
+ ep 3 step 5040/5736 loss 0.000 ce 0.000 reward 0.750 5881s
260
+ ep 3 step 5060/5736 loss 2.784 ce 3.168 reward -1.740 5905s
261
+ ep 3 step 5080/5736 loss 0.077 ce 0.000 reward 0.750 5929s
262
+ ep 3 step 5100/5736 loss 4.980 ce 6.121 reward -3.107 5953s
263
+ ep 3 step 5120/5736 loss -0.000 ce -0.000 reward 0.750 5977s
264
+ ep 3 step 5140/5736 loss 2.089 ce 1.122 reward -0.550 5999s
265
+ ep 3 step 5160/5736 loss 1.105 ce 1.833 reward -1.380 6020s
266
+ ep 3 step 5180/5736 loss 0.000 ce 0.000 reward 0.750 6042s
267
+ ep 3 step 5200/5736 loss -0.055 ce -0.000 reward 0.750 6063s
268
+ ep 3 step 5220/5736 loss -0.000 ce -0.000 reward 0.750 6085s
269
+ ep 3 step 5240/5736 loss -0.090 ce 0.000 reward 0.750 6106s
270
+ ep 3 step 5260/5736 loss -0.000 ce -0.000 reward 0.750 6128s
271
+ ep 3 step 5280/5736 loss 3.014 ce 1.651 reward -1.102 6152s
272
+ ep 3 step 5300/5736 loss 0.000 ce 0.000 reward 0.750 6176s
273
+ ep 3 step 5320/5736 loss -0.332 ce 0.000 reward 0.750 6200s
274
+ ep 3 step 5340/5736 loss 4.471 ce 4.873 reward -1.857 6224s
275
+ ep 3 step 5360/5736 loss 0.047 ce 0.059 reward 0.691 6248s
276
+ ep 3 step 5380/5736 loss 4.046 ce 4.062 reward -1.740 6272s
277
+ ep 3 step 5400/5736 loss -0.000 ce -0.000 reward 0.750 6294s
278
+ ep 3 step 5420/5736 loss 0.000 ce 0.000 reward 0.750 6315s
279
+ ep 3 step 5440/5736 loss -0.000 ce -0.000 reward 0.750 6337s
280
+ ep 3 step 5460/5736 loss 9.175 ce 8.045 reward -4.230 6359s
281
+ ep 3 step 5480/5736 loss 3.850 ce 3.783 reward -1.740 6381s
282
+ ep 3 step 5500/5736 loss 0.803 ce 0.670 reward -0.024 6402s
283
+ ep 3 step 5520/5736 loss 0.000 ce 0.000 reward 0.750 6424s
284
+ ep 3 step 5540/5736 loss 0.488 ce 0.544 reward 0.064 6448s
285
+ ep 3 step 5560/5736 loss -1.941 ce 0.158 reward 0.581 6472s
286
+ ep 3 step 5580/5736 loss 0.006 ce 0.000 reward 0.750 6496s
287
+ ep 3 step 5600/5736 loss 3.625 ce 3.855 reward -2.341 6521s
288
+ ep 3 step 5620/5736 loss 5.359 ce 5.359 reward -1.740 6545s
289
+ ep 3 step 5640/5736 loss 0.021 ce 0.000 reward 0.750 6569s
290
+ ep 3 step 5660/5736 loss 3.300 ce 3.121 reward -1.740 6592s
291
+ ep 3 step 5680/5736 loss 2.049 ce 1.110 reward -0.529 6613s
292
+ ep 3 step 5700/5736 loss 0.056 ce 0.000 reward 0.750 6635s
293
+ ep 3 step 5720/5736 loss -0.148 ce 0.000 reward 0.750 6657s
294
+ === epoch 3/3 avg loss 1.0639 6676s
295
+ saved finetune/out/laya-browser-v12s
296
+ == calibrate
297
+ n=4957 acc=0.634 T=1: nll 3.288 mean conf 0.850 | T=5.23: nll 1.397 mean conf 0.640
298
+ wrote temperature 5.227105378439709 -> /home/ckl/projects/S/laya/finetune/out/laya-browser-v12s/rl_agent_config.json
299
+ == eval v12s
300
+ return Agent(model_id_or_path, device=device, token=token, subfolder=subfolder, fast=fast, compile=compile,
301
+ /home/ckl/projects/S/laya/finetune/out/laya-browser-v12s/: cases 5314 operation acc 0.727 target top-1 0.572 (n=4602, mean normalized rank 0.300) 19 ms/case
302
+ live CLICK n=1050 op acc 0.96 target top-1 0.84
303
+ live DONE n= 125 op acc 0.90
304
+ live SELECT n= 32 op acc 0.91 target top-1 0.84
305
+ live TYPE_TEXT n= 117 op acc 0.79 target top-1 0.92
306
+ mind2web CLICK n=1084 op acc 0.90 target top-1 0.49
307
+ mind2web SELECT n= 126 op acc 0.57 target top-1 0.35
308
+ mind2web TYPE_TEXT n= 200 op acc 0.73 target top-1 0.83
309
+ nnetnav CLICK n=1386 op acc 0.69 target top-1 0.25
310
+ nnetnav DONE n= 313 op acc 0.36
311
+ nnetnav SCROLL_DOWN n= 224 op acc 0.06 target top-1 0.00
312
+ nnetnav SCROLL_UP n= 50 op acc 0.00 target top-1 0.00
313
+ nnetnav TYPE_TEXT n= 607 op acc 0.57 target top-1 0.88
314
+ V12S_DONE
results/round3/v13s.log ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ == rollout2 cases: 2057
2
+ == build v13s
3
+ operation label counts: {'TYPE_TEXT': 11052, 'CLICK': 16000, 'SELECT': 3090, 'DONE': 14636, 'SCROLL_DOWN': 4844, 'PRESS_ENTER': 2496, 'SCROLL_UP': 137}
4
+ train items 72969 (op 52255, target 20714), eval cases 5314, skipped 0, seq len mean 764 max 1024
5
+ == train v13s (1 epochs from v12s)
6
+ === epoch 1/1 avg loss 1.0192 2620s
7
+ saved finetune/out/laya-browser-v13s
8
+ == calibrate
9
+ n=4957 acc=0.624 T=1: nll 3.180 mean conf 0.853 | T=4.93: nll 1.415 mean conf 0.633
10
+ wrote temperature 4.9277497256270095 -> /home/ckl/projects/S/laya/finetune/out/laya-browser-v13s/rl_agent_config.json
11
+ == eval
12
+ /home/ckl/projects/S/laya/finetune/out/laya-browser-v13s/: cases 5314 operation acc 0.712 target top-1 0.572 (n=4602, mean normalized rank 0.299) 20 ms/case
13
+ live CLICK n=1050 op acc 0.95 target top-1 0.83
14
+ live DONE n= 125 op acc 0.90
15
+ live SELECT n= 32 op acc 0.94 target top-1 0.81
16
+ live TYPE_TEXT n= 117 op acc 0.85 target top-1 0.97
17
+ mind2web CLICK n=1084 op acc 0.87 target top-1 0.49
18
+ mind2web SELECT n= 126 op acc 0.58 target top-1 0.33
19
+ mind2web TYPE_TEXT n= 200 op acc 0.76 target top-1 0.84
20
+ nnetnav CLICK n=1386 op acc 0.67 target top-1 0.25
21
+ nnetnav DONE n= 313 op acc 0.35
22
+ nnetnav SCROLL_DOWN n= 224 op acc 0.13 target top-1 0.00
23
+ nnetnav SCROLL_UP n= 50 op acc 0.00 target top-1 0.00
24
+ nnetnav TYPE_TEXT n= 607 op acc 0.50 target top-1 0.88
25
+ == suite A x3 (v13s, chunk 40)
26
+ FAIL wiki-einstein steps= 3 status=done 5.9s https://en.wikipedia.org/wiki/Main_Page
27
+ FAIL wiki-einstein steps= 3 status=done 3.8s https://en.wikipedia.org/wiki/Main_Page
28
+ FAIL wiki-einstein steps= 3 status=blocked 3.5s https://en.wikipedia.org/wiki/Main_Page
29
+ PASS wiki-search steps= 2 status=done 4.2s https://en.wikipedia.org/wiki/Python_(programming_language)
30
+ PASS wiki-search steps= 2 status=done 4.3s https://en.wikipedia.org/wiki/Python_(programming_language)
31
+ PASS wiki-search steps= 2 status=done 4.5s https://en.wikipedia.org/wiki/Python_(programming_language)
32
+ PASS hn-new steps= 1 status=done 4.1s https://news.ycombinator.com/newest
33
+ PASS hn-new steps= 1 status=done 2.6s https://news.ycombinator.com/newest
34
+ PASS hn-new steps= 1 status=done 2.6s https://news.ycombinator.com/newest
35
+ PASS hn-login-page steps= 1 status=done 2.7s https://news.ycombinator.com/login?goto=news
36
+ PASS hn-login-page steps= 1 status=done 2.5s https://news.ycombinator.com/login?goto=news
37
+ PASS hn-login-page steps= 1 status=done 2.6s https://news.ycombinator.com/login?goto=news
38
+ PASS gh-issues steps= 1 status=done 7.8s https://github.com/tile-ai/tilelang/issues
39
+ PASS gh-issues steps= 1 status=done 3.4s https://github.com/tile-ai/tilelang/issues
40
+ PASS gh-issues steps= 1 status=done 3.2s https://github.com/tile-ai/tilelang/issues
41
+ PASS py-downloads steps= 1 status=done 4.1s https://www.python.org/downloads/
42
+ PASS py-downloads steps= 1 status=done 2.4s https://www.python.org/downloads/
43
+ PASS py-downloads steps= 1 status=done 3.0s https://www.python.org/downloads/
44
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
45
+ PASS books-travel steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
46
+ PASS books-travel steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
47
+ PASS books-open-book steps= 1 status=done 2.3s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
48
+ PASS books-open-book steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
49
+ PASS books-open-book steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
50
+ PASS internet-dropdown steps= 1 status=done 3.4s https://the-internet.herokuapp.com/dropdown
51
+ PASS internet-dropdown steps= 1 status=done 2.2s https://the-internet.herokuapp.com/dropdown
52
+ PASS internet-dropdown steps= 1 status=done 2.2s https://the-internet.herokuapp.com/dropdown
53
+ PASS internet-checkbox steps= 1 status=done 2.5s https://the-internet.herokuapp.com/checkboxes
54
+ PASS internet-checkbox steps= 1 status=done 2.1s https://the-internet.herokuapp.com/checkboxes
55
+ PASS internet-checkbox steps= 1 status=done 2.2s https://the-internet.herokuapp.com/checkboxes
56
+ FAIL books-page2 steps= 1 status=done 1.8s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
57
+ FAIL books-page2 steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
58
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
59
+ PASS quotes-tag-love steps= 1 status=done 3.9s https://quotes.toscrape.com/tag/love/
60
+ PASS quotes-tag-love steps= 1 status=done 2.8s https://quotes.toscrape.com/tag/love/
61
+ PASS quotes-tag-love steps= 1 status=done 2.8s https://quotes.toscrape.com/tag/love/
62
+ PASS hn-past steps= 1 status=done 3.1s https://news.ycombinator.com/front
63
+ PASS hn-past steps= 1 status=done 4.4s https://news.ycombinator.com/front
64
+ PASS hn-past steps= 1 status=done 3.0s https://news.ycombinator.com/front
65
+ PASS web-search steps= 2 status=done 5.2s https://marginalia-search.com/search?query=tilelang+github&profile=cor
66
+ PASS web-search steps= 2 status=done 3.8s https://marginalia-search.com/search?query=tilelang+github&sst=SE-472b
67
+ PASS web-search steps= 2 status=done 3.1s https://marginalia-search.com/search?query=tilelang+github&profile=cor
68
+ FAIL arxiv-search steps= 2 status=error:ValueError 14.3s https://arxiv.org/
69
+ FAIL arxiv-search steps= 2 status=error:ValueError 12.9s https://arxiv.org/
70
+ FAIL arxiv-search steps= 2 status=error:ValueError 13.4s https://arxiv.org/
71
+ FAIL flights steps=19 status=blocked 7.3s https://www.google.com/travel/flights?tfs=CBwQARoOagwIAxIIL20vMDRqcGwa
72
+ FAIL flights steps=20 status=ready 5.2s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIBBIIL20vMDJqNzEa
73
+ FAIL flights steps=20 status=ready 5.7s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIBBIIL20vMDJqNzEa
74
+ == 36/48 passed (75%, 3 run(s) per task) | median wall 3.1s
75
+ per task: wiki-einstein=0/3 wiki-search=3/3 hn-new=3/3 hn-login-page=3/3 gh-issues=3/3 py-downloads=3/3 books-travel=3/3 books-open-book=3/3 internet-dropdown=3/3 internet-checkbox=3/3 books-page2=0/3 quotes-tag-love=3/3 hn-past=3/3 web-search=3/3 arxiv-search=0/3 flights=0/3
76
+ == suite B x3 (v13s, chunk 40)
77
+ held-out check: OK, no suite-B domain appears in training data
78
+ PASS sqlite-download steps= 1 status=done 5.7s https://www.sqlite.org/download.html
79
+ PASS sqlite-download steps= 1 status=done 1.9s https://www.sqlite.org/download.html
80
+ PASS sqlite-download steps= 1 status=done 1.9s https://www.sqlite.org/download.html
81
+ PASS haskell-downloads steps= 1 status=done 3.9s https://www.haskell.org/downloads/
82
+ PASS haskell-downloads steps= 1 status=done 2.8s https://www.haskell.org/downloads/
83
+ PASS haskell-downloads steps= 1 status=done 2.2s https://www.haskell.org/downloads/
84
+ PASS zig-download steps= 1 status=done 2.3s https://ziglang.org/download/
85
+ PASS zig-download steps= 1 status=done 2.0s https://ziglang.org/download/
86
+ PASS zig-download steps= 1 status=done 2.2s https://ziglang.org/download/
87
+ PASS openbsd-faq steps= 1 status=done 2.0s https://www.openbsd.org/faq/index.html
88
+ PASS openbsd-faq steps= 1 status=done 1.8s https://www.openbsd.org/faq/index.html
89
+ PASS openbsd-faq steps= 1 status=done 1.9s https://www.openbsd.org/faq/index.html
90
+ PASS nginx-download steps= 1 status=done 2.2s https://nginx.org/en/download.html
91
+ PASS nginx-download steps= 1 status=done 1.8s https://nginx.org/en/download.html
92
+ PASS nginx-download steps= 1 status=done 1.9s https://nginx.org/en/download.html
93
+ PASS xkcd-archive steps= 1 status=done 8.4s https://xkcd.com/archive/
94
+ PASS xkcd-archive steps= 1 status=done 4.3s https://xkcd.com/archive/
95
+ PASS xkcd-archive steps= 1 status=done 4.2s https://xkcd.com/archive/
96
+ PASS elixir-install steps= 1 status=done 3.9s https://elixir-lang.org/install/
97
+ PASS elixir-install steps= 1 status=done 2.2s https://elixir-lang.org/install/
98
+ PASS elixir-install steps= 1 status=done 2.0s https://elixir-lang.org/install/
99
+ PASS prometheus-download steps= 1 status=done 5.2s https://prometheus.io/download/
100
+ PASS prometheus-download steps= 1 status=done 3.1s https://prometheus.io/download/
101
+ PASS prometheus-download steps= 1 status=done 3.2s https://prometheus.io/download/
102
+ PASS ocaml-install steps= 1 status=done 4.4s https://ocaml.org/install#linux_mac_bsd
103
+ PASS ocaml-install steps= 1 status=done 3.2s https://ocaml.org/install#linux_mac_bsd
104
+ PASS ocaml-install steps= 1 status=done 3.3s https://ocaml.org/install#linux_mac_bsd
105
+ PASS rosetta-quicksort steps= 2 status=done 4.5s https://rosettacode.org/wiki/Quicksort
106
+ PASS rosetta-quicksort steps= 2 status=done 2.6s https://rosettacode.org/wiki/Sorting_algorithms/Quicksort
107
+ PASS rosetta-quicksort steps= 2 status=done 2.6s https://rosettacode.org/wiki/Sorting_algorithms/Quicksort
108
+ PASS arch-man-grep steps= 2 status=done 4.4s https://man.archlinux.org/man/grep.1
109
+ PASS arch-man-grep steps= 2 status=done 2.5s https://man.archlinux.org/man/grep.1
110
+ PASS arch-man-grep steps= 2 status=done 2.5s https://man.archlinux.org/man/grep.1
111
+ PASS debian-man-tar steps= 3 status=done 6.3s https://manpages.debian.org/trixie/tar/tar.1.en.html
112
+ PASS debian-man-tar steps= 3 status=done 2.6s https://manpages.debian.org/trixie/tar/tar.1.en.html
113
+ PASS debian-man-tar steps= 3 status=done 2.5s https://manpages.debian.org/trixie/tar/tar.1.en.html
114
+ PASS rfc-http-semantics steps= 2 status=done 15.8s https://www.rfc-editor.org/search/?q=HTTP+semantics
115
+ PASS rfc-http-semantics steps= 2 status=done 2.7s https://www.rfc-editor.org/search/?q=HTTP+semantics
116
+ PASS rfc-http-semantics steps= 2 status=done 2.7s https://www.rfc-editor.org/search/?q=HTTP+semantics
117
+ PASS nixos-ripgrep steps= 2 status=done 4.8s https://search.nixos.org/packages?channel=26.05&query=ripgrep
118
+ PASS nixos-ripgrep steps= 2 status=done 2.7s https://search.nixos.org/packages?channel=26.05&query=ripgrep
119
+ PASS nixos-ripgrep steps= 2 status=done 3.2s https://search.nixos.org/packages?channel=26.05&query=ripgrep
120
+ PASS ocaml-pkg-yojson steps= 2 status=done 3.9s https://ocaml.org/packages/search?q=yojson
121
+ PASS ocaml-pkg-yojson steps= 2 status=done 2.6s https://ocaml.org/packages/search?q=yojson
122
+ PASS ocaml-pkg-yojson steps= 2 status=done 2.9s https://ocaml.org/packages/search?q=yojson
123
+ PASS shop-search-jacket steps= 2 status=done 4.9s https://www.scrapingcourse.com/ecommerce/?s=jacket&post_type=product
124
+ PASS shop-search-jacket steps= 2 status=done 2.9s https://www.scrapingcourse.com/ecommerce/?s=jacket&post_type=product
125
+ PASS shop-search-jacket steps= 2 status=done 2.8s https://www.scrapingcourse.com/ecommerce/?s=jacket&post_type=product
126
+ PASS shop-page2 steps= 2 status=done 3.4s https://www.scrapingcourse.com/ecommerce/page/2/
127
+ PASS shop-page2 steps= 2 status=done 4.2s https://www.scrapingcourse.com/ecommerce/page/2/
128
+ FAIL shop-page2 steps= 3 status=blocked 2.9s https://www.scrapingcourse.com/ecommerce/
129
+ FAIL shop-sort-price steps= 2 status=done 6.2s https://www.scrapingcourse.com/ecommerce/page/2/
130
+ FAIL shop-sort-price steps= 2 status=done 3.4s https://www.scrapingcourse.com/ecommerce/page/2/
131
+ FAIL shop-sort-price steps= 2 status=done 3.4s https://www.scrapingcourse.com/ecommerce/page/2/
132
+ == 50/54 passed (93%, 3 run(s) per task) | median wall 2.9s
133
+ per task: sqlite-download=3/3 haskell-downloads=3/3 zig-download=3/3 openbsd-faq=3/3 nginx-download=3/3 xkcd-archive=3/3 elixir-install=3/3 prometheus-download=3/3 ocaml-install=3/3 rosetta-quicksort=3/3 arch-man-grep=3/3 debian-man-tar=3/3 rfc-http-semantics=3/3 nixos-ripgrep=3/3 ocaml-pkg-yojson=3/3 shop-search-jacket=3/3 shop-page2=2/3 shop-sort-price=0/3
134
+ V13S_DONE
results/round3/v14s.log ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ == rollout2 cases: 2343
2
+ == build v14s
3
+ operation label counts: {'TYPE_TEXT': 11106, 'CLICK': 16255, 'SELECT': 3198, 'DONE': 15560, 'SCROLL_DOWN': 5480, 'PRESS_ENTER': 2496, 'SCROLL_UP': 137}
4
+ train items 75255 (op 54232, target 21023), eval cases 5314, skipped 0, seq len mean 765 max 1024
5
+ == train v14s (1 epochs from v13s)
6
+ === epoch 1/1 avg loss 0.9916 2721s
7
+ saved finetune/out/laya-browser-v14s
8
+ == calibrate
9
+ n=4957 acc=0.636 T=1: nll 3.337 mean conf 0.868 | T=5.03: nll 1.398 mean conf 0.647
10
+ wrote temperature 5.025579877567767 -> /home/ckl/projects/S/laya/finetune/out/laya-browser-v14s/rl_agent_config.json
11
+ == eval
12
+ /home/ckl/projects/S/laya/finetune/out/laya-browser-v14s/: cases 5314 operation acc 0.724 target top-1 0.575 (n=4602, mean normalized rank 0.298) 19 ms/case
13
+ live CLICK n=1050 op acc 0.96 target top-1 0.85
14
+ live DONE n= 125 op acc 0.87
15
+ live SELECT n= 32 op acc 0.88 target top-1 0.84
16
+ live TYPE_TEXT n= 117 op acc 0.84 target top-1 0.96
17
+ mind2web CLICK n=1084 op acc 0.89 target top-1 0.48
18
+ mind2web SELECT n= 126 op acc 0.52 target top-1 0.33
19
+ mind2web TYPE_TEXT n= 200 op acc 0.76 target top-1 0.84
20
+ nnetnav CLICK n=1386 op acc 0.71 target top-1 0.25
21
+ nnetnav DONE n= 313 op acc 0.31
22
+ nnetnav SCROLL_DOWN n= 224 op acc 0.08 target top-1 0.00
23
+ nnetnav SCROLL_UP n= 50 op acc 0.00 target top-1 0.00
24
+ nnetnav TYPE_TEXT n= 607 op acc 0.55 target top-1 0.88
25
+ == suite A x3 (v14s, chunk 60)
26
+ FAIL wiki-einstein steps= 2 status=done 7.2s https://en.wikipedia.org/wiki/Wikipedia
27
+ PASS wiki-einstein steps= 2 status=done 4.9s https://en.wikipedia.org/wiki/Albert_Einstein
28
+ FAIL wiki-einstein steps= 2 status=done 5.9s https://en.wikipedia.org/wiki/Wikipedia
29
+ PASS wiki-search steps= 2 status=done 5.4s https://en.wikipedia.org/wiki/Python_(programming_language)
30
+ PASS wiki-search steps= 2 status=done 5.0s https://en.wikipedia.org/wiki/Python_(programming_language)
31
+ PASS wiki-search steps= 2 status=done 4.7s https://en.wikipedia.org/wiki/Python_(programming_language)
32
+ PASS hn-new steps= 1 status=done 3.6s https://news.ycombinator.com/newest
33
+ PASS hn-new steps= 1 status=done 2.5s https://news.ycombinator.com/newest
34
+ PASS hn-new steps= 1 status=done 2.5s https://news.ycombinator.com/newest
35
+ PASS hn-login-page steps= 1 status=done 2.7s https://news.ycombinator.com/login?goto=news
36
+ PASS hn-login-page steps= 1 status=done 2.5s https://news.ycombinator.com/login?goto=news
37
+ PASS hn-login-page steps= 1 status=done 2.4s https://news.ycombinator.com/login?goto=news
38
+ PASS gh-issues steps= 1 status=done 6.8s https://github.com/tile-ai/tilelang/issues
39
+ PASS gh-issues steps= 1 status=done 3.6s https://github.com/tile-ai/tilelang/issues
40
+ PASS gh-issues steps= 1 status=done 3.8s https://github.com/tile-ai/tilelang/issues
41
+ PASS py-downloads steps= 1 status=done 5.2s https://www.python.org/downloads/
42
+ PASS py-downloads steps= 1 status=done 3.6s https://www.python.org/downloads/
43
+ PASS py-downloads steps= 1 status=done 2.6s https://www.python.org/downloads/
44
+ PASS books-travel steps= 1 status=done 2.1s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
45
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
46
+ PASS books-travel steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/category/books/travel_2/index.htm
47
+ PASS books-open-book steps= 1 status=done 2.2s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
48
+ PASS books-open-book steps= 1 status=done 1.8s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
49
+ PASS books-open-book steps= 1 status=done 1.9s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
50
+ PASS internet-dropdown steps= 1 status=done 3.4s https://the-internet.herokuapp.com/dropdown
51
+ PASS internet-dropdown steps= 1 status=done 2.1s https://the-internet.herokuapp.com/dropdown
52
+ PASS internet-dropdown steps= 1 status=done 2.2s https://the-internet.herokuapp.com/dropdown
53
+ PASS internet-checkbox steps= 1 status=done 2.6s https://the-internet.herokuapp.com/checkboxes
54
+ PASS internet-checkbox steps= 1 status=done 2.1s https://the-internet.herokuapp.com/checkboxes
55
+ PASS internet-checkbox steps= 1 status=done 2.1s https://the-internet.herokuapp.com/checkboxes
56
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
57
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
58
+ FAIL books-page2 steps= 1 status=done 2.0s https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.h
59
+ PASS quotes-tag-love steps= 1 status=done 3.8s https://quotes.toscrape.com/tag/love/
60
+ PASS quotes-tag-love steps= 1 status=done 3.0s https://quotes.toscrape.com/tag/love/
61
+ PASS quotes-tag-love steps= 1 status=done 3.0s https://quotes.toscrape.com/tag/love/
62
+ PASS hn-past steps= 1 status=done 3.0s https://news.ycombinator.com/front
63
+ PASS hn-past steps= 1 status=done 2.6s https://news.ycombinator.com/front
64
+ PASS hn-past steps= 1 status=done 2.6s https://news.ycombinator.com/front
65
+ PASS web-search steps= 2 status=done 6.7s https://marginalia-search.com/search?query=tilelang+github&sst=SE-1e14
66
+ PASS web-search steps= 2 status=done 4.6s https://marginalia-search.com/search?query=tilelang+github&profile=cor
67
+ PASS web-search steps= 2 status=done 5.2s https://marginalia-search.com/search?query=tilelang+github&profile=cor
68
+ FAIL arxiv-search steps= 4 status=done 6.2s https://arxiv.org/search/
69
+ PASS arxiv-search steps= 8 status=done 3.8s https://arxiv.org/search/?query=flash+attention&searchtype=all&source=
70
+ PASS arxiv-search steps=14 status=done 10.1s https://arxiv.org/search/?query=flash+attention&searchtype=all&abstrac
71
+ FAIL flights steps=20 status=ready 7.1s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
72
+ FAIL flights steps=20 status=ready 5.5s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
73
+ FAIL flights steps=20 status=ready 5.7s https://www.google.com/travel/flights?tfs=CBwQARoOcgwIAxIIL20vMDRqcGwa
74
+ == 39/48 passed (81%, 3 run(s) per task) | median wall 3.0s
75
+ per task: wiki-einstein=1/3 wiki-search=3/3 hn-new=3/3 hn-login-page=3/3 gh-issues=3/3 py-downloads=3/3 books-travel=3/3 books-open-book=3/3 internet-dropdown=3/3 internet-checkbox=3/3 books-page2=0/3 quotes-tag-love=3/3 hn-past=3/3 web-search=3/3 arxiv-search=2/3 flights=0/3
76
+ == suite B x3 (v14s, chunk 60)
77
+ held-out check: OK, no suite-B domain appears in training data
78
+ PASS sqlite-download steps= 1 status=done 6.4s https://www.sqlite.org/download.html
79
+ PASS sqlite-download steps= 1 status=done 2.0s https://www.sqlite.org/download.html
80
+ PASS sqlite-download steps= 1 status=done 2.0s https://www.sqlite.org/download.html
81
+ PASS haskell-downloads steps= 1 status=done 3.5s https://www.haskell.org/downloads/
82
+ PASS haskell-downloads steps= 1 status=done 2.1s https://www.haskell.org/downloads/
83
+ PASS haskell-downloads steps= 1 status=done 2.2s https://www.haskell.org/downloads/
84
+ PASS zig-download steps= 1 status=done 5.9s https://ziglang.org/download/
85
+ PASS zig-download steps= 1 status=done 2.0s https://ziglang.org/download/
86
+ PASS zig-download steps= 1 status=done 2.2s https://ziglang.org/download/
87
+ PASS openbsd-faq steps= 1 status=done 2.0s https://www.openbsd.org/faq/index.html
88
+ PASS openbsd-faq steps= 1 status=done 2.0s https://www.openbsd.org/faq/index.html
89
+ PASS openbsd-faq steps= 1 status=done 2.0s https://www.openbsd.org/faq/index.html
90
+ PASS nginx-download steps= 1 status=done 2.2s https://nginx.org/en/download.html
91
+ PASS nginx-download steps= 1 status=done 1.8s https://nginx.org/en/download.html
92
+ PASS nginx-download steps= 1 status=done 1.9s https://nginx.org/en/download.html
93
+ PASS xkcd-archive steps= 1 status=done 7.5s https://xkcd.com/archive/
94
+ PASS xkcd-archive steps= 1 status=done 4.6s https://xkcd.com/archive/
95
+ PASS xkcd-archive steps= 1 status=done 4.0s https://xkcd.com/archive/
96
+ PASS elixir-install steps= 1 status=done 4.4s https://elixir-lang.org/install/
97
+ PASS elixir-install steps= 1 status=done 2.2s https://elixir-lang.org/install/
98
+ PASS elixir-install steps= 1 status=done 2.0s https://elixir-lang.org/install/
99
+ PASS prometheus-download steps= 1 status=done 9.3s https://prometheus.io/download/
100
+ PASS prometheus-download steps= 1 status=done 3.2s https://prometheus.io/download/
101
+ PASS prometheus-download steps= 1 status=done 3.0s https://prometheus.io/download/
102
+ PASS ocaml-install steps= 2 status=done 4.9s https://ocaml.org/docs/installing-ocaml
103
+ PASS ocaml-install steps= 2 status=done 4.1s https://ocaml.org/docs/installing-ocaml
104
+ PASS ocaml-install steps= 2 status=done 4.1s https://ocaml.org/docs/installing-ocaml
105
+ PASS rosetta-quicksort steps= 2 status=done 4.0s https://rosettacode.org/wiki/Quicksort
106
+ PASS rosetta-quicksort steps= 2 status=done 2.7s https://rosettacode.org/wiki/Quicksort
107
+ PASS rosetta-quicksort steps= 2 status=done 2.7s https://rosettacode.org/wiki/Sorting_algorithms/Quicksort
108
+ PASS arch-man-grep steps= 2 status=done 4.0s https://man.archlinux.org/man/grep.1
109
+ PASS arch-man-grep steps= 2 status=done 2.6s https://man.archlinux.org/man/grep.1
110
+ PASS arch-man-grep steps= 2 status=done 2.6s https://man.archlinux.org/man/grep.1
111
+ PASS debian-man-tar steps= 2 status=done 5.1s https://manpages.debian.org/trixie/tar/tar.1.en.html
112
+ PASS debian-man-tar steps= 2 status=done 2.1s https://manpages.debian.org/trixie/tar/tar.1.en.html
113
+ PASS debian-man-tar steps= 2 status=done 1.9s https://manpages.debian.org/trixie/tar/tar.1.en.html
114
+ PASS rfc-http-semantics steps= 2 status=done 5.7s https://www.rfc-editor.org/search/?q=HTTP+semantics
115
+ PASS rfc-http-semantics steps= 2 status=done 3.7s https://www.rfc-editor.org/search/?q=HTTP+semantics
116
+ PASS rfc-http-semantics steps= 2 status=done 3.1s https://www.rfc-editor.org/search/?q=HTTP+semantics
117
+ PASS nixos-ripgrep steps= 2 status=done 4.0s https://search.nixos.org/packages?channel=26.05&query=ripgrep
118
+ PASS nixos-ripgrep steps= 2 status=done 2.8s https://search.nixos.org/packages?channel=26.05&query=ripgrep
119
+ PASS nixos-ripgrep steps= 2 status=done 2.8s https://search.nixos.org/packages?channel=26.05&query=ripgrep
120
+ PASS ocaml-pkg-yojson steps= 2 status=done 3.7s https://ocaml.org/packages/search?q=yojson
121
+ PASS ocaml-pkg-yojson steps= 2 status=done 2.6s https://ocaml.org/packages/search?q=yojson
122
+ PASS ocaml-pkg-yojson steps= 2 status=done 2.8s https://ocaml.org/packages/search?q=yojson
123
+ PASS shop-search-jacket steps= 2 status=done 5.2s https://www.scrapingcourse.com/ecommerce/?s=jacket&post_type=product
124
+ PASS shop-search-jacket steps= 2 status=done 2.9s https://www.scrapingcourse.com/ecommerce/?s=jacket&post_type=product
125
+ PASS shop-search-jacket steps= 2 status=done 2.9s https://www.scrapingcourse.com/ecommerce/?s=jacket&post_type=product
126
+ PASS shop-page2 steps= 1 status=done 3.2s https://www.scrapingcourse.com/ecommerce/page/2/
127
+ PASS shop-page2 steps= 1 status=done 3.6s https://www.scrapingcourse.com/ecommerce/page/2/
128
+ PASS shop-page2 steps= 1 status=done 3.5s https://www.scrapingcourse.com/ecommerce/page/2/
129
+ PASS shop-sort-price steps= 1 status=done 3.9s https://www.scrapingcourse.com/ecommerce/?orderby=price
130
+ PASS shop-sort-price steps= 1 status=done 3.3s https://www.scrapingcourse.com/ecommerce/?orderby=price
131
+ PASS shop-sort-price steps= 1 status=done 3.4s https://www.scrapingcourse.com/ecommerce/?orderby=price
132
+ == 54/54 passed (100%, 3 run(s) per task) | median wall 3.1s
133
+ per task: sqlite-download=3/3 haskell-downloads=3/3 zig-download=3/3 openbsd-faq=3/3 nginx-download=3/3 xkcd-archive=3/3 elixir-install=3/3 prometheus-download=3/3 ocaml-install=3/3 rosetta-quicksort=3/3 arch-man-grep=3/3 debian-man-tar=3/3 rfc-http-semantics=3/3 nixos-ripgrep=3/3 ocaml-pkg-yojson=3/3 shop-search-jacket=3/3 shop-page2=3/3 shop-sort-price=3/3
134
+ V14S_DONE
v14s/encoder/config.json ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "ModernBertForMaskedLM"
4
+ ],
5
+ "attention_bias": false,
6
+ "attention_dropout": 0.0,
7
+ "bos_token_id": 2,
8
+ "classifier_activation": "gelu",
9
+ "classifier_bias": false,
10
+ "classifier_dropout": 0.0,
11
+ "classifier_pooling": "mean",
12
+ "cls_token_id": 1,
13
+ "decoder_bias": true,
14
+ "deterministic_flash_attn": false,
15
+ "dtype": "float32",
16
+ "embedding_dropout": 0.0,
17
+ "eos_token_id": 1,
18
+ "global_attn_every_n_layers": 3,
19
+ "gradient_checkpointing": false,
20
+ "hidden_activation": "gelu",
21
+ "hidden_size": 768,
22
+ "initializer_cutoff_factor": 2.0,
23
+ "initializer_range": 0.02,
24
+ "intermediate_size": 1152,
25
+ "layer_norm_eps": 1e-05,
26
+ "layer_types": [
27
+ "full_attention",
28
+ "sliding_attention",
29
+ "sliding_attention",
30
+ "full_attention",
31
+ "sliding_attention",
32
+ "sliding_attention",
33
+ "full_attention",
34
+ "sliding_attention",
35
+ "sliding_attention",
36
+ "full_attention",
37
+ "sliding_attention",
38
+ "sliding_attention",
39
+ "full_attention",
40
+ "sliding_attention",
41
+ "sliding_attention",
42
+ "full_attention",
43
+ "sliding_attention",
44
+ "sliding_attention",
45
+ "full_attention",
46
+ "sliding_attention",
47
+ "sliding_attention",
48
+ "full_attention"
49
+ ],
50
+ "local_attention": 128,
51
+ "mask_token_id": 4,
52
+ "max_position_embeddings": 8192,
53
+ "mlp_bias": false,
54
+ "mlp_dropout": 0.0,
55
+ "model_type": "modernbert",
56
+ "norm_bias": false,
57
+ "norm_eps": 1e-05,
58
+ "num_attention_heads": 12,
59
+ "num_hidden_layers": 22,
60
+ "pad_token_id": 0,
61
+ "position_embedding_type": "sans_pos",
62
+ "repad_logits_with_grad": false,
63
+ "rope_parameters": {
64
+ "full_attention": {
65
+ "rope_theta": 160000,
66
+ "rope_type": "default"
67
+ },
68
+ "sliding_attention": {
69
+ "rope_theta": 160000,
70
+ "rope_type": "default"
71
+ }
72
+ },
73
+ "sep_token_id": 1,
74
+ "sparse_pred_ignore_index": -100,
75
+ "sparse_prediction": false,
76
+ "tie_word_embeddings": true,
77
+ "transformers_version": "5.17.0",
78
+ "vocab_size": 256000
79
+ }
v14s/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c4e8b144c47e7fa97b128b4447e29cb0540c156fa50b5958200bb15b6a9c1801
3
+ size 643835524