Skip to content

[Ready for Review] Adapter: browsecomp (protocol-faithful migration) - #44

Open
JoyboyBrian wants to merge 6 commits into
harbor-framework:mainfrom
JoyboyBrian:browsecomp-migration
Open

JoyboyBrian wants to merge 6 commits into
harbor-framework:mainfrom
JoyboyBrian:browsecomp-migration

Conversation

@JoyboyBrian

@JoyboyBrian JoyboyBrian commented Oct 22, 2026 •

Copy link
Copy Markdown

Migrates Brian Guo’s protocol-faithful BrowseComp adapter from harbor#2355, reverified at 464e90c108bfc3d220288c8de9b3f2d80c572b02, to src/browsecomp/ in the standalone adapters repository. This preserves the original contribution, upstream MIT notice, benchmark code/templates, all 28 tests, parity runner/configurations, and public validation evidence.

The first commit imports the source files with Brian’s attribution. The second updates paths, installs Harbor as an external test dependency pinned to the destination guide’s compatibility baseline (99218a4611e3bd76e49ce3b5f977e8c8134ad3ac), and adds scoped Linux/Windows offline CI. No prompt, sampling, scoring, or verifier-isolation changes are included. Destination contract v1 was inspected at 08cbb3a6198adbf7b87323c884180e0e0fffd7d1.

Review continuity

  • Migration request and outstanding decisions.
  • Standard CLI run and shared tasks: both lanes share generated tasks; the agentic config alone appends the response-file instruction.
  • MIT attribution discussion and module explanations. These and the standard-CLI-run thread still show unresolved on the original PR; replies and fixes are carried forward without claiming maintainer acceptance.
  • Resolved review fixes are retained, including audit incompleteness reporting, invalid-path exit codes, non-UTF-8 response grading, and verifier SDK alignment.
  • Related harbor#1521 by @wizard1203 reports Claude-Code/Haiku parity. This contribution pins the public OpenAI one-shot protocol and judge and labels Codex search as a separate system evaluation. Please coordinate review across both. This is BrowseComp, not BrowseComp-Plus.

Dataset publication

Registration remains deferred; no decrypted questions, answers, generated tasks, private trial archives, or credentials are included. The later policy discussion corrected the earlier abc-bench precedent and proposed an encrypted/scaffolding-only flow, which is not implemented here. dataset_pr and registry_benchmark_size remain null. See also harbor-datasets#246.

Historical evidence, not new live runs

  • Matched one-shot parity: three seed-0 30-task runs per side; original 0.067 ± 0.000, Harbor 0.089 ± 0.011 (sample SEM); ranges overlap. Raw arrays remain in parity_experiment.json.
  • Full-scale oracle: 1266/1266, reward 1.000, separate from model parity.
  • Agentic Codex/GPT-5.6 run: 24/30, zero exceptions, historical audit reported clean; no matched-original parity claim.
  • HF parity PR #265 retains original stdout, job configurations/results, oracle summary, agentic summary, and result collections. Oracle screenshot and agentic screenshot remain linked.

No live model calls, Docker/Daytona jobs, full-scale oracle, or new parity runs were performed for this migration. The historical reports do not establish an exact Harbor commit or all current preflight fields. New runs or methodology changes require separate coordination; the 30-task/custom-agent parity scope and publication handling remain maintainer decisions.

Local validation

Tested migration head: 26c5b516dc59d6abdd9757b7b90fb9f6df017c49 (macOS, Python 3.13.5).

  • All 28 preserved BrowseComp tests pass using synthetic rows and mocked model calls.
  • Ruff 0.15.17 lint and format checks pass; adapter type checks pass.
  • Structural validator: 30 passed, zero errors, one expected warning for deferred dataset registration.
  • Destination contract examples: 11 tests pass.
  • Sixteen source protocol/template/evidence files are byte-identical; parity metadata changes only by adding the replacement PR link; recorded means, SEMs, run counts, and overlap were independently checked.

The original head’s Ruff, Type Check, Windows tests, and Linux non-runtime tests passed. Its Linux runtime job failed six unrelated Terminus-2 integration tests. This migration does not claim the source suite is fully green.

Remote CI for this exact head: BrowseComp run #2 is awaiting maintainer approval (action_required); no Linux/Windows jobs have run yet. The initial workflow context error was fixed in this head. This PR is ready for review; remote CI remains pending maintainer approval. The README records migration caveats, including retained task schema 1.3 and upstream --examples 30 sampling.

Reciprocal migration links are posted on the original PR and this PR. The original PR remains open.

Source: harbor-framework/harbor#2355 at 464e90c108bfc3d220288c8de9b3f2d80c572b02. Preserves the adapter, tests, license, and public parity artifacts before standalone packaging changes.
Relocate source paths, pin the external Harbor test baseline, retain the source Ruff version, and run offline coverage in scoped Linux/Windows CI. Preserve benchmark logic and historical parity records; document the unresolved dataset policy, related PR 1521, and original review evidence.
@JoyboyBrian

Copy link
Copy Markdown
Author

Migration source: harbor-framework/harbor#2355 at 464e90c108bfc3d220288c8de9b3f2d80c572b02, including Brian Guo’s attribution, review replies, tests, and https://huggingface.co/datasets/harborframework/parity-experiments/discussions/265. Related BrowseComp work: harbor-framework/harbor#1521. The README distinguishes historical one-shot parity, oracle validation, and the agentic score; publication handling remains unresolved. No new live/parity runs were launched for the migration.

@JoyboyBrian JoyboyBrian changed the title [WIP] Adapter: browsecomp (protocol-faithful migration) [Ready for Review] Adapter: browsecomp (protocol-faithful migration) Oct 22, 2026
@JoyboyBrian
JoyboyBrian marked this pull request as ready for review October 22, 2026 20:03
@crystalxyz

Copy link
Copy Markdown
Collaborator

/review-adapter

@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Structural validation of commit 39b5c42 at 2026-10-27 23:15:59 UTC

Adapter contract v1 (docs/adapters.mdx).

✅ Adapter Validation: browsecomp

✅ 30 passed | ❌ 0 errors | ⚠️ 1 warnings

Warnings (recommended)

  • ⚠️ Parity PR link null: Entry 0: dataset_pr is null — fill in the PR URL(s). — src/browsecomp/parity_experiment.json:16
Passed checks (30)
  • ✅ README.md exists
  • ✅ parity_experiment.json exists
  • ✅ adapter_metadata.json exists
  • ✅ src/browsecomp/ package exists
  • ✅ src/browsecomp/adapter.py exists
  • ✅ src/browsecomp/main.py exists
  • ✅ src/browsecomp/task-template/ directory exists
  • ✅ src/browsecomp/task-template/task.toml exists
  • ✅ src/browsecomp/task-template/instruction.md exists
  • ✅ src/browsecomp/task-template/environment/Dockerfile exists
  • ✅ src/browsecomp/task-template/tests/test.sh exists
  • ✅ src/browsecomp/task-template/solution/solve.sh exists
  • ✅ Template [task].name present
  • ✅ Template [task].authors present
  • ✅ parity_experiment.json is valid JSON array
  • ✅ adapter_metadata.json is valid JSON array
  • ✅ README section Overview present
  • ✅ README section What is present
  • ✅ README section Adapter Features present
  • ✅ README section Generated Task Structure present
  • ✅ README section Run Evaluation present
  • ✅ README section Usage present
  • ✅ README section Parity present
  • ✅ README section Notes & Caveats present
  • ✅ README section Installation / Prerequisites present
  • ✅ README section Citation present
  • ✅ README section Authors & Contributions present
  • ✅ Parity table column count correct
  • ✅ test.sh writes to reward path
  • ✅ No canary strings found

