From 34255cf5455ca90f99068f0696ac9a95fde1b917 Mon Sep 17 00:00:00 2001
From: lanyue-llk <270302213+lanyue-llk@users.noreply.github.com>
Date: Mon, 26 Oct 2026 12:19:28 +0800
Subject: [PATCH 01/16] docs: align onboarding, versions and project references
---
README.md | 31 ++++++++++++++++++++++++-------
THIRD_PARTY.md | 13 +++++++++++++
docs/README.zh-CN.md | 31 ++++++++++++++++++++++++-------
3 files changed, 61 insertions(+), 14 deletions(-)
diff --git a/README.md b/README.md
index 6fd5894..4b8bb6a 100644
--- a/README.md
+++ b/README.md
@@ -8,11 +8,13 @@
[](LICENSE)
[](pyproject.toml)
-[Tasks](#task-suites) · [Quickstart](#quickstart) · [Scoring](#score-an-answer) · [Contributing](CONTRIBUTING.md)
+[Tasks](#task-suites) · [Quickstart](#quickstart) · [Scoring](#score-an-answer) · [Versions](#versions) · [Related projects](#related-repositories) · [Contributing](CONTRIBUTING.md)
-LexBench Web Fetch provides tasks and scoring tools for web retrieval: page text, records with usable links, resources and files. Use it with your own runner or [Browser Eval](https://github.com/lexmount/browser-eval).
+LexBench Web Fetch defines 550 Web Fetch tasks and scores returned page text, records with usable links, resources and files. Use the tasks with your own runner or [Browser Eval](https://github.com/lexmount/browser-eval) to compare browsers, extraction tools and hosted services.
+
+This repository owns the task definitions, acceptance rules and frozen input bindings. Browser Eval owns provider calls, timing, evidence and comparison reports.
## Task suites
@@ -61,13 +63,28 @@ uv run --frozen lexbench-webfetch score --task examples/task.json --response exa
For real evaluations, use the complete task from a verified dataset. Add `--metadata metadata.json` for structured response fields, or `--file /absolute/path/file` for delivered files. Scoring requirements and result reporting are described in the [evaluation protocol](docs/protocol.md).
-## Versions and execution
+## Run browsers and build reports
+
+Follow the [Browser Eval integration guide](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md) to run exported tasks against browsers or services and build comparison reports. Provider accounts, API keys and measured outputs belong to the execution environment. The commands above validate and score saved inputs without calling providers.
+
+## Versions
+
+The current full catalog is benchmark edition `2.0.1` (`bench-v2.0.1`), with 550 entries. The Python tooling package is `0.3.0`. These versions identify different things: the edition fixes tasks, references and scoring; the package versions the commands and Python implementation.
+
+Run `uv run --frozen lexbench-webfetch version` to verify the installed catalog. Use `release` to freeze the exact selected tasks and scorer in `benchmark-release.json`, and `compare-releases` to check whether results can be compared directly, need rescoring or belong to separate populations. Installing a newer package leaves an existing report's edition unchanged. See [versioning](docs/versions.md) for commands and change rules.
-Run `uv run --frozen lexbench-webfetch version` to inspect the installed catalog. Tags use `bench-vMAJOR.MINOR.PATCH`. Each report freezes the selected tasks and scoring source in `benchmark-release.json`; a package upgrade leaves that selection unchanged.
+## Related repositories
-Use `release` to freeze an edition and `compare-releases` to check comparability. See [versioning](docs/versions.md) for commands and major/minor/patch rules.
+| Repository | Role |
+| --- | --- |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | Browser/provider execution, saved evidence and comparison reports |
+| [LexBench Web Search](https://github.com/lexmount/lexbench-websearch) | Search queries, source references and retrieval scoring |
+| [Moli](https://github.com/lexmount/moli) | Browser that can be evaluated with these tasks |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | CLI client for the Lexmount WebFetch service |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | Hosting, versioning and sharing of generated reports |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | Protocol, automation-driver and web-platform benchmarks |
-To execute browser or service calls and build reports, follow the [Browser Eval integration guide](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md).
+[Third-party notices](THIRD_PARTY.md) list scoring dependencies and source rights. WebMainBench, WCXB and WebArena are separate benchmarks; they are not part of this 550-entry catalog.
## Contribute
@@ -77,7 +94,7 @@ Read [CONTRIBUTING](CONTRIBUTING.md) before changing task requirements or scorin
## Cite LexBench Web Fetch
-Use this citation or [CITATION.cff](CITATION.cff), and record the benchmark edition and suites used.
+Use this citation or [CITATION.cff](CITATION.cff), and record the benchmark edition, suites and code revision used. The citation below identifies the tooling package; the catalog edition is `2.0.1`.
```bibtex
@software{lexbench_webfetch_2026,
diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md
index e3156af..8738a6e 100644
--- a/THIRD_PARTY.md
+++ b/THIRD_PARTY.md
@@ -5,3 +5,16 @@ The Apache-2.0 license covers project-owned code, documentation and task require
Original website text, document files, media, screenshots and frozen reference captures retain their source terms and are not included here. Public accessibility and a source URL do not grant redistribution permission. Task definitions retain source URLs and compact acceptance requirements; full historical reference inputs must be obtained separately under an appropriate authorization basis.
WebMainBench, WCXB and WebArena are separate projects and are not redistributed as LexBench Web Fetch suites. Cite their owners and follow their terms when using them through an execution harness.
+
+## Scoring dependencies
+
+Exact versions and resolved hashes are in `pyproject.toml` and `uv.lock`.
+
+| Library | Use | License |
+| --- | --- | --- |
+| [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/) | HTML parsing | MIT |
+| [Soup Sieve](https://github.com/facelessuser/soupsieve) | CSS selectors | MIT |
+| [APTED](https://github.com/JoaoFelipe/apted) | Optional tree-edit scoring | MIT |
+| [RapidFuzz](https://github.com/rapidfuzz/RapidFuzz) | Optional text matching | MIT |
+
+These libraries retain their own licenses. Installing the `tree` extra enables the optional scoring dependencies.
diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md
index 57a7178..afbb4e0 100644
--- a/docs/README.zh-CN.md
+++ b/docs/README.zh-CN.md
@@ -8,11 +8,13 @@
[](../LICENSE)
[](../pyproject.toml)
-[任务集](#任务集) · [快速开始](#快速开始) · [评分](#给响应评分) · [参与贡献](../CONTRIBUTING.md)
+[任务集](#任务集) · [快速开始](#快速开始) · [评分](#给响应评分) · [版本](#版本) · [相关仓库](#相关仓库) · [参与贡献](../CONTRIBUTING.md)
-LexBench Web Fetch 提供网页获取任务和评分工具,评测正文、带有效链接的记录、资源和文件。可以使用自己的运行器,也可以接入 [Browser Eval](https://github.com/lexmount/browser-eval)。
+LexBench Web Fetch 定义了 550 条网页获取任务,评测返回的正文、带有效链接的记录、资源和文件。可以用自己的运行器,也可以接入 [Browser Eval](https://github.com/lexmount/browser-eval),比较浏览器、提取工具和在线服务。
+
+本仓库维护题目、验收规则和冻结输入绑定。Browser Eval 负责服务调用、计时、证据保存和对比报告。
## 任务集
@@ -61,13 +63,28 @@ uv run --frozen lexbench-webfetch score --task examples/task.json --response exa
实际评测应使用经过验证的数据集中的完整任务。结构化响应字段通过 `--metadata metadata.json` 传入,交付文件通过 `--file /absolute/path/file` 传入。评分要求和结果发布规则见[评测协议](../docs/protocol.md)。
-## 版本与运行
+## 运行浏览器并生成报告
+
+按 [Browser Eval 接入指南](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md)执行导出的任务,调用浏览器或在线服务,生成对比报告。服务账号、API 密钥和实测输出由运行环境管理。上面的命令只检查输入、给已保存的响应评分,不调用服务。
+
+## 版本
+
+当前完整题库的评测版本为 `2.0.1`(`bench-v2.0.1`),共 550 条题目;Python 工具包版本为 `0.3.0`。评测版本固定题目、参考输入和评分规则,工具包版本标识命令与 Python 实现。
+
+运行 `uv run --frozen lexbench-webfetch version` 验证安装的题库。用 `release` 将实际选用的题目和评分器固定在 `benchmark-release.json` 中,用 `compare-releases` 判断结果能直接比较、需要重算评分,还是属于不同题目范围。升级包不会替换已有报告的评测版本。命令和版本变更规则见[版本说明](../docs/versions.md)。
-运行 `uv run --frozen lexbench-webfetch version` 查看安装的题库版本。标签格式为 `bench-v主版本.次版本.补丁版本`。每份报告通过 `benchmark-release.json` 固定所选题目和评分源码,升级包不会替换这份选择。
+## 相关仓库
-用 `release` 固定评测版本,用 `compare-releases` 检查结果是否可比。命令和主版本、次版本、补丁版本规则见[版本说明](../docs/versions.md)。
+| 仓库 | 用途 |
+| --- | --- |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | 运行浏览器与服务、保存证据、生成对比报告 |
+| [LexBench Web Search](https://github.com/lexmount/lexbench-websearch) | 搜索问题、来源参考和检索评分 |
+| [Moli](https://github.com/lexmount/moli) | 可使用本题库评测的浏览器 |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | Lexmount WebFetch 服务的命令行客户端 |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | 报告托管、版本管理和分享 |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | 协议、自动化驱动和 Web 平台评测 |
-执行浏览器或服务调用并生成报告,请按 [Browser Eval 接入指南](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md)操作。
+评分依赖和来源权利见[第三方说明](../THIRD_PARTY.md)。WebMainBench、WCXB 和 WebArena 是独立评测集,不计入这里的 550 条题目。
## 参与贡献
@@ -77,7 +94,7 @@ uv run --frozen lexbench-webfetch score --task examples/task.json --response exa
## 引用 LexBench Web Fetch
-使用以下引用或 [CITATION.cff](../CITATION.cff),并注明评测版本和任务集。
+使用以下引用或 [CITATION.cff](../CITATION.cff),并注明评测版本、任务集和代码版本。以下引用标识工具包版本,题库评测版本为 `2.0.1`。
```bibtex
@software{lexbench_webfetch_2026,
From 20e9646c1a2a980ca4c225fe2c724137a70b84b1 Mon Sep 17 00:00:00 2001
From: lanyue-llk <270302213+lanyue-llk@users.noreply.github.com>
Date: Mon, 26 Oct 2026 13:45:38 +0800
Subject: [PATCH 02/16] feat(benchmarks): consolidate Fetch and Search in one
workspace
---
.github/workflows/ci.yml | 18 +-
AGENTS.md | 4 +-
CITATION.cff | 11 +-
CONTRIBUTING.md | 38 +-
MANIFEST.in | 2 +-
Makefile | 40 +-
README.md | 100 +-
SECURITY.md | 2 +-
THIRD_PARTY.md | 4 +
docs/README.zh-CN.md | 100 +-
docs/versions.md | 17 +-
docs/webfetch.cff | 10 +
docs/webfetch.md | 109 +
docs/webfetch.zh-CN.md | 109 +
packages/websearch/CITATION.cff | 25 +
packages/websearch/LICENSE | 202 +
packages/websearch/LICENSES/Project-MIT.txt | 21 +
packages/websearch/MANIFEST.in | 3 +
packages/websearch/NOTICE | 7 +
packages/websearch/README.md | 124 +
packages/websearch/THIRD_PARTY.md | 12 +
packages/websearch/docs/README.zh-CN.md | 124 +
packages/websearch/docs/assets/overview.png | Bin 0 -> 1197814 bytes
packages/websearch/docs/data.md | 41 +
packages/websearch/docs/evaluation.md | 48 +
packages/websearch/docs/integration.md | 20 +
packages/websearch/docs/versions.md | 66 +
packages/websearch/examples/missing.json | 1 +
packages/websearch/examples/relevant.json | 1 +
packages/websearch/provenance.json | 30 +
packages/websearch/pyproject.toml | 35 +
.../src/lexbench_websearch/__init__.py | 3 +
.../src/lexbench_websearch/answer_rules.py | 241 +
.../websearch/src/lexbench_websearch/cli.py | 84 +
.../src/lexbench_websearch/contracts.py | 50 +
.../lexbench_websearch/definitions/NOTICE.txt | 67 +
.../definitions/benchmark-release.json | 47 +
.../definitions/contamination-patterns.json | 4 +
.../definitions/datasets/factual-v1.json | 14934 ++++++++++++++++
.../definitions/datasets/scenarios-v1.json | 2285 +++
.../definitions/datasets/scenarios-v2.json | 3247 ++++
.../definitions/factual-source.json | 35 +
.../definitions/preview-rubric-v1.txt | 4 +
.../definitions/preview-rubric-v2.txt | 4 +
.../definitions/registry.json | 24 +
.../definitions/scoring-regressions.json | 754 +
.../definitions/sources.json | 2133 +++
.../lexbench_websearch/evidence_quality.py | 90 +
.../src/lexbench_websearch/inputs.py | 78 +
.../src/lexbench_websearch/qualification.py | 144 +
.../src/lexbench_websearch/relevance.py | 272 +
.../src/lexbench_websearch/rubric.py | 13 +
.../src/lexbench_websearch/scoring.py | 286 +
.../src/lexbench_websearch/simpleqa.py | 78 +
.../src/lexbench_websearch/versions.py | 224 +
packages/websearch/tests/test_acceptance.py | 174 +
packages/websearch/tests/test_answer_rules.py | 114 +
.../websearch/tests/test_evidence_quality.py | 140 +
packages/websearch/tests/test_inputs.py | 182 +
packages/websearch/tests/test_relevance.py | 85 +
packages/websearch/tests/test_rubric.py | 10 +
packages/websearch/tests/test_scoring.py | 45 +
.../websearch/tests/test_serp_contracts.py | 150 +
packages/websearch/tests/test_simpleqa.py | 50 +
.../websearch/tests/test_task_acceptance.py | 97 +
packages/websearch/tests/test_versions.py | 188 +
pyproject.toml | 10 +-
uv.lock | 73 +
68 files changed, 27595 insertions(+), 148 deletions(-)
create mode 100644 docs/webfetch.cff
create mode 100644 docs/webfetch.md
create mode 100644 docs/webfetch.zh-CN.md
create mode 100644 packages/websearch/CITATION.cff
create mode 100644 packages/websearch/LICENSE
create mode 100644 packages/websearch/LICENSES/Project-MIT.txt
create mode 100644 packages/websearch/MANIFEST.in
create mode 100644 packages/websearch/NOTICE
create mode 100644 packages/websearch/README.md
create mode 100644 packages/websearch/THIRD_PARTY.md
create mode 100644 packages/websearch/docs/README.zh-CN.md
create mode 100644 packages/websearch/docs/assets/overview.png
create mode 100644 packages/websearch/docs/data.md
create mode 100644 packages/websearch/docs/evaluation.md
create mode 100644 packages/websearch/docs/integration.md
create mode 100644 packages/websearch/docs/versions.md
create mode 100644 packages/websearch/examples/missing.json
create mode 100644 packages/websearch/examples/relevant.json
create mode 100644 packages/websearch/provenance.json
create mode 100644 packages/websearch/pyproject.toml
create mode 100644 packages/websearch/src/lexbench_websearch/__init__.py
create mode 100644 packages/websearch/src/lexbench_websearch/answer_rules.py
create mode 100644 packages/websearch/src/lexbench_websearch/cli.py
create mode 100644 packages/websearch/src/lexbench_websearch/contracts.py
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/NOTICE.txt
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/benchmark-release.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/contamination-patterns.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/datasets/factual-v1.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/datasets/scenarios-v1.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/datasets/scenarios-v2.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/factual-source.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/preview-rubric-v1.txt
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/preview-rubric-v2.txt
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/registry.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/scoring-regressions.json
create mode 100644 packages/websearch/src/lexbench_websearch/definitions/sources.json
create mode 100644 packages/websearch/src/lexbench_websearch/evidence_quality.py
create mode 100644 packages/websearch/src/lexbench_websearch/inputs.py
create mode 100644 packages/websearch/src/lexbench_websearch/qualification.py
create mode 100644 packages/websearch/src/lexbench_websearch/relevance.py
create mode 100644 packages/websearch/src/lexbench_websearch/rubric.py
create mode 100644 packages/websearch/src/lexbench_websearch/scoring.py
create mode 100644 packages/websearch/src/lexbench_websearch/simpleqa.py
create mode 100644 packages/websearch/src/lexbench_websearch/versions.py
create mode 100644 packages/websearch/tests/test_acceptance.py
create mode 100644 packages/websearch/tests/test_answer_rules.py
create mode 100644 packages/websearch/tests/test_evidence_quality.py
create mode 100644 packages/websearch/tests/test_inputs.py
create mode 100644 packages/websearch/tests/test_relevance.py
create mode 100644 packages/websearch/tests/test_rubric.py
create mode 100644 packages/websearch/tests/test_scoring.py
create mode 100644 packages/websearch/tests/test_serp_contracts.py
create mode 100644 packages/websearch/tests/test_simpleqa.py
create mode 100644 packages/websearch/tests/test_task_acceptance.py
create mode 100644 packages/websearch/tests/test_versions.py
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 11ae445..5db3e8f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -16,18 +16,6 @@ jobs:
- uses: astral-sh/setup-uv@v6
with:
version: "0.7.8"
- - run: uv sync --frozen --extra test --python "$(command -v python)"
- - run: uv run --frozen --extra test python -m pytest tests -q
- - run: uv run --frozen lexbench-webfetch validate
- - run: uv build --sdist
- - run: uv build dist/*.tar.gz --wheel
- - name: Validate an isolated wheel installation
- run: |
- uv venv /tmp/lexbench-wheel --python "$(command -v python)"
- for lexbench_wheel in dist/*.whl; do
- uv pip install --python /tmp/lexbench-wheel/bin/python "${lexbench_wheel}[test]"
- done
- cp -R tests /tmp/lexbench-wheel-tests
- cd /tmp
- /tmp/lexbench-wheel/bin/lexbench-webfetch validate
- uv run --no-project --no-sync --python /tmp/lexbench-wheel/bin/python python -m pytest /tmp/lexbench-wheel-tests -q
+ - run: uv sync --frozen --all-packages --all-extras --python "$(command -v python)"
+ - run: make check
+ - run: make package-check
diff --git a/AGENTS.md b/AGENTS.md
index a1bac33..80232c2 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,9 +1,9 @@
# Repository guidance
-This repository owns Web Fetch task definitions, acceptance contracts, frozen input bindings and independent scoring/input tools. Keep browser/provider adapters, execution manifests, measured outputs and report renderers in the execution harness or external evidence storage.
+This repository owns the LexBench Web Retrieval benchmark family. Fetch remains the root Python package; Search lives in packages/websearch. Keep their task definitions, acceptance contracts, frozen input bindings and independent scoring/input tools with the existing topic owner. Keep browser/provider adapters, execution manifests, measured outputs and report renderers in the execution harness or external evidence storage.
Use English for code documentation and contribution guides. Keep README.md and docs/README.zh-CN.md aligned. Preserve original-language tasks, quotes and hash-bound artifacts. Keep prose concise and reader-facing.
-Run Python through `uv run --frozen python` or Make. Run `make check` after changes. Tests must cover accepted and rejected input scenarios. Preserve frozen input versions and add provenance for revisions. Never add credentials, third-party captures or run-local evidence to Git.
+Run Python through `uv run --frozen python` or Make. Run `make check` after changes, and `make package-check` for workspace, dependency or packaging changes. Both packages share the root lockfile and contribution policy. Tests must cover accepted and rejected input scenarios. Preserve frozen input versions and add provenance for revisions. Never add credentials, third-party captures or run-local evidence to Git.
All code changes go through a feature branch and pull request. Never push directly to main or merge a pull request.
diff --git a/CITATION.cff b/CITATION.cff
index a8afd45..eaf1d82 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -1,10 +1,9 @@
cff-version: 1.2.0
-message: "Cite LexBench Web Fetch and record the commit and suite used."
+message: "Cite LexBench Web Retrieval, the selected benchmark editions and original datasets."
type: software
-title: LexBench Web Fetch
+title: LexBench Web Retrieval
authors:
- - name: LexBench Web Fetch contributors
-repository-code: "https://github.com/lexmount/lexbench-webfetch"
-url: "https://github.com/lexmount/lexbench-webfetch"
+ - name: LexBench Web Retrieval contributors
+repository-code: "https://github.com/lexmount/lexbench-web-retrieval"
+url: "https://github.com/lexmount/lexbench-web-retrieval"
license: Apache-2.0
-version: 0.3.0
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ab65b0a..8c9ba38 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,16 +1,32 @@
# Contributing
-Task, reference and scoring releases follow [benchmark versions](docs/versions.md).
-Keep package releases separate from benchmark editions; a new package commit
-must not silently replace a report's frozen inputs.
+Use a feature branch and pull request. Never push directly to main or merge a PR. Explain the supported behavior, source evidence and validation in the PR.
-Task definitions and acceptance requirements belong here. Task models, acceptance scoring, file checks and compilation also belong here. Browser adapters, scheduling, reference-capture orchestration and report rendering belong in the selected execution harness. Include a task ID and a reproducible accepted/rejected example when reporting a rule problem.
+## Report a bug
-Use Python 3.11 or newer and [uv](https://docs.astral.sh/uv/). Run `uv sync --frozen`, then `make check`. Run `uv sync --frozen --extra test` to install the test tools. Tests use synthetic inputs and need no browser, network access or historical source bundle. Keep the English and Chinese READMEs aligned; other guides use English.
+Include task or dataset IDs, the package revision, a minimal command or saved input, expected behavior and actual output. Remove credentials, private URLs and captures. Report sensitive issues through [the security process](SECURITY.md).
-A task revision must explain the intended requirement, preserve the prior input version, and include scenarios that should pass and fail. Update the original dataset, catalog, public task definitions, input manifest and registry together after independent source verification. Do not regenerate old hashes to disguise an input correction. Frozen quotes retain their original language.
+## Make a change
-Keep measured outputs, captures, credentials and internal review notes outside Git. A result proposal must supply the evidence listed in the [protocol](docs/protocol.md); opening a PR does not add it to a leaderboard. See [THIRD_PARTY](THIRD_PARTY.md) before sharing source material.
+LexBench Web Retrieval owns task definitions, provenance, frozen reference bindings and provider-independent scoring for Fetch and Search. The existing Fetch package is at the repository root; Search is in `packages/websearch/`. Add new topics to the existing workspace only when they have a distinct measurement contract. [Browser Eval](https://github.com/lexmount/browser-eval) owns adapters, provider calls, credentials, measured evidence and reports. Extend the existing owner instead of copying an implementation.
+
+For a Fetch task revision, provide its task ID, intended requirement, independently observed sources and accepted/rejected scenarios. Update task definitions, catalogs, source-input manifests and registry bindings together for an explicitly requested benchmark revision. Retain prior frozen bytes.
+
+For Search tasks, supply the query, original source, provenance category, derivation and reference scope. State unknown provenance explicitly, and keep relevance labels independent of provider outputs.
+
+Test accepted and rejected behavior. Scoring or reference corrections need independent source evidence and paired controls. Preserve historical calls and verdicts; a correction creates an explicit revision. Never regenerate hashes to disguise changed frozen inputs.
+
+Write code and guides in English, and keep the English and Chinese READMEs aligned. Preserve original-language tasks, source quotations and acceptance evidence. Keep credentials, provider outputs, captures, generated reports and internal notes outside Git.
+
+## Run the checks
+
+```sh
+uv sync --frozen --all-packages --all-extras
+make check
+make package-check
+```
+
+`make check` validates both catalogs and runs both packages' behavior tests plus the Search lint and formatting checks. `make package-check` builds each package from a source archive and tests both installed wheels outside the checkout. The shared lockfile fixes the developer environment. Tests use synthetic or bundled inputs and need no provider account, browser or live website. New dependencies and runtime requirements belong in `pyproject.toml` and `uv.lock`.
## PR and commit titles
@@ -39,7 +55,7 @@ Examples:
Avoid titles such as `Fix review feedback`, `Update code` or `Misc improvements`; name the behavior or document that changes. A PR title describes the complete diff; each commit subject describes that commit. Update the PR title when its scope changes. If squash merging is used, use a subject that follows the same format. Apply this convention to new work; do not rewrite shared commits solely to rename them.
-## Score-only annotation revisions
+## Fetch annotation revisions
Keep an existing revision's bytes unchanged. Bind each new correction in
`definitions/annotation-revisions/reviews.json` to its revision hash, exact field
@@ -60,4 +76,8 @@ original input files and the revision's existing dataset identity.
## License
-Contributions use the [Apache License 2.0](LICENSE). Preserve third-party licenses, copyright notices and source attributions described in [THIRD_PARTY](THIRD_PARTY.md).
+Contributions use the [Apache License 2.0](LICENSE). Contributors retain copyright in their contributions; submitting a contribution grants the applicable license and does not transfer ownership to LexMount. Preserve existing copyright notices and third-party terms described in [THIRD_PARTY](THIRD_PARTY.md).
+
+## Versions and releases
+
+Follow [benchmark versions](docs/versions.md) for task, reference and scoring changes, and its package-version rules for CLI and API changes. Version bumps, catalog updates and release tags require an explicit human release request. Routine fixes do not relabel a frozen edition or historical report.
diff --git a/MANIFEST.in b/MANIFEST.in
index ae55a71..84c9286 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,5 +1,5 @@
include AGENTS.md CITATION.cff CONTRIBUTING.md SECURITY.md THIRD_PARTY.md provenance.json uv.lock Makefile
-recursive-include docs *.md *.svg
+recursive-include docs *.md *.svg *.cff
recursive-include tests *.py
recursive-include src/lexbench_webfetch/definitions *.json *.md
recursive-include examples *.json *.txt
diff --git a/Makefile b/Makefile
index 99bc9dd..b7c5012 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,36 @@
-.PHONY: check
-check:
- uv run --frozen lexbench-webfetch validate
- uv run --frozen --extra test python -m pytest tests -q
+UV ?= uv
+PY := $(UV) run --frozen --all-packages --all-extras python
+
+.PHONY: setup check lint test package-check
+setup:
+ $(UV) sync --frozen --all-packages --all-extras
+
+check: lint test
+ $(UV) run --frozen lexbench-webfetch validate
+ $(UV) run --frozen --package lexbench-websearch lexbench-websearch validate scenarios-v2
+ $(UV) run --frozen --package lexbench-websearch lexbench-websearch validate factual-v1
+
+lint:
+ $(UV) run --frozen --all-packages ruff check --config packages/websearch/pyproject.toml packages/websearch/src packages/websearch/tests
+ $(UV) run --frozen --all-packages ruff format --check --config packages/websearch/pyproject.toml packages/websearch/src packages/websearch/tests
+
+test:
+ $(PY) -m pytest tests -q
+ $(PY) -m pytest -c packages/websearch/pyproject.toml packages/websearch/tests -q
+
+package-check:
+ @set -eu; \
+ dist="$$(mktemp -d)"; run="$$(mktemp -d)"; \
+ trap 'rm -rf "$$dist" "$$run"' EXIT; \
+ $(UV) build --all-packages --sdist --out-dir "$$dist"; \
+ for source in "$$dist"/*.tar.gz; do $(UV) build "$$source" --wheel --out-dir "$$dist"; done; \
+ $(UV) venv "$$run/venv"; \
+ $(UV) pip install --python "$$run/venv/bin/python" "$$dist"/*.whl pytest apted rapidfuzz; \
+ cp -R tests "$$run/fetch-tests"; \
+ cp -R packages/websearch/tests "$$run/search-tests"; \
+ cd "$$run"; \
+ $(UV) run --no-project --no-sync --python "$$run/venv/bin/python" python -m pytest fetch-tests -q; \
+ $(UV) run --no-project --no-sync --python "$$run/venv/bin/python" python -m pytest search-tests -q --import-mode=importlib; \
+ "$$run/venv/bin/lexbench-webfetch" validate; \
+ "$$run/venv/bin/lexbench-websearch" validate scenarios-v2; \
+ "$$run/venv/bin/lexbench-websearch" validate factual-v1
diff --git a/README.md b/README.md
index 4b8bb6a..def10fd 100644
--- a/README.md
+++ b/README.md
@@ -1,107 +1,105 @@
-
-
-

+# LexBench Web Retrieval
**English** · [简体中文](docs/README.zh-CN.md)
-[](https://github.com/lexmount/lexbench-webfetch/actions/workflows/ci.yml)
+[](https://github.com/lexmount/lexbench-web-retrieval/actions/workflows/ci.yml)
[](LICENSE)
[](pyproject.toml)
-[Tasks](#task-suites) · [Quickstart](#quickstart) · [Scoring](#score-an-answer) · [Versions](#versions) · [Related projects](#related-repositories) · [Contributing](CONTRIBUTING.md)
+[Benchmarks](#benchmarks) · [Quickstart](#quickstart) · [Scoring](#scoring) · [Versions](#versions) · [Contributing](CONTRIBUTING.md)
-
+LexBench Web Retrieval is a benchmark family for finding web sources and retrieving their content. It brings Web Fetch and Web Search into one repository, with shared development tools, contribution rules and licensing. Each benchmark keeps its own tasks, scoring, Python package and frozen editions.
-LexBench Web Fetch defines 550 Web Fetch tasks and scores returned page text, records with usable links, resources and files. Use the tasks with your own runner or [Browser Eval](https://github.com/lexmount/browser-eval) to compare browsers, extraction tools and hosted services.
+[Browser Eval](https://github.com/lexmount/browser-eval) is the execution harness: it calls browsers and services, records timing and billing, saves evidence and builds reports. This repository supplies tasks, references and provider-independent scoring.
-This repository owns the task definitions, acceptance rules and frozen input bindings. Browser Eval owns provider calls, timing, evidence and comparison reports.
+## Benchmarks
-## Task suites
+| Benchmark | Package / import | Tasks and scoring | Guide |
+| --- | --- | --- | --- |
+| Web Fetch | `lexbench-webfetch` / `lexbench_webfetch` | 550 entries across page text, dynamic content, popular sites, access restrictions and articles; deterministic acceptance scoring | [Fetch guide](docs/webfetch.md) |
+| Web Search | `lexbench-websearch` / `lexbench_websearch` | 149 scenario queries and 831 SimpleQA Verified retrieval probes; relevance, ranking and source diagnostics | [Search guide](packages/websearch/README.md) |
-| Suite | Tasks | Scope |
-| --- | ---: | --- |
-| `webfetch` | 150 | Web pages, documents, images, video and challenge pages |
-| `dynamic-content` | 100 | Content and records loaded after the initial response |
-| `popular-sites` | 100 | Content on widely used websites |
-| `access-restrictions` | 100 | URLs with previously observed access restrictions |
-| `articles` | 100 | Article bodies, initial comments and post collections |
+The Search catalog retains two alternative snapshots of the same 149 scenario queries. Select one snapshot; do not count them as separate populations. Fetch and Search have different units and acceptance rules, so their results remain separate.
-The catalog contains 550 task entries across five suites. Public definitions include task instructions and acceptance rules; complete frozen reference inputs must be obtained separately. See [data and access](docs/data.md) and [article requirements](src/lexbench_webfetch/definitions/evaluation/articles/README.md).
+Content scraping and extraction currently belong to Web Fetch. Add another benchmark only when it has a distinct input/output contract and acceptance target. WebArena, WebMainBench, WCXB and [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) remain separate benchmarks used by the harness.
## Quickstart
Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
```sh
-git clone https://github.com/lexmount/lexbench-webfetch.git
-cd lexbench-webfetch
-uv sync --frozen
+git clone https://github.com/lexmount/lexbench-web-retrieval.git
+cd lexbench-web-retrieval
+uv sync --frozen --all-packages --all-extras
uv run --frozen lexbench-webfetch list
uv run --frozen lexbench-webfetch validate
+uv run --frozen --package lexbench-websearch lexbench-websearch list
+uv run --frozen --package lexbench-websearch lexbench-websearch validate scenarios-v2
+uv run --frozen --package lexbench-websearch lexbench-websearch validate factual-v1
```
-These commands check the bundled definitions offline, without a browser or API key.
+The commands inspect bundled definitions offline, without browsers or API credentials. Full Fetch reference captures require separately obtained, hash-matching inputs; see [Fetch data access](docs/data.md). Search definitions and attribution are bundled; see [Search sources](packages/websearch/docs/data.md).
-To export a suite, obtain the frozen files listed in its input manifest and run:
+The workspace shares one `uv.lock`. Fetch remains the root package; Search lives in `packages/websearch/`. Either package can be built and installed alone. Pin a full commit when integrating:
```sh
-uv run --frozen lexbench-webfetch export \
- --suite webfetch --source /absolute/path/approved-inputs \
- --output /absolute/path/new-input-directory
+uv add 'lexbench-webfetch @ git+https://github.com/lexmount/lexbench-web-retrieval.git@'
+uv add 'lexbench-websearch @ git+https://github.com/lexmount/lexbench-web-retrieval.git@#subdirectory=packages/websearch'
```
-Export verifies the input hashes and writes the declared files to a new directory. Full reference captures are not distributed in this repository; there is currently no public input bundle. The [data guide](docs/data.md) describes required files and access.
-
-## Score an answer
+## Scoring
-Try an accepted and a rejected saved response:
+Try accepted and rejected Fetch responses, then successful and unsuccessful Search rankings:
```sh
uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/answer.txt
uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/missing.txt
+uv run --frozen --package lexbench-websearch lexbench-websearch score packages/websearch/examples/relevant.json
+uv run --frozen --package lexbench-websearch lexbench-websearch score packages/websearch/examples/missing.json
```
-For real evaluations, use the complete task from a verified dataset. Add `--metadata metadata.json` for structured response fields, or `--file /absolute/path/file` for delivered files. Scoring requirements and result reporting are described in the [evaluation protocol](docs/protocol.md).
-
-## Run browsers and build reports
+Fetch returns `passed=true` and `passed=false`; Search returns `success=1` and `success=0`. Search examples use supplied relevance labels. These commands score saved inputs and make no provider calls. The [Fetch protocol](docs/protocol.md) and [Search protocol](packages/websearch/docs/evaluation.md) define the metrics and required references.
-Follow the [Browser Eval integration guide](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md) to run exported tasks against browsers or services and build comparison reports. Provider accounts, API keys and measured outputs belong to the execution environment. The commands above validate and score saved inputs without calling providers.
+For browser or service execution and reports, use [Browser Eval](https://github.com/lexmount/browser-eval). Package upgrades and repository moves do not change historical calls or select a new benchmark edition.
## Versions
-The current full catalog is benchmark edition `2.0.1` (`bench-v2.0.1`), with 550 entries. The Python tooling package is `0.3.0`. These versions identify different things: the edition fixes tasks, references and scoring; the package versions the commands and Python implementation.
+Software packages, benchmark editions and hosted reports have separate identities. Fetch tooling is `0.3.0`, with catalog edition `2.0.1`; Search tooling is `0.1.0`, with catalog edition `1.0.0`. This workspace import changes none of those versions or frozen bindings.
-Run `uv run --frozen lexbench-webfetch version` to verify the installed catalog. Use `release` to freeze the exact selected tasks and scorer in `benchmark-release.json`, and `compare-releases` to check whether results can be compared directly, need rescoring or belong to separate populations. Installing a newer package leaves an existing report's edition unchanged. See [versioning](docs/versions.md) for commands and change rules.
+Follow the shared [version rules](docs/versions.md). Each topic retains its own editions. New Git release tags use a topic namespace to avoid collisions; existing tags remain immutable. Version bumps, catalog updates and tags require an explicit release request.
## Related repositories
| Repository | Role |
| --- | --- |
-| [Browser Eval](https://github.com/lexmount/browser-eval) | Browser/provider execution, saved evidence and comparison reports |
-| [LexBench Web Search](https://github.com/lexmount/lexbench-websearch) | Search queries, source references and retrieval scoring |
-| [Moli](https://github.com/lexmount/moli) | Browser that can be evaluated with these tasks |
-| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | CLI client for the Lexmount WebFetch service |
-| [Artifact Site](https://github.com/lexmount/artifact-site) | Hosting, versioning and sharing of generated reports |
-| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | Protocol, automation-driver and web-platform benchmarks |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | Evaluation harness for Search, Fetch, trajectory replay and Browser Use |
+| [Moli](https://github.com/lexmount/moli) | Browser evaluated by the companion harness |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | Client for the Lexmount WebFetch service |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | Report hosting, versions and access controls |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | Protocol, driver and web-platform benchmarks |
-[Third-party notices](THIRD_PARTY.md) list scoring dependencies and source rights. WebMainBench, WCXB and WebArena are separate benchmarks; they are not part of this 550-entry catalog.
+Project-owned code uses [Apache 2.0](LICENSE). Existing copyright notices and earlier MIT grants remain in effect. Search's bundled MIT datasets retain their [upstream notices](packages/websearch/src/lexbench_websearch/definitions/NOTICE.txt). See [third-party terms](THIRD_PARTY.md) and [security](SECURITY.md).
## Contribute
-Read [CONTRIBUTING](CONTRIBUTING.md) before changing task requirements or scoring. Run `make check` to validate definitions and tests.
+One [contribution guide](CONTRIBUTING.md) covers both packages:
+
+```sh
+make check
+make package-check
+```
-[Security](SECURITY.md) · [Third-party content](THIRD_PARTY.md) · [Apache 2.0](LICENSE)
+The checks validate both catalogs, run behavior tests and test source-archive-to-wheel installations outside the checkout. Measured outputs, captures, private reviews and provider credentials stay outside Git.
-## Cite LexBench Web Fetch
+## Cite LexBench Web Retrieval
-Use this citation or [CITATION.cff](CITATION.cff), and record the benchmark edition, suites and code revision used. The citation below identifies the tooling package; the catalog edition is `2.0.1`.
+Use [CITATION.cff](CITATION.cff), and record the exact commit and selected benchmark editions. The [Fetch](docs/webfetch.cff) and [Search](packages/websearch/CITATION.cff) citations identify their individual tooling packages. Cite original datasets separately when using their material.
```bibtex
-@software{lexbench_webfetch_2026,
- author = {{LexBench Web Fetch contributors}},
- title = {LexBench Web Fetch},
+@software{lexbench_web_retrieval_2026,
+ author = {{LexBench Web Retrieval contributors}},
+ title = {LexBench Web Retrieval},
year = {2026},
- version = {0.3.0},
- url = {https://github.com/lexmount/lexbench-webfetch}
+ url = {https://github.com/lexmount/lexbench-web-retrieval}
}
```
diff --git a/SECURITY.md b/SECURITY.md
index 241d232..6e84a73 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,4 +2,4 @@
Do not post credentials, cookies, private URLs or raw private captures in public issues. Use GitHub private vulnerability reporting for this repository when available; otherwise contact the repository owner through their GitHub profile before sharing sensitive details.
-Treat task URLs and external input files as untrusted. The input tools verify local files and perform no website requests. Run retrieval systems with appropriate isolation and account limits. A matching hash establishes identity, not safety or permission to redistribute a file.
+Treat task URLs and external input files as untrusted. Both benchmark packages inspect or score local files without calling providers. The input tools verify local files and perform no website requests. Run retrieval systems with appropriate isolation and account limits. A matching hash establishes identity, not safety or permission to redistribute a file.
diff --git a/THIRD_PARTY.md b/THIRD_PARTY.md
index 8738a6e..278814d 100644
--- a/THIRD_PARTY.md
+++ b/THIRD_PARTY.md
@@ -18,3 +18,7 @@ Exact versions and resolved hashes are in `pyproject.toml` and `uv.lock`.
| [RapidFuzz](https://github.com/rapidfuzz/RapidFuzz) | Optional text matching | MIT |
These libraries retain their own licenses. Installing the `tree` extra enables the optional scoring dependencies.
+
+## Search package
+
+The Search package retains its [upstream data notices](packages/websearch/src/lexbench_websearch/definitions/NOTICE.txt), [source inventory](packages/websearch/THIRD_PARTY.md) and [earlier project MIT grant](packages/websearch/LICENSES/Project-MIT.txt). Project-wide Apache-2.0 licensing does not replace these MIT grants or the terms of community sources. Both source archives and wheels must include their applicable notices.
diff --git a/docs/README.zh-CN.md b/docs/README.zh-CN.md
index afbb4e0..6a6dab1 100644
--- a/docs/README.zh-CN.md
+++ b/docs/README.zh-CN.md
@@ -1,107 +1,105 @@
-
-
-

+# LexBench Web Retrieval
[English](../README.md) · **简体中文**
-[](https://github.com/lexmount/lexbench-webfetch/actions/workflows/ci.yml)
+[](https://github.com/lexmount/lexbench-web-retrieval/actions/workflows/ci.yml)
[](../LICENSE)
[](../pyproject.toml)
-[任务集](#任务集) · [快速开始](#快速开始) · [评分](#给响应评分) · [版本](#版本) · [相关仓库](#相关仓库) · [参与贡献](../CONTRIBUTING.md)
+[评测集](#评测集) · [快速开始](#快速开始) · [评分](#评分) · [版本](#版本) · [参与贡献](../CONTRIBUTING.md)
-
+LexBench Web Retrieval 是网页检索与内容获取的评测家族。Web Fetch 和 Web Search 共用一个仓库、开发工具、贡献规则和授权规范,各自保留题目、评分、Python 包和冻结的评测版本。
-LexBench Web Fetch 定义了 550 条网页获取任务,评测返回的正文、带有效链接的记录、资源和文件。可以用自己的运行器,也可以接入 [Browser Eval](https://github.com/lexmount/browser-eval),比较浏览器、提取工具和在线服务。
+[Browser Eval](https://github.com/lexmount/browser-eval) 是运行评测的脚手架,负责调用浏览器和服务、记录耗时与计费、保存证据并生成报告。本仓库提供题目、参考和不依赖服务商的评分规则。
-本仓库维护题目、验收规则和冻结输入绑定。Browser Eval 负责服务调用、计时、证据保存和对比报告。
+## 评测集
-## 任务集
+| 评测主题 | 包名 / Python 导入名 | 题目与评分 | 使用指南 |
+| --- | --- | --- | --- |
+| Web Fetch | `lexbench-webfetch` / `lexbench_webfetch` | 正文、动态内容、常用网站、访问限制和文章共 550 条任务,按任务规则验收 | [Fetch 指南](webfetch.zh-CN.md) |
+| Web Search | `lexbench-websearch` / `lexbench_websearch` | 149 个场景问题和 831 条 SimpleQA Verified 检索任务,评测相关性、排序和来源命中 | [Search 指南](../packages/websearch/docs/README.zh-CN.md) |
-| 任务集 | 题数 | 范围 |
-| --- | ---: | --- |
-| `webfetch` | 150 | 网页、文档、图片、视频和挑战页 |
-| `dynamic-content` | 100 | 初始响应之后加载的内容和记录 |
-| `popular-sites` | 100 | 常用网站的内容 |
-| `access-restrictions` | 100 | 曾观察到访问限制的 URL |
-| `articles` | 100 | 文章正文、初始评论和帖子列表 |
+Search 题库保留同一批 149 个场景问题的两个版本,每次选择一个,不应叠加题数。Fetch 与 Search 的任务单位和验收规则不同,结果分别报告。
-题库共五个任务集、550 条题目。公开定义包含任务说明和验收规则,完整冻结参考输入需另行获取。详见[数据与获取方式](../docs/data.md)和[文章验收要求](../src/lexbench_webfetch/definitions/evaluation/articles/README.md)。
+内容抓取和提取目前归入 Web Fetch。只有输入、输出和验收目标明确不同,才增加新的 benchmark。WebArena、WebMainBench、WCXB 和 [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) 仍是脚手架使用的独立评测集。
## 快速开始
安装 [uv](https://docs.astral.sh/uv/getting-started/installation/),然后运行:
```sh
-git clone https://github.com/lexmount/lexbench-webfetch.git
-cd lexbench-webfetch
-uv sync --frozen
+git clone https://github.com/lexmount/lexbench-web-retrieval.git
+cd lexbench-web-retrieval
+uv sync --frozen --all-packages --all-extras
uv run --frozen lexbench-webfetch list
uv run --frozen lexbench-webfetch validate
+uv run --frozen --package lexbench-websearch lexbench-websearch list
+uv run --frozen --package lexbench-websearch lexbench-websearch validate scenarios-v2
+uv run --frozen --package lexbench-websearch lexbench-websearch validate factual-v1
```
-这些命令离线检查仓库自带的定义,无需浏览器或 API 密钥。
+这些命令离线检查仓库自带的定义,不需要浏览器或 API 凭据。Fetch 的完整参考快照需另行获取,并与清单哈希匹配,详见[数据获取](data.md)。Search 随包提供题目定义和引用,详见[来源说明](../packages/websearch/docs/data.md)。
-导出任务集前,先获取其输入清单列出的冻结文件,再运行:
+工作区共用一个 `uv.lock`。Fetch 保留在仓库根目录,Search 位于 `packages/websearch/`;两个包都能单独构建和安装。其他项目接入时固定完整提交:
```sh
-uv run --frozen lexbench-webfetch export \
- --suite webfetch --source /absolute/path/approved-inputs \
- --output /absolute/path/new-input-directory
+uv add 'lexbench-webfetch @ git+https://github.com/lexmount/lexbench-web-retrieval.git@'
+uv add 'lexbench-websearch @ git+https://github.com/lexmount/lexbench-web-retrieval.git@#subdirectory=packages/websearch'
```
-导出会验证输入哈希,将清单中的文件写入新目录。仓库不分发完整参考快照,目前也没有公开输入包。所需文件和获取条件见[数据指南](../docs/data.md)。
-
-## 给响应评分
+## 评分
-用一个应通过和一个应失败的示例试跑:
+分别尝试应通过和应失败的 Fetch 响应,以及找到、漏掉有效结果的 Search 排序:
```sh
uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/answer.txt
uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/missing.txt
+uv run --frozen --package lexbench-websearch lexbench-websearch score packages/websearch/examples/relevant.json
+uv run --frozen --package lexbench-websearch lexbench-websearch score packages/websearch/examples/missing.json
```
-实际评测应使用经过验证的数据集中的完整任务。结构化响应字段通过 `--metadata metadata.json` 传入,交付文件通过 `--file /absolute/path/file` 传入。评分要求和结果发布规则见[评测协议](../docs/protocol.md)。
-
-## 运行浏览器并生成报告
+Fetch 分别返回 `passed=true`、`passed=false`;Search 分别返回 `success=1`、`success=0`,其中相关性标签由示例提供。这些命令只给已保存的输入评分,不调用服务。[Fetch 协议](protocol.md)和 [Search 协议](../packages/websearch/docs/evaluation.md)说明指标和参考要求。
-按 [Browser Eval 接入指南](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md)执行导出的任务,调用浏览器或在线服务,生成对比报告。服务账号、API 密钥和实测输出由运行环境管理。上面的命令只检查输入、给已保存的响应评分,不调用服务。
+实际调用浏览器、在线服务和生成报告,请使用 [Browser Eval](https://github.com/lexmount/browser-eval)。升级工具包或迁移仓库不会改变历史调用,也不会替报告改选评测版本。
## 版本
-当前完整题库的评测版本为 `2.0.1`(`bench-v2.0.1`),共 550 条题目;Python 工具包版本为 `0.3.0`。评测版本固定题目、参考输入和评分规则,工具包版本标识命令与 Python 实现。
+工具包、评测集和托管报告分别记录版本。Fetch 工具包为 `0.3.0`,题库评测版本为 `2.0.1`;Search 工具包为 `0.1.0`,题库评测版本为 `1.0.0`。本次工作区导入不改变这些版本或冻结绑定。
-运行 `uv run --frozen lexbench-webfetch version` 验证安装的题库。用 `release` 将实际选用的题目和评分器固定在 `benchmark-release.json` 中,用 `compare-releases` 判断结果能直接比较、需要重算评分,还是属于不同题目范围。升级包不会替换已有报告的评测版本。命令和版本变更规则见[版本说明](../docs/versions.md)。
+版本变更遵循[共用规则](versions.md),每个主题独立维护评测版本。新的 Git 发布标签按主题分开命名,避免冲突;旧标签保持不变。版本升级、题库发布和创建标签都需要明确的发布指令。
## 相关仓库
| 仓库 | 用途 |
| --- | --- |
-| [Browser Eval](https://github.com/lexmount/browser-eval) | 运行浏览器与服务、保存证据、生成对比报告 |
-| [LexBench Web Search](https://github.com/lexmount/lexbench-websearch) | 搜索问题、来源参考和检索评分 |
-| [Moli](https://github.com/lexmount/moli) | 可使用本题库评测的浏览器 |
-| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | Lexmount WebFetch 服务的命令行客户端 |
-| [Artifact Site](https://github.com/lexmount/artifact-site) | 报告托管、版本管理和分享 |
-| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | 协议、自动化驱动和 Web 平台评测 |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | Search、Fetch、轨迹重放和 Browser Use 的评测脚手架 |
+| [Moli](https://github.com/lexmount/moli) | 由配套脚手架评测的浏览器 |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | Lexmount WebFetch 服务的客户端 |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | 报告托管、版本管理和访问权限 |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | 协议、驱动和 Web 平台评测 |
-评分依赖和来源权利见[第三方说明](../THIRD_PARTY.md)。WebMainBench、WCXB 和 WebArena 是独立评测集,不计入这里的 550 条题目。
+项目自有代码使用 [Apache 2.0](../LICENSE),已有版权声明和早先的 MIT 授权继续保留。Search 随包提供的 MIT 数据保留[上游声明](../packages/websearch/src/lexbench_websearch/definitions/NOTICE.txt)。另见[第三方条款](../THIRD_PARTY.md)和[安全说明](../SECURITY.md)。
## 参与贡献
-修改任务要求或评分前,请阅读 [CONTRIBUTING](../CONTRIBUTING.md)。运行 `make check` 检查定义和测试。
+两个包共用[贡献指南](../CONTRIBUTING.md):
+
+```sh
+make check
+make package-check
+```
-[安全](../SECURITY.md) · [第三方内容](../THIRD_PARTY.md) · [Apache 2.0](../LICENSE)
+检查覆盖两套题目定义、行为测试,以及在仓库外从源码包构建并安装 wheel 的流程。实测输出、页面快照、私有审查和服务凭据保存在 Git 之外。
-## 引用 LexBench Web Fetch
+## 引用 LexBench Web Retrieval
-使用以下引用或 [CITATION.cff](../CITATION.cff),并注明评测版本、任务集和代码版本。以下引用标识工具包版本,题库评测版本为 `2.0.1`。
+使用 [CITATION.cff](../CITATION.cff),并注明确切提交及所选评测版本。[Fetch](webfetch.cff) 和 [Search](../packages/websearch/CITATION.cff) 的引用分别标识各自工具包。使用原始数据时也请单独引用其来源。
```bibtex
-@software{lexbench_webfetch_2026,
- author = {{LexBench Web Fetch contributors}},
- title = {LexBench Web Fetch},
+@software{lexbench_web_retrieval_2026,
+ author = {{LexBench Web Retrieval contributors}},
+ title = {LexBench Web Retrieval},
year = {2026},
- version = {0.3.0},
- url = {https://github.com/lexmount/lexbench-webfetch}
+ url = {https://github.com/lexmount/lexbench-web-retrieval}
}
```
diff --git a/docs/versions.md b/docs/versions.md
index 01ccb6e..be5f032 100644
--- a/docs/versions.md
+++ b/docs/versions.md
@@ -10,12 +10,9 @@ such as `bench-v2.0.1` gives a released commit a durable name; never move
or overwrite a published release tag. A tag alone does not identify external
reference bytes or a report's selected task population.
-Create `bench-vMAJOR.MINOR.PATCH` tags only in this benchmark repository.
-Browser Eval publishes software versions as `vMAJOR.MINOR.PATCH` and records the
-full Git commit for execution and report-building code.
-A report names the benchmark edition it uses, and the hosting platform's
-immutable version ID identifies each published build. Retain benchmark tags
-needed by published reports; do not create report, date or review-checkpoint tags.
+Both packages use the same benchmark version rules below. They keep independent edition numbers: there is no combined Fetch-plus-Search score or benchmark edition. Tooling packages follow Semantic Versioning independently of their measurement contracts.
+
+New family Git tags use `/`, where `` is the unchanged tag recorded in that topic's release sidecar. For example, Fetch's local `bench-v2.0.1` label and Search's local `bench-1.0.0` label occupy different namespaces. Existing bare tags and frozen JSON bindings stay unchanged. A tooling-only source release uses `-vMAJOR.MINOR.PATCH`. No tag is created by routine development.
| Change | Version | Comparing results |
| --- | --- | --- |
@@ -30,6 +27,14 @@ population and request differences; maintainers still review whether a rule
change preserves the intended task. Existing annotation revisions retain
their independent source evidence and executable correction controls.
+## Package versions and release approval
+
+Package versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html): compatible fixes use a patch, compatible CLI or Python API additions use a minor, and incompatible public interfaces use a major. While a package remains `0.x`, use a minor for new functionality or breaking changes and a patch for compatible fixes. Document migrations explicitly.
+
+The package version, benchmark edition and hosted report version are independent. The family uses topic-scoped Git tags as described above. Browser Eval uses software tags, since it owns execution and reporting rather than a benchmark catalog. A change to task population can require a major benchmark edition while its software support remains backward compatible. Each repository keeps its own version number and release schedule.
+
+Version changes and tags require an explicit human release request. Documentation edits, routine fixes, synchronization and report rebuilds do not automatically bump versions or rewrite a frozen catalog. Release from a reviewed, merged commit after code, catalog and installed-package checks pass. Preserve all existing tags and exact bindings; a readable tag is not a substitute for input or scorer hashes.
+
## Freeze an edition
`lexbench-webfetch version` verifies the installed catalog's complete suite list,
diff --git a/docs/webfetch.cff b/docs/webfetch.cff
new file mode 100644
index 0000000..84e2889
--- /dev/null
+++ b/docs/webfetch.cff
@@ -0,0 +1,10 @@
+cff-version: 1.2.0
+message: "Cite LexBench Web Fetch and record the commit and suite used."
+type: software
+title: LexBench Web Fetch
+authors:
+ - name: LexBench Web Fetch contributors
+repository-code: "https://github.com/lexmount/lexbench-web-retrieval"
+url: "https://github.com/lexmount/lexbench-web-retrieval"
+license: Apache-2.0
+version: 0.3.0
diff --git a/docs/webfetch.md b/docs/webfetch.md
new file mode 100644
index 0000000..6f36f3f
--- /dev/null
+++ b/docs/webfetch.md
@@ -0,0 +1,109 @@
+
+
+

+
+**English** · [简体中文](webfetch.zh-CN.md)
+
+[](https://github.com/lexmount/lexbench-webfetch/actions/workflows/ci.yml)
+[](../LICENSE)
+[](../pyproject.toml)
+
+[Tasks](#task-suites) · [Quickstart](#quickstart) · [Scoring](#scoring) · [Versions](#versions) · [Related projects](#related-repositories) · [Contributing](../CONTRIBUTING.md)
+
+
+
+LexBench Web Fetch defines 550 Web Fetch tasks and scores returned page text, records with usable links, resources and files. Use the tasks with your own runner or [Browser Eval](https://github.com/lexmount/browser-eval) to compare browsers, extraction tools and hosted services.
+
+This repository owns the task definitions, acceptance rules and frozen input bindings. Browser Eval owns provider calls, timing, evidence and comparison reports.
+
+## Task suites
+
+| Suite | Tasks | Scope |
+| --- | ---: | --- |
+| `webfetch` | 150 | Web pages, documents, images, video and challenge pages |
+| `dynamic-content` | 100 | Content and records loaded after the initial response |
+| `popular-sites` | 100 | Content on widely used websites |
+| `access-restrictions` | 100 | URLs with previously observed access restrictions |
+| `articles` | 100 | Article bodies, initial comments and post collections |
+
+The catalog contains 550 task entries across five suites. Public definitions include task instructions and acceptance rules; complete frozen reference inputs must be obtained separately. See [data and access](../docs/data.md) and [article requirements](../src/lexbench_webfetch/definitions/evaluation/articles/README.md).
+
+## Quickstart
+
+Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
+
+```sh
+git clone https://github.com/lexmount/lexbench-web-retrieval.git
+cd lexbench-web-retrieval
+uv sync --frozen --all-packages --all-extras
+uv run --frozen lexbench-webfetch list
+uv run --frozen lexbench-webfetch validate
+```
+
+These commands check the bundled definitions offline, without a browser or API key.
+
+To export a suite, obtain the frozen files listed in its input manifest and run:
+
+```sh
+uv run --frozen lexbench-webfetch export \
+ --suite webfetch --source /absolute/path/approved-inputs \
+ --output /absolute/path/new-input-directory
+```
+
+Export verifies the input hashes and writes the declared files to a new directory. Full reference captures are not distributed in this repository; there is currently no public input bundle. The [data guide](../docs/data.md) describes required files and access.
+
+## Scoring
+
+Try an accepted and a rejected saved response:
+
+```sh
+uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/answer.txt
+uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/missing.txt
+```
+
+For real evaluations, use the complete task from a verified dataset. Add `--metadata metadata.json` for structured response fields, or `--file /absolute/path/file` for delivered files. Scoring requirements and result reporting are described in the [evaluation protocol](../docs/protocol.md).
+
+## Run browsers and build reports
+
+Follow the [Browser Eval integration guide](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md) to run exported tasks against browsers or services and build comparison reports. Provider accounts, API keys and measured outputs belong to the execution environment. The commands above validate and score saved inputs without calling providers.
+
+## Versions
+
+The current full catalog is benchmark edition `2.0.1` (`bench-v2.0.1`), with 550 entries. The Python tooling package is `0.3.0`. These versions identify different things: the edition fixes tasks, references and scoring; the package versions the commands and Python implementation.
+
+Run `uv run --frozen lexbench-webfetch version` to verify the installed catalog. Use `release` to freeze the exact selected tasks and scorer in `benchmark-release.json`, and `compare-releases` to check whether results can be compared directly, need rescoring or belong to separate populations. Installing a newer package leaves an existing report's edition unchanged. See [versioning](../docs/versions.md) for commands and change rules.
+
+Git releases follow the family's topic-scoped tag policy; frozen edition labels remain unchanged. Version changes and tags require an explicit release request.
+
+## Related repositories
+
+| Repository | Role |
+| --- | --- |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | Browser/provider execution, saved evidence and comparison reports |
+| [LexBench Web Search](https://github.com/lexmount/lexbench-websearch) | Search queries, source references and retrieval scoring |
+| [Moli](https://github.com/lexmount/moli) | Browser that can be evaluated with these tasks |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | CLI client for the Lexmount WebFetch service |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | Hosting, versioning and sharing of generated reports |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | Protocol, automation-driver and web-platform benchmarks |
+
+[Third-party notices](../THIRD_PARTY.md) list scoring dependencies and source rights. WebMainBench, WCXB and WebArena are separate benchmarks; they are not part of this 550-entry catalog.
+
+## Contribute
+
+Read [CONTRIBUTING](../CONTRIBUTING.md) before changing task requirements or scoring. Run `make check` to validate definitions and tests.
+
+[Security](../SECURITY.md) · [Third-party content](../THIRD_PARTY.md) · [Apache 2.0](../LICENSE)
+
+## Cite LexBench Web Fetch
+
+Use this citation or [CITATION.cff](webfetch.cff), and record the benchmark edition, suites and code revision used. The citation below identifies the tooling package; the catalog edition is `2.0.1`.
+
+```bibtex
+@software{lexbench_webfetch_2026,
+ author = {{LexBench Web Fetch contributors}},
+ title = {LexBench Web Fetch},
+ year = {2026},
+ version = {0.3.0},
+ url = {https://github.com/lexmount/lexbench-webfetch}
+}
+```
diff --git a/docs/webfetch.zh-CN.md b/docs/webfetch.zh-CN.md
new file mode 100644
index 0000000..b6e743f
--- /dev/null
+++ b/docs/webfetch.zh-CN.md
@@ -0,0 +1,109 @@
+
+
+

+
+[English](webfetch.md) · **简体中文**
+
+[](https://github.com/lexmount/lexbench-webfetch/actions/workflows/ci.yml)
+[](../LICENSE)
+[](../pyproject.toml)
+
+[任务集](#任务集) · [快速开始](#快速开始) · [评分](#评分) · [版本](#版本) · [相关仓库](#相关仓库) · [参与贡献](../CONTRIBUTING.md)
+
+
+
+LexBench Web Fetch 定义了 550 条网页获取任务,评测返回的正文、带有效链接的记录、资源和文件。可以用自己的运行器,也可以接入 [Browser Eval](https://github.com/lexmount/browser-eval),比较浏览器、提取工具和在线服务。
+
+本仓库维护题目、验收规则和冻结输入绑定。Browser Eval 负责服务调用、计时、证据保存和对比报告。
+
+## 任务集
+
+| 任务集 | 题数 | 范围 |
+| --- | ---: | --- |
+| `webfetch` | 150 | 网页、文档、图片、视频和挑战页 |
+| `dynamic-content` | 100 | 初始响应之后加载的内容和记录 |
+| `popular-sites` | 100 | 常用网站的内容 |
+| `access-restrictions` | 100 | 曾观察到访问限制的 URL |
+| `articles` | 100 | 文章正文、初始评论和帖子列表 |
+
+题库共五个任务集、550 条题目。公开定义包含任务说明和验收规则,完整冻结参考输入需另行获取。详见[数据与获取方式](../docs/data.md)和[文章验收要求](../src/lexbench_webfetch/definitions/evaluation/articles/README.md)。
+
+## 快速开始
+
+安装 [uv](https://docs.astral.sh/uv/getting-started/installation/),然后运行:
+
+```sh
+git clone https://github.com/lexmount/lexbench-web-retrieval.git
+cd lexbench-web-retrieval
+uv sync --frozen --all-packages --all-extras
+uv run --frozen lexbench-webfetch list
+uv run --frozen lexbench-webfetch validate
+```
+
+这些命令离线检查仓库自带的定义,无需浏览器或 API 密钥。
+
+导出任务集前,先获取其输入清单列出的冻结文件,再运行:
+
+```sh
+uv run --frozen lexbench-webfetch export \
+ --suite webfetch --source /absolute/path/approved-inputs \
+ --output /absolute/path/new-input-directory
+```
+
+导出会验证输入哈希,将清单中的文件写入新目录。仓库不分发完整参考快照,目前也没有公开输入包。所需文件和获取条件见[数据指南](../docs/data.md)。
+
+## 评分
+
+用一个应通过和一个应失败的示例试跑:
+
+```sh
+uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/answer.txt
+uv run --frozen lexbench-webfetch score --task examples/task.json --response examples/missing.txt
+```
+
+实际评测应使用经过验证的数据集中的完整任务。结构化响应字段通过 `--metadata metadata.json` 传入,交付文件通过 `--file /absolute/path/file` 传入。评分要求和结果发布规则见[评测协议](../docs/protocol.md)。
+
+## 运行浏览器并生成报告
+
+按 [Browser Eval 接入指南](https://github.com/lexmount/browser-eval/blob/main/docs/benchmarks.md)执行导出的任务,调用浏览器或在线服务,生成对比报告。服务账号、API 密钥和实测输出由运行环境管理。上面的命令只检查输入、给已保存的响应评分,不调用服务。
+
+## 版本
+
+当前完整题库的评测版本为 `2.0.1`(`bench-v2.0.1`),共 550 条题目;Python 工具包版本为 `0.3.0`。评测版本固定题目、参考输入和评分规则,工具包版本标识命令与 Python 实现。
+
+运行 `uv run --frozen lexbench-webfetch version` 验证安装的题库。用 `release` 将实际选用的题目和评分器固定在 `benchmark-release.json` 中,用 `compare-releases` 判断结果能直接比较、需要重算评分,还是属于不同题目范围。升级包不会替换已有报告的评测版本。命令和版本变更规则见[版本说明](../docs/versions.md)。
+
+Git 发布遵循家族的主题标签规则,冻结的评测版本标识保持不变。变更版本和创建标签都需要明确的发布指令。
+
+## 相关仓库
+
+| 仓库 | 用途 |
+| --- | --- |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | 运行浏览器与服务、保存证据、生成对比报告 |
+| [LexBench Web Search](https://github.com/lexmount/lexbench-websearch) | 搜索问题、来源参考和检索评分 |
+| [Moli](https://github.com/lexmount/moli) | 可使用本题库评测的浏览器 |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | Lexmount WebFetch 服务的命令行客户端 |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | 报告托管、版本管理和分享 |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | 协议、自动化驱动和 Web 平台评测 |
+
+评分依赖和来源权利见[第三方说明](../THIRD_PARTY.md)。WebMainBench、WCXB 和 WebArena 是独立评测集,不计入这里的 550 条题目。
+
+## 参与贡献
+
+修改任务要求或评分前,请阅读 [CONTRIBUTING](../CONTRIBUTING.md)。运行 `make check` 检查定义和测试。
+
+[安全](../SECURITY.md) · [第三方内容](../THIRD_PARTY.md) · [Apache 2.0](../LICENSE)
+
+## 引用 LexBench Web Fetch
+
+使用以下引用或 [CITATION.cff](../CITATION.cff),并注明评测版本、任务集和代码版本。以下引用标识工具包版本,题库评测版本为 `2.0.1`。
+
+```bibtex
+@software{lexbench_webfetch_2026,
+ author = {{LexBench Web Fetch contributors}},
+ title = {LexBench Web Fetch},
+ year = {2026},
+ version = {0.3.0},
+ url = {https://github.com/lexmount/lexbench-webfetch}
+}
+```
diff --git a/packages/websearch/CITATION.cff b/packages/websearch/CITATION.cff
new file mode 100644
index 0000000..0ae939e
--- /dev/null
+++ b/packages/websearch/CITATION.cff
@@ -0,0 +1,25 @@
+cff-version: 1.2.0
+message: "Please cite LexBench Web Search and the upstream datasets used in your evaluation."
+title: "LexBench Web Search"
+type: software
+version: 0.1.0
+authors:
+ - name: LexBench Web Search contributors
+repository-code: "https://github.com/lexmount/lexbench-web-retrieval"
+url: "https://github.com/lexmount/lexbench-web-retrieval"
+license: Apache-2.0
+references:
+ - type: article
+ title: "SimpleQA Verified: A Reliable Factuality Benchmark to Measure Parametric Knowledge"
+ authors:
+ - family-names: Haas
+ given-names: Lukas
+ identifiers:
+ - type: other
+ value: "arXiv:2509.07968"
+ url: "https://arxiv.org/abs/2509.07968"
+ - type: software
+ title: "websearch-bench"
+ authors:
+ - name: Microck
+ repository-code: "https://github.com/Microck/websearch-bench"
diff --git a/packages/websearch/LICENSE b/packages/websearch/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/packages/websearch/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/packages/websearch/LICENSES/Project-MIT.txt b/packages/websearch/LICENSES/Project-MIT.txt
new file mode 100644
index 0000000..cfb4b00
--- /dev/null
+++ b/packages/websearch/LICENSES/Project-MIT.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 LexMount
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/websearch/MANIFEST.in b/packages/websearch/MANIFEST.in
new file mode 100644
index 0000000..95184b7
--- /dev/null
+++ b/packages/websearch/MANIFEST.in
@@ -0,0 +1,3 @@
+include CITATION.cff provenance.json
+recursive-include docs *.md
+recursive-include examples *.json
diff --git a/packages/websearch/NOTICE b/packages/websearch/NOTICE
new file mode 100644
index 0000000..fc459aa
--- /dev/null
+++ b/packages/websearch/NOTICE
@@ -0,0 +1,7 @@
+LexBench Web Search
+Copyright 2026 LexMount
+
+Earlier project code was distributed under MIT. Those grants remain valid;
+the original notice and license are retained in LICENSES/Project-MIT.txt.
+Bundled upstream data retains the notices in
+src/lexbench_websearch/definitions/NOTICE.txt.
diff --git a/packages/websearch/README.md b/packages/websearch/README.md
new file mode 100644
index 0000000..a38c4c7
--- /dev/null
+++ b/packages/websearch/README.md
@@ -0,0 +1,124 @@
+
+
+

+
+**English** · [简体中文](docs/README.zh-CN.md)
+
+[](https://github.com/lexmount/lexbench-websearch/actions/workflows/check.yml)
+[](LICENSE)
+[](pyproject.toml)
+
+[Tasks](#task-suites) · [Quickstart](#quickstart) · [Scoring](#scoring) · [Versions](#versions) · [Related projects](#related-repositories) · [Contributing](../../CONTRIBUTING.md)
+
+
+
+LexBench Web Search defines versioned search queries, source references and deterministic retrieval scoring. Use the tasks with your own runner or [Browser Eval](https://github.com/lexmount/browser-eval) to compare Search and SERP APIs.
+
+This repository owns task definitions, provenance, reference qualifications and scoring rules. Browser Eval owns provider calls, timing, billing, evidence and comparison reports. This package runs offline and has no runtime dependencies.
+
+## Task suites
+
+| Dataset | Tasks | Scope |
+| --- | ---: | --- |
+| `scenarios-v1` | 149 | General web, named-site and vertical-search queries from public catalogs, community examples and authored controls |
+| `scenarios-v2` | 149 | The same queries with qualified reference additions and URL equivalences; recommended for new runs |
+| `factual-v1` | 831 | Unchanged SimpleQA Verified questions within the preregistered 128-character input limit, with publisher answers and source URLs |
+
+The scenario versions are alternative snapshots of the same 149 queries. A run selecting `scenarios-v2` and `factual-v1` has 980 queries; it does not add both scenario snapshots together.
+
+The scenario set contains 80 queries from Microck/websearch-bench, 7 traceable exact community queries, 28 transcribed screenshot queries whose original author/post is unknown, 14 community-derived queries and 20 curated queries. Every task has origin and derivation records. See [data and sources](docs/data.md), [third-party notices](THIRD_PARTY.md) and the installed `definitions/sources.json` inventory.
+
+The factual set adapts SimpleQA Verified for retrieval diagnostics. It does not reproduce the official closed-book answer evaluation. Report its metrics separately from scenario relevance.
+
+## Quickstart
+
+Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
+
+```sh
+git clone https://github.com/lexmount/lexbench-web-retrieval.git
+cd lexbench-web-retrieval/packages/websearch
+uv sync --frozen --all-packages --all-extras
+uv run --frozen --package lexbench-websearch lexbench-websearch list
+uv run --frozen --package lexbench-websearch lexbench-websearch validate scenarios-v2
+uv run --frozen --package lexbench-websearch lexbench-websearch validate factual-v1
+uv run --frozen --package lexbench-websearch lexbench-websearch export scenarios-v2 > /tmp/scenarios.json
+```
+
+These commands inspect and export the bundled definitions offline, without a browser or API key. A pinned integration needs no sibling checkout:
+
+```sh
+uv add 'lexbench-websearch @ git+https://github.com/lexmount/lexbench-web-retrieval.git@#subdirectory=packages/websearch'
+```
+
+## Scoring
+
+Try a ranking that contains the useful result and one that misses it:
+
+```sh
+uv run --frozen --package lexbench-websearch lexbench-websearch score examples/relevant.json
+uv run --frozen --package lexbench-websearch lexbench-websearch score examples/missing.json
+```
+
+The examples use supplied relevance labels: the first returns `success=1`, the second `success=0`. This CLI scores saved rankings; it does not fetch results or generate labels.
+
+Relevance grades range from 0 (irrelevant) through 1 (related but insufficient) and 2 (useful support) to 3 (directly satisfies the request). The [evaluation protocol](docs/evaluation.md) defines nDCG, precision, success and aggregation across queries. Source-URL hits and lexical answer matches are separate diagnostics. Historical model labels are not distributed as human ground truth.
+
+The Python API supports the same deterministic metrics:
+
+```python
+from lexbench_websearch.inputs import load_dataset
+from lexbench_websearch.relevance import query_metrics
+
+cases = load_dataset("scenarios-v2")["cases"]
+metrics = query_metrics(["useful", "unrelated"], {"useful": 3, "unrelated": 0}, cutoff=5)
+assert metrics["ndcg"] == 1.0
+assert metrics["precision"] == 0.2
+```
+
+## Run providers and build reports
+
+Follow the [Browser Eval Search guide](https://github.com/lexmount/browser-eval/blob/main/harness/web_search/README.md) to run providers and build reports. Provider credentials, retries, latency, billing and measured outputs belong to the harness. The [integration guide](docs/integration.md) defines normalized responses, reference bindings and annotation inputs.
+
+## Versions
+
+The frozen catalog is benchmark edition `1.0.0`; the Python tooling package is `0.1.0`. These are separate identities. Run `uv run --frozen --package lexbench-websearch lexbench-websearch version` to inspect the installed catalog and whether development scoring still matches it. An `unreleased` result does not certify a new edition.
+
+Git releases follow the family's topic-scoped tag policy; frozen edition labels remain unchanged. The historical `bench-1.0.0` catalog binding is retained unchanged. Use `release` to freeze selected inputs and scoring, and `compare-releases` to check comparability. See [versioning](docs/versions.md). Version changes and tags require an explicit release request.
+
+## Related repositories
+
+| Repository | Role |
+| --- | --- |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | Provider execution, saved evidence and comparison reports |
+| [LexBench Web Fetch](https://github.com/lexmount/lexbench-webfetch) | Web Fetch tasks, frozen references and acceptance scoring |
+| [Moli](https://github.com/lexmount/moli) | Browser used in the companion evaluation harness |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | CLI client for the Lexmount WebFetch service |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | Hosting, versioning and sharing of generated reports |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | Protocol, automation-driver and web-platform benchmarks |
+
+[Third-party notices](THIRD_PARTY.md) retain the terms for Microck/websearch-bench, SimpleQA Verified, OpenAI SimpleQA and community material. Code, tools and guides use English; dataset text keeps its original language.
+
+## Contribute
+
+Read [CONTRIBUTING](../../CONTRIBUTING.md) before changing task definitions, references or scoring.
+
+```sh
+make -C ../.. check
+make -C ../.. package-check
+```
+
+[Security](../../SECURITY.md) · [Third-party content](THIRD_PARTY.md) · [Apache 2.0](LICENSE)
+
+## Cite LexBench Web Search
+
+Use this citation or [CITATION.cff](CITATION.cff), and record the benchmark edition, datasets and code revision used. The citation below identifies the tooling package. Cite the original datasets separately; pinned sources and papers are in the [source guide](docs/data.md).
+
+```bibtex
+@software{lexbench_websearch_2026,
+ author = {{LexBench Web Search contributors}},
+ title = {LexBench Web Search},
+ year = {2026},
+ version = {0.1.0},
+ url = {https://github.com/lexmount/lexbench-websearch}
+}
+```
diff --git a/packages/websearch/THIRD_PARTY.md b/packages/websearch/THIRD_PARTY.md
new file mode 100644
index 0000000..c694805
--- /dev/null
+++ b/packages/websearch/THIRD_PARTY.md
@@ -0,0 +1,12 @@
+# Third-party material
+
+The root Apache-2.0 license covers project-owned code and authored material. Earlier MIT grants remain valid; the original project notice and terms are retained in [LICENSES/Project-MIT.txt](LICENSES/Project-MIT.txt). Bundled datasets, linked pages and community posts retain their source terms. The installed package includes the full upstream notices from `definitions/NOTICE.txt`.
+
+- **Microck/websearch-bench:** 80 query records from commit `7714e86b1b8d7b943037c38b04d4f6ba65566d5b`, MIT, copyright 2026 Microck. The full notice is included in `src/lexbench_websearch/definitions/NOTICE.txt`.
+- **SimpleQA Verified:** questions, reference answers and supporting URLs from Google DeepMind / Google Research, revision `ed392714d14fa5225b07c2b456453983bc75f690`. The publisher card declares MIT. Authors, paper and original SimpleQA attribution are in [data and sources](docs/data.md); the license notice is included with the definitions.
+- **Community examples:** short query transcriptions/adaptations with per-case origin and derivation. Source posts retain their own terms. No source screenshots or full articles are included. The 28 user-supplied screenshot queries have no established original author or post; they are marked accordingly.
+- **Referenced websites and papers:** URLs and short task-specific source assertions identify acceptance evidence. Referenced content remains subject to its publisher's terms.
+
+`definitions/sources.json` is the machine-readable attribution inventory. Report missing or incorrect attribution through a repository issue, including the affected case ID and supporting source.
+
+SimpleQA Verified derives questions from OpenAI SimpleQA, distributed under MIT, Copyright (c) 2024 OpenAI. The upstream notice is retained in `definitions/NOTICE.txt`; see https://github.com/openai/simple-evals/blob/main/LICENSE.
diff --git a/packages/websearch/docs/README.zh-CN.md b/packages/websearch/docs/README.zh-CN.md
new file mode 100644
index 0000000..0313c10
--- /dev/null
+++ b/packages/websearch/docs/README.zh-CN.md
@@ -0,0 +1,124 @@
+
+
+

+
+[English](../README.md) · **简体中文**
+
+[](https://github.com/lexmount/lexbench-websearch/actions/workflows/check.yml)
+[](../LICENSE)
+[](../pyproject.toml)
+
+[任务集](#任务集) · [快速开始](#快速开始) · [评分](#评分) · [版本](#版本) · [相关仓库](#相关仓库) · [参与贡献](../../../CONTRIBUTING.md)
+
+
+
+LexBench Web Search 提供有版本记录的搜索问题、来源参考和确定性检索评分。可以用自己的运行器,也可以接入 [Browser Eval](https://github.com/lexmount/browser-eval),比较 Search 和 SERP API。
+
+本仓库维护题目、来源、参考来源核验和评分规则。Browser Eval 负责服务调用、计时、计费、证据保存和对比报告。本工具包离线运行,没有运行时依赖。
+
+## 任务集
+
+| 数据集 | 题数 | 范围 |
+| --- | ---: | --- |
+| `scenarios-v1` | 149 | 来自公开题库、社区示例和自编对照题的通用搜索、指定网站和垂直搜索问题 |
+| `scenarios-v2` | 149 | 同一批问题,补充经过核实的参考来源和等价 URL;新评测建议使用此版本 |
+| `factual-v1` | 831 | 符合预先规定的 128 字符输入限制的 SimpleQA Verified 原题,保留发布方答案和来源 URL |
+
+两个场景版本是同一批 149 个问题的不同快照。选择 `scenarios-v2` 和 `factual-v1` 的一次评测共 980 题,不应把两个场景快照叠加计算。
+
+场景题包含 Microck/websearch-bench 的 80 题、7 条能追溯到原文的社区问题、28 条原作者和原帖不明的截图转录问题、14 条根据社区问题改编的题目,以及 20 条自编题。每题都有来源和改编记录。详见[数据与来源](data.md)、[第三方说明](../THIRD_PARTY.md)和安装包中的 `definitions/sources.json`。
+
+事实题将 SimpleQA Verified 改编为检索诊断任务,不复现官方的闭卷回答评测。它的指标应与场景相关性分开报告。
+
+## 快速开始
+
+安装 [uv](https://docs.astral.sh/uv/getting-started/installation/),然后运行:
+
+```sh
+git clone https://github.com/lexmount/lexbench-web-retrieval.git
+cd lexbench-web-retrieval/packages/websearch
+uv sync --frozen --all-packages --all-extras
+uv run --frozen --package lexbench-websearch lexbench-websearch list
+uv run --frozen --package lexbench-websearch lexbench-websearch validate scenarios-v2
+uv run --frozen --package lexbench-websearch lexbench-websearch validate factual-v1
+uv run --frozen --package lexbench-websearch lexbench-websearch export scenarios-v2 > /tmp/scenarios.json
+```
+
+这些命令离线检查、导出随包提供的题目定义,无需浏览器或 API 密钥。其他项目可安装固定提交,不需要相邻的仓库副本:
+
+```sh
+uv add 'lexbench-websearch @ git+https://github.com/lexmount/lexbench-web-retrieval.git@#subdirectory=packages/websearch'
+```
+
+## 评分
+
+分别尝试找到有效结果和漏掉有效结果的排序示例:
+
+```sh
+uv run --frozen --package lexbench-websearch lexbench-websearch score examples/relevant.json
+uv run --frozen --package lexbench-websearch lexbench-websearch score examples/missing.json
+```
+
+示例使用已提供的相关性标签,前者返回 `success=1`,后者返回 `success=0`。命令只给已保存的排序评分,不获取搜索结果,也不生成标签。
+
+相关性分为 0(无关)、1(相关但不足)、2(提供有效支持)、3(直接满足请求)四级。[评测协议](evaluation.md)定义 nDCG、精确率、成功率及逐题汇总方法。来源 URL 命中和答案字面匹配是独立诊断指标。历史模型标签不作为人工真值分发。
+
+Python API 使用相同的确定性指标:
+
+```python
+from lexbench_websearch.inputs import load_dataset
+from lexbench_websearch.relevance import query_metrics
+
+cases = load_dataset("scenarios-v2")["cases"]
+metrics = query_metrics(["useful", "unrelated"], {"useful": 3, "unrelated": 0}, cutoff=5)
+assert metrics["ndcg"] == 1.0
+assert metrics["precision"] == 0.2
+```
+
+## 运行服务并生成报告
+
+按 [Browser Eval 搜索评测指南](https://github.com/lexmount/browser-eval/blob/main/harness/web_search/README.md)运行服务、生成报告。凭据、重试、延迟、计费和实测输出由脚手架管理。[接入指南](integration.md)说明统一响应格式、参考绑定和标注输入。
+
+## 版本
+
+冻结题库的评测版本为 `1.0.0`,Python 工具包版本为 `0.1.0`,两者分别记录。运行 `uv run --frozen --package lexbench-websearch lexbench-websearch version` 查看安装的题库及开发中的评分源码是否仍与之匹配。`unreleased` 表示尚未发布的改动,不代表认证了新版本。
+
+Git 发布遵循家族的主题标签规则,冻结的评测版本标识保持不变。冻结目录中原有的 `bench-1.0.0` 绑定保持不变。用 `release` 固定所选输入和评分,用 `compare-releases` 检查可比性,详见[版本规则](versions.md)。变更版本和创建标签都需要明确的发布指令。
+
+## 相关仓库
+
+| 仓库 | 用途 |
+| --- | --- |
+| [Browser Eval](https://github.com/lexmount/browser-eval) | 服务运行、证据保存和对比报告 |
+| [LexBench Web Fetch](https://github.com/lexmount/lexbench-webfetch) | Web Fetch 任务、冻结参考和验收评分 |
+| [Moli](https://github.com/lexmount/moli) | 配套评测脚手架中使用的浏览器 |
+| [WebFetch CLI](https://github.com/lexmount/webfetch-cli) | Lexmount WebFetch 服务的命令行客户端 |
+| [Artifact Site](https://github.com/lexmount/artifact-site) | 报告托管、版本管理和分享 |
+| [Lexbench-Headless-Browser](https://github.com/lexmount/Lexbench-Headless-Browser) | 协议、自动化驱动和 Web 平台评测 |
+
+[第三方说明](../THIRD_PARTY.md)保留 Microck/websearch-bench、SimpleQA Verified、OpenAI SimpleQA 和社区材料各自的条款。代码、工具和指南使用英文,题目保留原文语言。
+
+## 参与贡献
+
+修改题目、参考或评分前,请阅读 [CONTRIBUTING](../../../CONTRIBUTING.md)。
+
+```sh
+make -C ../.. check
+make -C ../.. package-check
+```
+
+[安全](../../../SECURITY.md) · [第三方内容](../THIRD_PARTY.md) · [Apache 2.0](../LICENSE)
+
+## 引用 LexBench Web Search
+
+使用以下引用或 [CITATION.cff](../CITATION.cff),并注明评测版本、数据集和代码版本。以下引用标识工具包版本。使用原始数据时请单独引用其来源,固定版本和论文见[来源指南](data.md)。
+
+```bibtex
+@software{lexbench_websearch_2026,
+ author = {{LexBench Web Search contributors}},
+ title = {LexBench Web Search},
+ year = {2026},
+ version = {0.1.0},
+ url = {https://github.com/lexmount/lexbench-websearch}
+}
+```
diff --git a/packages/websearch/docs/assets/overview.png b/packages/websearch/docs/assets/overview.png
new file mode 100644
index 0000000000000000000000000000000000000000..5358c7ef9db8fac81325db295d05d0468c447568
GIT binary patch
literal 1197814
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