+ Browser Eval local example
+ This page belongs to the Browser Eval quickstart. A successful extraction preserves the complete article, including this paragraph and the final sentence.
+ Local examples exercise execution, scoring and report generation. They do not establish a browser ranking.
+
+
diff --git a/harness/web_fetch/HEADLESS.md b/harness/web_fetch/HEADLESS.md
index 6f2f4cdfa..74bb38da3 100644
--- a/harness/web_fetch/HEADLESS.md
+++ b/harness/web_fetch/HEADLESS.md
@@ -1,4 +1,8 @@
-# Browser task-native Web Fetch comparison
+# Compare live-URL browser methods
+
+For a first local run, use the [HTTP/Moli/Chromium example](../../examples/web_fetch/README.md). This guide covers the maintained live-URL benchmark and its resource measurements.
+
+[Methods](#runtime-and-route) · [Comparison limits](#what-is-and-is-not-fair) · [Setup](#credentials-and-binaries) · [Run](#run-and-preserve-evidence) · [Release checks](#release-checks)
The separate frozen-HTML public-data comparison is documented in
[WEBMAINBENCH.md](WEBMAINBENCH.md); its fidelity scores are not mixed with
@@ -113,7 +117,7 @@ Local binary paths use `MOLI_BINARY`, `LIGHTPANDA_BINARY`,
empty value is rejected so a later partial rerun cannot silently switch from
the report's browser to Playwright's bundled Chromium. Binaries are not committed; measured binary hashes and
versions are retained in call evidence. Install JavaScript dependencies with
-`npm install` and the Python benchmark dependencies in a repository-local
+`npm ci` and the Python benchmark dependencies in a repository-local
environment.
Every local call is bound to the batch executable SHA-256. The runner captures
@@ -128,6 +132,8 @@ archive is labelled post-hoc; it is not rewritten as run-time provenance.
## Run and preserve evidence
+### Import historical inputs
+
The historical `evaluation/dataset.json` input is resolved through
`evaluation/source-inputs.json`; its full text and captured sources are outside
Git. Import the approved frozen copy before using the historical commands below,
@@ -135,6 +141,8 @@ as described in [reference inputs](../../docs/reference-inputs.md).
`evaluation/dataset-catalog.json` is a public task directory, not an execution
dataset. An explicitly supplied custom dataset remains a normal JSON file.
+### Select a cohort and methods
+
`harness/web_fetch/headless_runner.py` owns cohort selection, execution and
implementation checks. The command in `scripts/` delegates to it.
`configs/providers.headless.json` declares the method registry and the `main`
@@ -158,6 +166,8 @@ Unknown or duplicate methods, task IDs and task families are rejected before
calls. The execution receipt records the selected cohort and actual input
filenames rather than claiming the repository's default inputs.
+### Capture, freeze and check references
+
The reference lifecycle in [README.md](README.md) is mandatory. Independently
capture ordinary pages, separately observe browser-dependent complete scopes,
freeze the references, execute, then postcheck:
@@ -184,6 +194,8 @@ uv run --frozen python scripts/certify_headless_cases.py --run-dir RUN --observa
uv run --frozen python scripts/review_headless_results.py --evidence EVIDENCE --work REVIEW --batch-cases 5 --workers 4 --model EXACT_AVAILABLE_MODEL --install
```
+### Certify a new run
+
For new `run_benchmark.py` cohorts, use the fail-closed wrapper so an aggregate
run cannot be mistaken for publishable evidence before its worker manifests
and top-level execution file carry verified postchecks:
@@ -303,7 +315,7 @@ evidence remains ineligible for this formal evidence check.
`.python-version`, `uv.lock`, the Makefile and CI pin Python 3.11 and dependency versions.
Formal commands must not fall back to system `python` / `python3`; an unmet runtime contract must fail before execution.
-## Cross-session release gates
+## Release checks
The headless report remains a separately published reference cohort. Its
evidence bundle fixes the dataset ID, task count, provider set, timeout and
@@ -314,8 +326,8 @@ Review requirements are bound to the declared evidence scope: unresolved
judgments block publication, and a failure-only review discloses both reviewed
attempts and accepted unreviewed machine passes. Assembly retains inherited
review history only when its scope and judgments match the final results. These checks are
-covered by the repository test suite; a new session must repair the evidence or
-implementation instead of bypassing them.
+covered by the repository test suite. Fix invalid evidence or implementation
+before release.
The preserved public destination for this comparison is the separate app-domain
Sites project `UUAhhQMnrGwm`. The current 10-method report is the separate
diff --git a/harness/web_fetch/README.md b/harness/web_fetch/README.md
index 6e92035be..d1e20e5fd 100644
--- a/harness/web_fetch/README.md
+++ b/harness/web_fetch/README.md
@@ -1,4 +1,20 @@
-# Web Fetch Harness
+# Web Fetch
+
+Fetch a page or file, score the returned content against declared requirements, and inspect the saved result. Start with the [local article example](../../examples/web_fetch/README.md) for a runnable HTTP/Moli/Chromium comparison.
+
+This page is the technical reference for larger experiments and historical reports. Use the section matching your task:
+
+| I want to… | Read |
+| --- | --- |
+| Run local browsers or reproduce the live-URL comparison | [Browser comparison guide](HEADLESS.md) |
+| Compare extraction from frozen HTML | [WebMainBench guide](WEBMAINBENCH.md) |
+| Understand task pass rules and text quality | [Text evaluation](#common-text-evaluation) · [stable acceptance](#stable-acceptance-and-text-quality) |
+| Capture an independent reference | [Source capture](#independent-source-capture) · [browser observations](#independent-browser-observations) |
+| Define dynamic-page completion | [Dynamic-content protocol](#dynamic-content-ground-truth-protocol) |
+| Check timeouts, retries or revise scores | [Budgets and measurements](#end-to-end-budget-and-missing-measurements) |
+| Build a new report instance | [Report instances](#report-instances) |
+| Score and publish WCXB | [WCXB scoring](#wcxb-scoring) · [timing and publication](#wcxb-paired-timing-and-publication) |
+
## Report revisions and file-delivery controls
@@ -186,6 +202,8 @@ reporting and between-call throttling are outside this latency. Runtime source a
configuration hashes are captured before calls. Moli binary hashing occurs during
validation, not each measured fetch; a changed binary requires revalidation.
+### Retries
+
Runs default to no benchmark-level retry. A run may predeclare one failure retry
with `max_failure_retries=1` (the headless CLI flag is
`--max-failure-retries 1`). The retry is triggered only after the first physical
@@ -196,6 +214,8 @@ call intervals and any provider-required wait between them. A correction for a
proven wrong command, version, scorer or reference is not a retry: supersede the
affected result explicitly and rerun the complete declared correction scope.
+### Timeouts
+
Late answers cannot pass. A common daemon boundary stops accepting output at the
deadline and requests cancellation. An adapter that cannot cancel is quarantined:
remaining calls on it are recorded as unexecuted, not fabricated failures, and
@@ -204,6 +224,8 @@ abandoned requests while preventing a partial run from being treated as a
finished benchmark. Native subprocess adapters cancel their processes; cleanup
is never extra answer budget.
+### File bytes and missing measurements
+
New file evaluations accept `ProviderResult.files` entries containing actual
`data: bytes`, retain separate binary artifacts and verify signature, length,
SHA-256 and a declared independent target hash when present. Link-only output
@@ -212,6 +234,8 @@ Historical records without `raw_file_pass` are unmeasured even if their HTTP
request failed: all report/summary denominators and failure filters exclude them.
The three result filters remain pass/fail/all; unmeasured rows appear in all.
+### Correct a score or reference
+
`scripts/rescore_content.py` recomputes
all applicable records through the shared scorer without supplier calls.
Known scoring failure modes have compact synthetic positive and negative controls
@@ -242,6 +266,8 @@ input plus the required root cause and executable regression IDs. Neither
operation calls providers. Declared evidence must remain present, unmodified
and free of symbolic links before scores can be rewritten.
+### Retain or merge an existing review
+
Existing independent judgments can be retained after a score-only correction
with `scripts/rebase_blind_result_review.py`. It requires identical task and
reviewer-visible inputs, retains the independent verdicts, and requires explicit
@@ -259,6 +285,8 @@ independent review still requires an explicit request.
A merged blind review still needs any anomaly investigation required by the
dataset before publication.
+### Request an independent review
+
Independent execution remains opt-in through `scripts/review_headless_results.py`;
its default scope is machine failures. Reviewing passes or the full matrix also
requires `--confirm-full-review`. `--prepare-only` creates blinded packets without
@@ -273,12 +301,16 @@ unbound work directories are preserved and rejected rather than silently reused.
Changing task IDs is not required to invalidate stale judgments. Provider-filtered
reviews remain partial and cannot replace a required complete installed review.
+### Compare timing populations
+
For a heterogeneous same-window
cohort, keep every predeclared call and report all-call latency (one shared task
denominator) separately from successful-call latency (each method's conditional
subset). The all-method common-pass intersection is diagnostic only: never
reselect tasks after seeing outcomes.
+### Text coverage and incomplete references
+
`content_check_coverage` measures matched required text groups, not body recall.
All declared groups are required by stable contracts; record count/type/uniqueness
remain independent requirements. Empty text groups yield null coverage. The report
@@ -290,6 +322,8 @@ text is unjudged, not noise. Snapshot scores containing explicitly nonliteral fi
are retained as attempt diagnostics but excluded from invariant body aggregates.
Returned-title quality is also auxiliary and never substitutes for body scores.
+### Popular-site references
+
Popular-site stable text is backed by `sources/