@github-actions

Copy link
Copy Markdown
Contributor

Adapter review of commit 26c5b51 (applies only to this revision).

Adapter review: browsecomp (PR #44 at commit 26c5b516dc59d6abdd9757b7b90fb9f6df017c49)

Contract: Adapter contract v1, revision c6eb509c459c994b90750d7d880dc93530e55d8f
Code reviewed: reviewed-pr/src/browsecomp/ only. I ran nothing and edited nothing.
Pinned upstream: openai/simple-evals@652c89d0ca9df547706735883097e9537d40dc47. I fetched browsecomp_eval.py and simple_evals.py and compared them with the code.
Dataset: the official encrypted CSV, 1,266 rows, with SHA-256 7b24471c…abf pinned.
Claim being reviewed: one-shot parity using a custom agent (browsecomp-simple-evals-one-shot, model gpt-5.6-sol, grader gpt-4.1-2025-04-14) on 30 tasks sampled with seed 0, 3 runs per side. Separately, one Codex agentic run scored 24/30; the PR does not present it as parity.
Evidence status: I recomputed the statistics myself. I fetched the PR, HF and upstream links. I did not reproduce any experiment. All run results are historical (July 2026) and were not rerun on this head.

Previous bot review

The only earlier bot comment is the github-actions structural check (30 passed, 0 errors, 1 warning). Its one warning, dataset_pr = null in parity_experiment.json, is still present, because dataset registration is deferred on purpose. No earlier AI review flagged any bugs.


Summary

The code is careful and matches upstream closely:

  • It uses the upstream query template and grader template word for word.
  • It uses the same XOR/SHA-256 decryption, the same row order, and the same random.Random(0).sample selection.
  • It uses the same grader model, system message and sampler settings, and the same retry and BadRequest handling.
  • Grading runs in a properly separate verifier image.
  • The one change to grading, the group(1) fix from fix regex bug in browsecomp openai/simple-evals#67, is disclosed clearly. The original side applies the same fix, so the comparison stays symmetric.

The main problems are about evidence and the spec contract, not about grading correctness:

  1. Parity evidence is weak (30 tasks, scores of 2–3 out of 30). It technically meets ADP-PARITY.
  2. The README's reproduction steps don't match the parity row that was reported.
  3. Several schema deviations remain: schema_version = "1.3", null fields, numeric cost, and no --split parity.
  4. Agentic-lane leakage through the public CSV is a disclosed limitation, but the agent can still exploit it.

Blocking or needing a maintainer decision

  • B1 (ADP-README, parity reproduction). The "Reproducing the original/Harbor side" sections (README.md:192-226) only describe a GPT-4.1 run. But the reported parity row is gpt-5.6-sol, run through parity_original_gpt56.py and run_browsecomp_parity_gpt56.yaml.
    • The "Harbor side" block even repeats the original-side simple_evals command.
    • Neither side lists the full command set for the reported experiment:
      • generate with --examples 30 into datasets/browsecomp-parity;
      • apply the feat(ifeval): add adapter #67 patch to the simple-evals checkout;
      • run PYTHONPATH=... python parity_original_gpt56.py;
      • run PYTHONPATH=src/browsecomp/src … harbor run -c src/browsecomp/run_browsecomp_parity_gpt56.yaml.
    • The feat(ifeval): add adapter #67 patch is not committed as a patch file. parity_original_gpt56.py silently assumes the checkout is already patched; if it isn't, it reports 0%.
    • Fix: add exact commands for both sides of the GPT-5.6 row, and ship the one-line patch (or a fork URL) as original_parity_repo.
  • B2 (ADP-PARITY, how strong the evidence is). The run arrays are original_runs = [0.0667, 0.0667, 0.0667] and harbor_runs = [0.1, 0.0667, 0.1].
    • The ranges overlap only at their edge: max(original) = min(harbor) = 0.0667.
    • With 30 tasks and 2–3 correct answers per run, this test can detect only very large adaptation errors.
    • Harbor scored ≥ the original on every run, though that is consistent with noise at n=30.
    • It formally passes the overlap criterion. Whether a 2.4% sample is enough is a maintainer decision; the README itself says this is pending.
    • Per-task results were withheld because they contain decrypted data, so I could not check which tasks each side got right.
    • Suggestion: provide a per-task list of which tasks each side solved (task IDs only, no content) so the 2–3 solved tasks can be compared.
  • B3 (vulnerability 13a/13e, agentic lane). Both [agent].network_mode and [environment].network_mode are "public", so an agent with web access can download the public CSV and decrypt it with the canary stored in the CSV itself.
    • The README (README.md:331-356) discloses this and provides browsecomp-audit, but that is a string-matching heuristic after the fact; it doesn't prevent anything.
    • Under the review invariant, "matches upstream" is not a pass: the agent can still obtain the ground truth.
    • The one-shot lane has no tools, so it is not affected.
    • Decision needed: maintainers should accept this as a documented limitation, or require an egress block/proxy before agentic scores are reported.

Should fix (non-blocking)

  • S1 (task file reference, version). task-template/task.toml:1 uses schema_version = "1.3", but the spec says version must stay "1.0". The Harbor baseline 99218a46 does accept schema_version (default 1.4) and supports artifacts, environment_mode = "separate", [verifier.environment] and per-phase network_mode. The README discloses the deviation. Maintainers should confirm whether that is acceptable.
  • S2 (Step 4, parity subset). There is no --split parity; the parity subset comes from --examples 30 instead. This is disclosed (README.md:273), but the spec says to support --split parity and publish a parity tag. A --split parity alias for --examples 30 would be cheap to add.
  • S3 (ADP-COST / metadata schema). In adapter_metadata.json:
    • parity_costs: 5.0 is numeric. That is accepted, but a string like "$5" is the canonical form.
    • supported_agents: null should be ["None"].
    • registry_benchmark_size: null should be an integer. It is null because registration is deferred.
    • added_agents should include the version: browsecomp-simple-evals-one-shot@0.1.0.
  • S4 (parity_experiment schema). dataset_pr should be a string[], not null (deferred; use [] or keep the warning). original_parity_repo points to unpatched upstream, while the experiment used patched upstream plus a script from this repo (see B1).
  • S5 (README, oracle). The README never states the oracle result (1266/1266, reward 1.0). That appears only in the parity_experiment.json notes. The "oracle screenshot" link goes to the root of PR #2355, not to a specific comment. State the result in the README.
  • S6 (ADP-README, parity table).
    • The Codex agentic row (one run, "Different undisclosed harness") sits inside the parity table, which automated parsers read. Move it to Notes & Caveats or a separate table.
    • Dataset Size should read "30 (2.4%)".
    • Column headers differ from the spec template, e.g. "Number of Runs" vs. "Runs".
  • S7 (agent version format). parity_experiment.json says agent is browsecomp-simple-evals-one-shot@0.1.0, but reference_agent.version() returns 0.1.0+simple-evals.652c89d0ca9d. This is minor.

Minor / informational

  • __init__.py re-exports BrowseCompAdapter and BrowseCompTask. That is a real re-export, so it's acceptable, but the checklist prefers __all__ = [].
  • official.parse_grader_response is used only by the tests; grader.py has its own copy on purpose so the verifier stays standalone. Acceptable.
  • The template's instruction.md placeholder {official_query} is never substituted; adapter.py:246 overwrites the whole file instead. This is correct, but the placeholder is misleading.
  • The response text the agent controls is pasted into the judge prompt, so prompt injection against the LLM judge is possible. Upstream has the same risk. Running browsecomp-audit doesn't detect it.
  • README.md:121 uses --extra-instruction-path. I did not check whether that CLI flag exists at the Harbor pin; the YAML configs use extra_instruction_paths.

Checklist

1. Adapter code layout and logic

Item Result
src/browsecomp/adapter.py, main.py, task-template/ at the new paths ✅
__init__.py ⚠️ re-exports two classes (meaningful; acceptable)
Template files present (task.toml, instruction.md, environment/Dockerfile, solution/solve.sh, tests/test.sh) ✅
--output-dir, --limit, --overwrite, --task-ids (ADP-CLI) ✅ (also --examples, --dataset-path)
main.py imports from .adapter and calls adapter.run() ✅
Class BrowseCompAdapter with run(self) writing under self.output_dir ✅
pyproject.toml name harbor-browsecomp-adapter; script browsecomp = "browsecomp.main:main" ✅
Legacy layout N/A
Error handling (checksum, row count, missing columns, decryption, CSV parsing, missing file) ✅. Network errors from urlopen propagate without a wrapper, which is acceptable.
Default output datasets/browsecomp ✅
No dead code ✅ (minor duplication noted)
Placeholders {task_id}, {problem_topic}, {answer_b64} populated ✅ problem_topic is JSON-escaped.
Source data maps to the Harbor task correctly ✅ Stable IDs browsecomp-0001…1266; staging writes to a temporary directory then renames it into place.
Edge cases (validation of task-ids, limits) ✅
pathlib, no bare except ✅
Special treatments documented (#67 fix, GPT-5.6 parameter changes) ✅

2. README.md

Item Result
Overview and task count (1,266) ✅
Numbers match JSON (30 tasks, 3 runs, 0.067 / 0.089) ✅
Reproduction commands refer to files that exist ⚠️ The files exist, but the documented commands reproduce GPT-4.1, not the reported GPT-5.6 row (B1).
Links valid ✅ The ones I checked resolve (adapters#44, harbor#2355, HF #265, simple-evals#67, harbor-datasets#246).
Section order (ADP-README) ✅ All 12 sections in order, plus Acknowledgement.
Usage uses uv run browsecomp ✅ uv run --project src/browsecomp browsecomp …; the cd src/browsecomp && uv run browsecomp form is also mentioned.
Reads naturally ⚠️ Dense and partly reads like process notes (migration notes, CI history), but it is informative.

3. task-template/

Item Result
[task].name = "openai/browsecomp__{task_id}" ✅
authors lists all 10 paper authors (ADP-AUTHORS) ✅
No canary strings ✅
No t-bench/harbor comments ✅
test.sh → grader.py writes /logs/verifier/reward.txt ✅
Timeouts/resources reasonable (agent 3600 s, verifier 300 s) ✅
Dockerfiles: agent image is bare python:3.12-slim; verifier image installs openai>=2,<3 ✅
solve.sh is a working oracle (writes the official 3-line format with the exact answer) ✅
version = "1.0" ⚠️ Uses schema_version = "1.3" instead (S1).

4. parity_experiment.json

Item Result
number_of_runs (3) = array lengths (3/3) ✅
URL formats ✅ adapter_pr, parity_pr; ⚠️ dataset_pr is null (S4).
Mean ± SEM consistent ✅ Recomputed (below).
README and JSON consistent ✅
Schema (ADP-PARITY / ADP-STATS) ⚠️ null dataset_pr; original_parity_repo is unpatched upstream.

Recomputed values:

  • Original runs [0.0667 ×3]: mean 0.0667, sample SEM 0.0000. Reported "0.067 ± 0.000". ✅
  • Harbor runs [0.1, 0.0667, 0.1]:
    • mean 0.0889;
    • squared deviations 0.000123, 0.000494, 0.000123, summing to 0.000741;
    • 0.000741 / (3·2) = 0.0001235; √0.0001235 = 0.0111.
    • Reported "0.089 ± 0.011". ✅
  • Range overlap: original [0.0667, 0.0667] vs. Harbor [0.0667, 0.1]. 0.1 ≥ 0.0667 and 0.0667 ≥ 0.0667, so they overlap at the boundary. ✅

5. adapter_metadata.json

Item Result
adapter_builders = Brian Guo (gzybrian@gmail.com), the adapter author ✅
Sizes match (1266 / 30; rate 0.0237 ≈ 30/1266) ✅
ADP-COST: parity_costs: 5.0 ⚠️ Numeric is accepted; a string is canonical.
Schema ⚠️ supported_agents null, registry_benchmark_size null, added_agents without a version (S3).

6. Parity verification

Item Result
Reproduction instructions for both sides ❌ Incomplete for the reported row (B1).
Subset derivation explained (upstream --examples 30, seed 0) ✅
Mean ± sample SEM, ranges overlap ✅ (boundary overlap; weak evidence, B2)
Agent <agent>@<version> ✅ (S7 minor)
Custom agent → also a standard CLI agent run ✅ One Codex + gpt-5.6 agentic run, 24/30. A single run with no original-side counterpart, correctly listed as not parity.
≥ 2 runs per side ✅ 3 vs. 3

Settings comparison (from code; I did not see the request logs):

  • Both sides use system "You are a helpful assistant.", temperature 0.5, max_completion_tokens=2048, reasoning_effort="none", model gpt-5.6-sol, and the same unbounded retry and BadRequest sentinel. Compare reference_agent.py:71-85 with parity_original_gpt56.py:41-79.
  • The grader is gpt-4.1-2025-04-14 with max_tokens 2048 on both sides.
  • Remaining differences: Harbor's outer timeouts and concurrency (8 Harbor trials vs. upstream map_with_progress). These have little effect.
  • The Harbor commit used for the historical runs is not recorded; the README says so.

7. Oracle verification

Item Result
README mentions the oracle results ⚠️ Only as "full-scale oracle results" in HF; the 1266/1266 figure appears only in the JSON notes (S5).
Run on the full benchmark ✅ Claimed 1266/1266. I did not check the HF artifacts file by file.
100% ✅ Claimed.
Exclusions N/A

8. Link verification

Link Result
adapters#44 ✅ BrowseComp migration PR by JoyboyBrian, open
harbor#2355 ✅ Original BrowseComp adapter PR, open
HF parity discussion #265 ✅ "Add browsecomp parity experiments (gpt-5.6-sol, seed-0 30-task subset)", plus agentic job results
openai/simple-evals#67 ✅ group(0) → group(1) fix, unmerged
harbor-datasets#246 ✅ BrowseComp plaintext-leak issue; relevant to the deferred publication
Pinned simple-evals tree ✅ Contents match the claims

Not fetched: the OpenAI model docs page, the platform API reference, and the GitHub Actions run link.

9. PR completeness

  • adapter_pr lists harbor#2355 and adapters#44. ✅
  • harbor#1521 (another BrowseComp adapter by a different author) is mentioned as related work. It is not this adapter's PR, so it correctly stays out of adapter_pr.
  • dataset_pr: there is none, by design (deferred). ⚠️
  • parity_pr: HF #265. ✅

10. Task generation

  • Data loading, checksum, decryption, selection, rendering and atomic writing are all correct. ✅
  • instruction.md is exactly QUERY_TEMPLATE.format(Question=…) with no trailing newline, as upstream builds the message. ✅
  • No generated datasets/ directory exists in the checkout, so I could not compare generated output with the template.
  • The output structure matches the Harbor format, plus tests/Dockerfile for the separate verifier. ✅

11. Oracle smoke test (ADP-SCRIPTS)

  • solve.sh decodes the base64 answer and writes Exact Answer: <answer> to /app/response.txt. That file is transferred to the verifier as an artifact. ✅
  • test.sh runs python /tests/grader.py, which calls the judge and writes the reward on every path. A missing response or non-UTF-8 response scores 0 without an API call. A missing API key raises an error, which is correctly treated as an infrastructure failure. ✅
  • Dependencies: the agent image has python for solve.sh; the verifier image has openai. ✅
  • Linux only; no .bat needed. ✅

12. Trust check

  • The implementation is convincing: verbatim templates, pinned checksum, a disclosed fix applied symmetrically, and honest labeling of the agentic lane and the historical evidence. ✅
  • I found no undocumented shortcuts. ✅

13. Benchmark vulnerability check

  • 13a, solution/answer leakage: solution/ and tests/ (ground truth, grader) are not in the agent image, which is an empty python:3.12-slim with WORKDIR /app. The verifier runs in a separate image. Instructions contain no answers or hints. ✅
    • ⚠️ With public network in the agentic lane, the agent can fetch the encrypted CSV and decrypt it with the public algorithm (B3). It is disclosed and only detected heuristically; it is not prevented.
  • 13b, identity leakage: instruction.md and agentic_instruction.md do not name BrowseComp or OpenAI. Task names and keywords in task.toml mention browsecomp, but that file isn't placed in the agent container. ✅
    • Inherent issue: the question text is publicly searchable, which is part of the benchmark's design.
  • 13c, git history: N/A.
  • 13d, evaluation integrity:
    • The grader, ground truth and judge config are only in the separate verifier image. ✅
    • grader.py always writes reward.txt. ✅
    • The interpreter runs inside the verifier image, where the agent can't put its own programs ahead of it on the PATH. ✅
    • The judge model, prompt and settings live in /tests/official_protocol.json, which the agent cannot reach. ✅
    • The RESPONSE_PATH environment variable is read from the verifier's environment, not the agent's. ✅
  • 13e, shortcuts: no skip flags. The instruction tells the agent to write only /app/response.txt, not the reward. ✅
    • Inherent LLM-judge risk: the agent's response is inserted into the judge prompt, so prompt injection is possible. Upstream has the same risk.

Recommended actions (smallest evidence or changes needed)

  1. Add exact two-sided reproduction commands for the GPT-5.6 parity row, and commit the feat(ifeval): add adapter #67 patch or a fork URL; update original_parity_repo to match (B1).
  2. Have maintainers rule on three things: whether the 30-task, low-accuracy parity scope is enough, whether schema_version = "1.3" is acceptable, and how the dataset will be published (B2, S1).
  3. Provide a per-task list of which tasks each side solved (task IDs only) for the 3+3 runs (B2).
  4. State the 1266/1266 oracle result in the README and link the specific screenshot comment (S5).
  5. Clean up the metadata: string parity_costs, ["None"] instead of nulls, a versioned added_agents entry, and dataset_pr: [] (S3, S4).
  6. Optionally add a --split parity alias, and move the agentic row out of the parity table (S2, S6).
  7. Have maintainers accept or require mitigation for public-CSV leakage before any agentic score is reported (B3).

Not verified: the historical run artifacts on HF file by file, the exact Harbor commit used for the experiments, the actual request payloads, and whether the --extra-instruction-path CLI flag exists at the pin.

@JoyboyBrian

Copy link
Copy Markdown
Author

Follow-up to the adapter review, implemented and pushed in 39b5c42. I checked every B/S item and the five informational observations against the code, the review's contract revision, the pinned Harbor runtime, and the available public artifacts. The remote PR head is confirmed at this commit.

Item Disposition and evidence
B1 — GPT-5.6 reproduction Fixed. The README now gives setup, exact pinned checkout, patch application, seed-0 30-task generation, original runner, Harbor config, and alternating paired repeats. The patch changes only group(0) to group(1). The original runner verifies the patched evaluator's SHA-256 before creating clients or loading data, so an unpatched/different evaluator fails instead of silently scoring zero. original_parity_repo now locates the fork's reproduction bundle containing both patch and wrapper. The historical Harbor revision remains unknown and is explicitly distinguished from today's compatibility pin.
B2 — evidence strength / solved IDs Partially addressed; acceptance and missing original-side evidence remain open. I read all three public Harbor results, the three original summaries/stdout logs, and the oracle result. The README now lists Harbor successes: run 1 = 0862/1048/1195; run 2 = 1048/1195; run 3 = 0152/0862/1195 (all with the browsecomp- prefix), with source links. The original summaries contain only aggregate accuracy; the wrapper discards the returned per-task results. They cannot establish original solved IDs or cross-side overlap. The documentation now explicitly says that 2–3 successes on 30 tasks and boundary-only range overlap do not establish full-benchmark equivalence. A complete 3+3 comparison needs retained original per-task evidence or coordinated new runs.
B3 — public answer-source access Confirmed; not claimed fixed. Public networking allows access to the encrypted CSV, and a heuristic audit is not prevention. The README and agentic config now label the example and historical 24/30 result as exploratory; the public artifacts do not establish enforced egress controls. Maintainers still need to accept that limitation or require externally enforced proxy/search controls before accepting agentic results. No unverified network protection was added or claimed.
S1 — task version Fixed. The template now uses the contract's version = "1.0". At pinned Harbor 99218a46, TaskConfig.handle_version_rename accepts that key; runtime inspection found no task-schema feature gate that removes the separate verifier or artifact transfer. The generated-task test confirms version 1.0, artifact transfer, separate verification, and phase network policies together.
S2 — parity CLI Fixed locally. Added --split parity as an alias for the existing seed-0 --examples 30 selection, with CLI tests verifying identical task IDs and rejection of conflicting selectors before download. Publishing a registry parity tag remains part of the deferred dataset-publication decision.
S3 — metadata Updated. supported_agents is ["None"]; custom-agent metadata includes the implementation's full version; registry_benchmark_size is 0 for this unpublished contribution. The existing numeric cost was already permitted by ADP-COST; it is now canonical "$5", explicitly described as the retained historical estimate rather than a newly audited invoice.
S4 — parity metadata / empty dataset PR array Reproduction link fixed; empty-array suggestion rejected with validation evidence. The repository's check_parity_pr_links reports “Parity PR link empty” for dataset_pr: [] (reproduced locally). null produces a compatibility warning instead. Kept null, documented the deviation and deferred publication, and did not fabricate a PR URL or change the shared validator.
S5 — oracle evidence Fixed. The README explicitly records 1266/1266 completed tasks, zero errors, and mean reward 1.000; I verified those fields and all 1,266 successful trial entries in the public oracle summary. Added a direct screenshot attachment link. The screenshot is in the original PR description, not a separate comment, so the former PR-root link was not a missing-evidence link. This remains historical oracle evidence, not a new run.
S6 — parity table Fixed. Uses the documented column headers, reports 30 (2.4%), and contains only the matched one-shot experiment. The unmatched Codex result is now in Notes & Caveats.
S7 — agent version Fixed. README and metadata consistently use browsecomp-simple-evals-one-shot@0.1.0+simple-evals.652c89d0ca9d, matching reference_agent.version().

The informational observations were also checked:

  • Package exports: retained the two real public re-exports; replacing them with an empty export list is unnecessary and could change callers' API.
  • Grader-parser duplication: retained intentionally. The verifier is standalone; importing the adapter's parser there would add a runtime/package dependency. Existing grader tests verify its behavior.
  • Instruction placeholder: retained the scaffold marker. _render_task replaces the entire instruction with the exact upstream query to preserve its no-terminal-newline contract. The generated-task test verifies exact text and absence of placeholders; there is no unresolved substitution bug.
  • LLM-judge prompt injection: acknowledged explicitly as an inherited risk that the audit does not detect. Changing the official grader prompt would change the measured protocol.
  • --extra-instruction-path: verified present in the pinned Harbor CLI; no change needed.

Validation on macOS/Python 3.13.5: 34 tests passed; Ruff lint/format, adapter type checks, and git diff --check passed. Structural validation: 30 passed, 0 errors, 1 expected warning for deferred dataset_pr. A separate offline check applied the committed patch to the exact upstream blob, accepted LF/CRLF input, completed 30 synthetic original-side tasks with mocked candidate/judge calls, and confirmed that unpatched source stops before any API call.

BrowseComp CI for this head reports action_required; no remote job results are available yet. No live model calls, Docker/Daytona jobs, new parity/oracle experiments, decrypted dataset publication, merge, or deployment was performed. B2's evidence/acceptance decision, B3's contamination-control decision, and dataset publication remain open. This is a response to a conversation comment; it does not mark those decisions resolved.

@JoyboyBrian

Copy link
Copy Markdown
Author

Follow-up on B2: recovery of original-side per-task evidence. I searched the retained local parity workspace, Harbor job archives, upload bundle, and usual temporary/result locations, plus the devmachine user workspace and temporary directories. No paid experiment or model request was rerun.

  • Recovered the three original GPT-5.6 stdout logs. Each is byte-for-byte identical to its already-public HF copy, and records only aggregate correctness 2/30 = 0.06666666666666667 (printed accuracy 0.067), progress, and transport messages. They contain no task IDs, per-task scores, responses, or judge decisions.
  • Verified the original local evaluator. Its checkout is simple-evals@652c89d0ca9df547706735883097e9537d40dc47, and its patched evaluator SHA-256 is 9395baba28512332ac0da27414180c56abf4db237ade50f8a8ac324c50efad50, exactly matching the preflight added in 39b5c42. The historical wrapper invokes eval_obj(candidate) and discards its returned result; the evaluator/aggregator returns per-example data in memory but does not persist it. I found no matching saved GPT-5.6 HTML/JSON/per-task report.
  • Verified all 90 retained Harbor trial results. The three local job summaries are byte-identical to the published summaries; all three runs contain 30 trial results with no exceptions. The successful task IDs match the README: run 1 = 0862/1048/1195; run 2 = 1048/1195; run 3 = 0152/0862/1195.
  • Excluded unrelated devmachine results. Per-task BrowseComp files do survive there, but they belong to the July 14–15 GPT-5.5 Responses API + hosted web-search experiments, with a GPT-5.5 judge (including a 127-question run and its retries). They are not the GPT-5.6 one-shot / GPT-4.1-2025-04-14-judge experiment and cannot supply its missing task scores.
  • An older local GPT-4.1 probe log references temporary HTML/JSON reports that are no longer present; that probe is also a different experiment.

Recovered original stdout checksums:

File Bytes SHA-256
original_gpt56_run1.log 588 6234616a0d194e52c7a854e4f1e37ba8dfb48139e468e405b8cf90a982f3d02a
original_gpt56_run2.log 906 8a7809dd69ee4507955a4954561e519b280829bccaa4bf8b6be5eaf70c3c8634
original_gpt56_run3.log 739 fc75f6ac28bd68fa26aef0f61030377c734fbc06fecff56794c467aa10898c98

Result: the original-side solved IDs remain unavailable in the locations searched; a 3+3 cross-side overlap comparison still cannot be supported. This does not prove no other backup exists. No code changes, invented IDs, decrypted benchmark data, or private trial contents were published, and no new commit was needed. The PR head remains 39b5c427333c387ad518c8704d2c1fcb5a8ab911; B2's evidence gap and maintainer acceptance decision remain open.

@audreina17

Copy link
Copy Markdown
Collaborator

/review-adapter

@github-actions

Copy link
Copy Markdown
Contributor

Adapter review of commit 39b5c42 (applies only to this revision).

Adapter review: browsecomp (PR #44)

Item Value
Reviewed adapter SHA 39b5c427333c387ad518c8704d2c1fcb5a8ab911, read only from the local reviewed-pr/src/browsecomp/ checkout
Contract Adapter contract v1, revision 7b4df9deb2381ae32f26e6cebec06aaa2975dc56
Evidence types Static inspection of adapter code. Submitted artifacts in HF parity discussion #265. Statistics recomputed by hand. No code was executed and nothing was independently reproduced.
Upstream code pin openai/simple-evals 652c89d0ca9df547706735883097e9537d40dc47, recorded in official.py:16, README:7 and README:203-206. I fetched browsecomp_eval.py and simple_evals.py at that commit and compared them.
Dataset pin Official CSV URL plus SHA-256 7b24471c…abf and a check for 1,266 rows (official.py:21-27, adapter.py:144-167)
Harbor runtime Compatibility pin 99218a46 in the test group (pyproject.toml:35). The Harbor revision used for the July 2026 experiments was not recorded; README:238 and README:282-283 say so.
Candidate / judge gpt-5.6-sol on both sides (parity_original_gpt56.py:29, run_browsecomp_parity_gpt56.yaml:21). Judge is gpt-4.1-2025-04-14. The OpenAI SDK version used on the original side is not recorded (unverified).
Prior review I could only see the PR page summary of the earlier automated review. Its findings are re-checked at the end; their full text was not available.

Line citations use the base https://github.com/JoyboyBrian/adapters/blob/39b5c427333c387ad518c8704d2c1fcb5a8ab911/src/browsecomp/.


Acceptance blockers and open maintainer decisions

B1. The dataset is not registered and dataset_pr is null (Step 8; parity_experiment.json schema; ADP-README)

  • Where: parity_experiment.json:16 has "dataset_pr": null, but the schema requires string[]. adapter_metadata.json:25 has "registry_benchmark_size": 0. README:113-126 shows registry commands as "conditional examples".
  • What happens: Step 8 is not complete. The README explains why: BrowseComp's canary forbids publishing the questions as plaintext, so registration is deferred, and discussion is ongoing in harbor#2355 and harbor-datasets#246.
  • Consequence: By the spec's step-completion rules, the adapter cannot be accepted until maintainers decide how to publish (for example, an encrypted or decrypt-at-build scheme) or formally waive registration.
  • Smallest next step: A maintainer decision on publication. If an alternative such as decrypt-at-build is chosen, it will need its own oracle validation.

B2. The agentic lane lets the agent reach the ground truth (checklist §13a). It is disclosed but not mitigated.

  • Where: task-template/task.toml:42-48 sets the agent phase and environment to network_mode = "public". run_browsecomp_agentic.yaml:1-2 and README:340-363 disclose the problem.
  • What happens: A web-enabled agent can download the public encrypted CSV and decrypt it with the public XOR/SHA-256 algorithm (official.py:75-88). That gives it the answer for every task. audit.py is only a string heuristic after the fact.
  • Consequence: The 24/30 Codex result cannot be treated as a clean score. That Codex run is also the only standard-CLI-agent run backing a parity claim made with a custom agent (checklist §6). Matching upstream's design does not waive the integrity invariant.
  • Smallest correction: The pinned Harbor config supports a per-phase allowed_hosts alongside network_mode (PhaseNetworkPolicyConfig in harbor/models/task/config.py at 99218a46).
    • The one-shot agent calls the API from the host and only uploads a file (reference_agent.py:157-176), so its container needs no egress at all.
    • In the agentic lane, Codex's web_search: live is a hosted tool, so the sandbox may only need the OpenAI API host. Restricting the agent phase to that host would block direct downloads of the CSV.
    • It is unverified whether Codex still works under that restriction, and hosted search could still surface mirrors. Maintainers should decide whether to require this, and any agentic numbers should be re-labeled to match.

Parity (ADP-PARITY, ADP-STATS): mechanically met, weak evidence (disclosed)

I recomputed the statistics from the raw run arrays (parity_experiment.json:26-35):

Side Raw runs Mean Sample SEM Reported
Original [0.0667, 0.0667, 0.0667] 0.0667 0.0000 0.067 ± 0.000 ✔
Harbor [0.1, 0.0667, 0.1] 0.0889 0.0111 0.089 ± 0.011 ✔
  • Range overlap: The original range is [0.0667, 0.0667] and Harbor's is [0.0667, 0.1]. They touch at 0.0667, so the criterion is met.
  • Run counts: 3 runs per side, matching number_of_runs and the array lengths. The README table (README:186-188) matches the JSON.
  • Artifact check: HF #265 shows result_original_trial{1..3}.json at accuracy 0.0667 (runner "parity_original_gpt56.py @ 652c89d + PR#67"). Harbor run 1 (harbor_parity/2026-07-16__17-48-53/result.json) shows 30 trials, 0 errors, mean 0.1, with solved tasks 1048, 1195 and 0862. This agrees with README:270-275.

P1. Low statistical power, and the original side has no per-task records (Step 5 debug playbook step 3; non-blocking, disclosed)

  • The parity set is 30 tasks out of 1,266 (2.4%), with 2–3 correct answers per run. The ranges overlap only at one boundary value, and all three original runs are identical.
  • parity_original_gpt56.py:109-110 calls eval_obj(candidate) and throws away the returned EvalResult, so the original side's solved-task IDs cannot be recovered. Comparing which tasks each side solved is therefore impossible (README:277 acknowledges this).
  • Whether this subset is enough is a maintainer decision.
  • Smallest validation step: In any future coordinated run, save the per-example scores from the returned results. No change to scoring is needed.

P2. Configuration pins (Step 5 checklist items 1–3, 6; partially disclosed)

  • The Harbor commit for the July runs and the SDK and dependency versions on the original side are not recorded (README:238, 282).
  • gpt-5.6-sol is a model ID but not a dated snapshot. Whether a dated ID exists is unverified.
  • Request parameters are matched. The Harbor one-shot request (reference_agent.py:78-81) and the original-side sampler (parity_original_gpt56.py:64-70) both send temperature=0.5, max_completion_tokens=2048 and reasoning_effort="none". Both use the same system message, the same unbounded retry loop, and the same BadRequest sentinel.

Non-blocking issues

N1. In the one-shot lane, an infrastructure failure on the candidate call is scored as 0 (checklist §11; SKILL "Infrastructure failures")

  • Where: reference_agent.py:109-138 retries forever, bounded only by the agent timeout (3600 s). After a timeout no /app/response.txt exists, and grader.py:101-103 writes reward 0 with reason "missing response".
  • Consequence: In the agentic lane, a missing file is a genuine agent failure. In the one-shot lane it can only come from an infrastructure failure, which then lands in the denominator as a zero. The reported runs had n_errors: 0, so the published numbers are not affected.
  • Suggestion: Document that one-shot trials with an agent exception must be counted as infrastructure failures, not scored as 0.

N2. Stale or inconsistent configs and docs (ADP-README)

  • run_browsecomp_parity.yaml:1-3 calls the GPT-4.1 config the "Parity lane", says the original side "runs unmodified", and points to a README section "Parity caveat" that does not exist. In fact, no GPT-4.1 parity is reported; README:190 describes only a 0/30 probe.
  • README:287 cites contract revisions 08cbb3a… and c6eb509…, not the current base 7b4df9d.
  • run_browsecomp.yaml:21 sets n_tasks: 1. The spec says run_<adapter>.yaml should run the full adapted dataset. The one-task limit is a deliberate cost choice explained in a comment, but the README should say so explicitly.
  • The YAML comments (run_browsecomp_parity_gpt56.yaml:4-6, run_browsecomp_agentic.yaml:26-28) use --examples 30, while the README uses --split parity. The two are equivalent (main.py:76).

N3. Byte-exact instruction delivery is unverified (static inspection only)

  • adapter.py:242-246 writes the official query with no trailing newline, and reference_agent.py:159-162 sends Harbor's instruction as the user message.
  • I did not verify whether Harbor passes instruction.md through byte-for-byte. Harbor run 1 used about 200 input tokens per task, which is plausible, but there is no original-side usage figure to compare against.

N4. Inherited judge prompt-injection risk (§13d; disclosed at README:344)

  • The agent's response is inserted into the judge prompt unmodified, so text such as correct: yes could influence the judge.
  • This is inherited from the upstream protocol, and changing the judge prompt would change the benchmark. It is noted as a disclosed limitation, not as acceptable integrity.

Fidelity trace against upstream (static inspection)

One representative one-shot task, from generation to reward:

  1. The CSV is verified by SHA-256 and row count, then decrypted with a byte-identical derive_key/decrypt (official.py:75-88). The only difference from upstream is zip(strict=True), which is equivalent because the key length equals the ciphertext length.
  2. Subset selection uses random.Random(0).sample(tasks, n) over the rows in CSV order (adapter.py:198-204). This is the same as upstream BrowseCompEval.__init__. Upstream treats num_examples=0 as the full set, and so does the adapter (adapter.py:85).
  3. instruction.md is set to exactly QUERY_TEMPLATE.format(Question=…). The template matches upstream verbatim (official.py:41-48). The {official_query} placeholder in the template file is overwritten entirely.
  4. The candidate call uses the system message "You are a helpful assistant." plus the user query. That matches ChatCompletionSampler with OPENAI_SYSTEM_MESSAGE_API.
  5. The response is uploaded byte-for-byte to /app/response.txt. Only that file is transferred to the verifier (task.toml:3).
  6. A separate verifier image (tests/Dockerfile) runs grader.py. It uses GRADER_TEMPLATE, which is verbatim upstream (official.py:51-70). Judge settings are model gpt-4.1-2025-04-14, system message, temperature 0.5 and max_tokens 2048, matching upstream's grading_sampler (simple_evals.py).
  7. The judgment is parsed with the group(1) fix (grader.py:28-33). The reward is 1 for "yes" and 0 otherwise, and it is always rewritten in the separate verifier.

Exit paths:

  • Missing file: reward 0 (see N1).
  • Non-UTF-8 response: reward 0.
  • Empty file: sent to the judge, which matches upstream.
  • Judge BadRequest: reward 0, which matches upstream's sentinel.
  • Other judge errors: unbounded retry until the 300 s verifier timeout, ending as a verifier error with no reward. That is correctly an infrastructure failure.
  • Missing API key: raises, so no reward is written.

Disclosed deviation from upstream: Upstream's group(0) bug scores every parseable judgment as wrong. The adapter applies openai/simple-evals#67 symmetrically: the original side runs with simple-evals-grader.patch, which is SHA-checked at parity_original_gpt56.py:33-44. This is reported in the README rather than silently corrected on only one side, which is what the guidance asks for.

Oracle: HF oracle/browsecomp-oracle-full/result.json (submitted artifact) shows 1266/1266 completed, 0 errors, mean reward 1.0. This shows that the oracle response format plus the LLM judge accept the reference answers. It is not parity evidence.

Integrity checks (§13)

Check Result
Solution or tests copied into the agent image No. environment/Dockerfile is only FROM python:3.12-slim plus WORKDIR /app.
Where ground truth and the API key live tests/ground_truth.json and the API key exist only in the separate verifier image or env (task.toml:26-40).
Answer in the instruction No. The instruction contains only the question.
Can the agent write the reward No. The reward is written fresh in a separate verifier and is not agent-writable.
RESPONSE_PATH override Applies only in the verifier, so the agent cannot control it.
Benchmark identity leakage (13b) No benchmark name, ID, URL or canary in agent-visible files. The browsecomp keyword in task.toml is metadata. The agentic suffix mentions "Harbor" but not the benchmark.
Network-based answer access B2

Harbor standards

  • Layout (§1): adapter.py, main.py and task-template/ are under src/browsecomp/.
    • The BrowseCompAdapter class has a run() method that writes under self.output_dir.
    • pyproject.toml has name = "harbor-browsecomp-adapter" and the script browsecomp = "browsecomp.main:main".
    • __init__.py re-exports the adapter classes, which is a meaningful export.
  • ADP-CLI: --output-dir (default datasets/browsecomp), --limit, --overwrite, --task-ids and --split parity are all present (main.py:19-64). The parity split is mutually exclusive with --examples, and the adapter rejects combining it with --limit or --task-ids (adapter.py:94-95).
  • ADP-AUTHORS: The ten paper authors are listed without emails (task.toml:7-18). This is acceptable.
  • ADP-SCRIPTS: Linux .sh scripts only. test.sh uses set -euo pipefail and calls python /tests/grader.py in the verifier image.
  • ADP-COST: "$5" is in canonical string form (adapter_metadata.json:35) and is labelled a historical estimate.
  • ADP-README: All 12 required sections are present and in order, with an optional Acknowledgement at the end. Reproduction steps for both sides are at README:194-238. Usage shows uv run --project src/browsecomp browsecomp and mentions the canonical cd src/browsecomp && uv run browsecomp.
  • Metadata consistency: Sizes are 1266 and 30, with a sampling rate of 0.0237 (= 30/1266). They agree between the JSON files and the README. adapter_builders lists the adapter author, not the benchmark authors.
  • Task names: openai/browsecomp__browsecomp-NNNN comes from CSV row order. Names are stable and registry-safe.

Links checked

Link Status
adapters#44 Open, by JoyboyBrian, title "[Ready for Review] Adapter: browsecomp"
harbor#2355 Open; original PR, kept for history
HF parity discussion #265 Open; contains the original/Harbor result collections, Harbor job results and the full oracle
simple-evals at the pinned commit Reachable
Harbor config.py at 99218a46 Confirms support for artifacts, [verifier.environment], environment_mode = "separate", keywords and authors

I did not fetch the following (unverified): the screenshots, the GPT-5.6 model page, harbor-datasets#246, harbor#1521, and the Actions job link.

Coverage

Dimension Status Evidence Remaining gaps
Harbor standards (layout, CLI, ADP-* fields, README) Assessed; issues found (B1, N2) main.py, pyproject.toml, JSON files, README Registration decision
Upstream fidelity (prompts, decryption, sampling, judge, aggregation) Assessed; deviation disclosed (#67 fix) official.py compared with upstream browsecomp_eval.py and simple_evals.py at 652c89d Byte-exact instruction delivery through Harbor (N3)
Generation Assessed (static) adapter.py:142-313 Real CSV not downloaded; generated tasks not inspected
Agent execution (one-shot) Assessed (static); issue N1 reference_agent.py Runtime unverified
Agent execution (agentic) Issues found (B2) task.toml, run_browsecomp_agentic.yaml No enforced contamination controls
Grading and integrity Assessed; disclosed N4 grader.py, test.sh, both Dockerfiles —
Parity statistics Assessed and recomputed; passes overlap; weak (P1, P2) parity_experiment.json, HF #265 Per-task original results; Harbor revision and SDK pins
Oracle Submitted artifact (1266/1266) HF oracle result.json Not reproduced

Earlier automated review, re-checked at this SHA (from the PR page summary only)

Earlier finding Status Evidence
Parity reproduction steps did not match the GPT-5.6 row Resolved parity_original_gpt56.py, run_browsecomp_parity_gpt56.yaml, README:194-238
Weak 30-task evidence Still present, disclosed P1
Answer leakage in the agentic lane Still present, disclosed B2
Schema deviations Partly resolved Task version = "1.0" and --split parity added; dataset_pr: null remains (B1)

Summary

The one-shot lane closely follows the pinned simple-evals protocol. The single deliberate deviation (the #67 grader fix) is disclosed and applied symmetrically on both sides. Verifier isolation is sound, and the reported parity statistics match the raw runs and meet the range-overlap rule.

Acceptance still depends on:

  • a maintainer decision on dataset publication (B1);
  • a maintainer decision on contamination controls for the agentic lane, including whether its 24/30 Codex run is acceptable as the standard-CLI-agent run (B2);
  • a maintainer decision on whether the small 30-task parity sample is sufficient (P1).

Smaller issues: one-shot infrastructure failures are scored as 0 (N1), and several configs and doc references are stale (N2). Byte-exact instruction delivery through Harbor is unverified (N3), and the judge's prompt-injection risk is inherited from upstream and disclosed (N4).

…notes

- Treat one-shot trials with AgentTimeoutError and a missing response as
  infrastructure failures to rerun, not incorrect answers.
- Describe run_browsecomp_parity.yaml as the GPT-4.1 conformance profile
  and drop its link to a nonexistent README section.
- Use --split parity in config comments, document the one-task oracle
  smoke default, and record the contract recheck at 7b4df9d.
@JoyboyBrian

Copy link
Copy Markdown
Author

Follow-up to the adapter review of 39b5c42: N1 and N2 are addressed in 63dec4a. Docs and config comments only; no prompt, sampling, or scoring change.

Item Disposition
N1 — one-shot infra failures scored as 0 Documented in the one-shot lane protocol and Troubleshooting. At the pinned Harbor 99218a46, SingleStepTrial._run_agent records AgentTimeoutError in exception_info and still runs the verifier, which writes reward 0 / missing response. Such trials are now defined as infrastructure failures to exclude and rerun. Other agent exceptions stop the trial before verification. The reported parity runs had no trial exceptions, so the published numbers are unchanged.
N2 — stale configs/docs run_browsecomp_parity.yaml now describes itself as the historical GPT-4.1 conformance profile (0/30 probe, not reported parity) and points to the existing "Corrected scoring bug" section. All config comments use --split parity. The README states that run_browsecomp.yaml is deliberately a one-task oracle smoke test and explains how to run all 1,266 tasks. The README also records the contract recheck at 7b4df9d; docs/adapters.mdx and scripts/validate_adapter.py are unchanged since c6eb509.

B1, B2 and P1 remain maintainer decisions. N3 and N4 are unchanged (unverified, and a disclosed inherited risk, respectively).

Validation: pytest src/browsecomp/tests 34 passed; all five configs parse as YAML; validate_adapter.py browsecomp 30 passed, 0 errors, 1 expected warning (dataset_pr = null).

@JoyboyBrian

Copy link
Copy Markdown
Author

@crystalxyz @audreina17 @Slimshilin Two items from the latest adapter review need a maintainer decision before this adapter can move forward. Both came up in harbor#2355 and are still open. Below are the options for B1 and a proposal for B2. I'll implement whichever direction you choose.

B1 — Dataset publication (dataset_pr: null)

BrowseComp is distributed encrypted upstream, and its canary says the data should never appear as plain text online. In harbor#2355 I asked how encrypted-upstream benchmarks should be registered. The only maintainer reply was "Feel free to populate the dataset PR once you are ready". My follow-ups on the plaintext concern and on a leakage-safe alternative have had no response, and neither has harbor-datasets#246 (plaintext browsecomp-plus, about 66% of BrowseComp). Step 8 of docs/adapters.mdx has no waiver path. Options:

  1. Plaintext registration. This is the standard flow and the smallest change, but it publishes all 1,266 question–answer pairs without the canary.
  2. Encrypted, scaffolding-only registration (the theagentcompany pattern). Registered tasks contain no question or answer text. The environment and verifier download the official CSV, check its SHA-256, and decrypt inside their containers. This touches the task template and both lanes, and needs a new full oracle run.
  3. Waive registration and keep only local, checksum-pinned generation. As far as I can tell, no merged adapter has skipped registration.

B2 — Agentic-lane answer access

BrowseComp measures open-web browsing, so the agentic lane needs public networking. With public networking, an agent can also reach the public CSV and decrypt it. This is inherent to the benchmark: the questions and the decryption method are public by design, and upstream simple-evals has no agent loop or contamination control to follow. The limitation was disclosed in harbor#2355 but not discussed there, and the 24/30 Codex run was the requested standard-CLI-agent run.

I considered the agent-phase allowlist suggested in the review. The pinned Harbor 99218a46 offers only public, no-network, and allowlist network modes; there is no denylist. An allowlist would keep only harnesses with provider-hosted search working, such as Codex web_search. Harnesses that browse from inside the container, such as Terminus 2, could not browse at all. It also would not block hosted search results that surface plaintext mirrors, including browsecomp-plus above.

Proposal: keep public networking and accept this as a disclosed limitation of the benchmark. The README already labels agentic results as exploratory and lists the blocklist and audit steps required before reporting an agentic score. The adapter also ships the browsecomp-audit scanner. The one-shot parity lane is unaffected, because its container needs no network access.

Please confirm whether this is acceptable. Please also confirm whether the 24/30 Codex run is acceptable as the standard-CLI-agent run that backs the custom-agent parity claim.

@anson627

anson627 commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Review at 63dec4ac. I ran the adapter's offline test suite on sandbox: 34 passed. I also inspected the public parity artifacts and recomputed the run-array statistics

Review decisions on the open scope questions:

  • 30-task parity: acceptable as a clearly labeled pilot on the same seed-0 30-task sample, subject to maintainer acceptance of that limited scope. Three repetitions do not provide 90 distinct tasks. Original 0.0667 ± 0 vs Harbor 0.0889 ± 0.0111 satisfy the repository's range-overlap rule only at the boundary, with just 2–3 successes per run. This does not establish equivalence on all 1,266 tasks. The historical full oracle is a separate validation claim.
  • Standard CLI / search lane: the submitted 24/30 Codex run demonstrates that the standard agentic path runs, but it is not matched upstream parity or contamination-controlled benchmark evidence. The one-shot lane uses the pinned upstream protocol; search changes the tools and evaluation system. Public networking can reach benchmark-answer sources, and a clean heuristic audit does not enforce prevention. Before treating agentic accuracy as reportable benchmark evidence, require externally enforced answer-source restrictions with an auditable policy, or explicitly accept and label the limitation.
  • Publication: keep registration/decrypted task publication deferred. An encrypted/scaffolding-only registration needs an implemented, checksummed local-decryption path and validation before publication, or an explicit maintainer policy exception. The proposed flow is currently documentation, not an implemented release path. I did not publish any dataset content.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants