Skip to content

修复 WebArena 轨迹重放评测并发布五方法对比与独立解读 - #23

Merged
lanyue-llk merged 71 commits into
mainfrom
codex/browser-root-cause-report
Sep 22, 2026
Merged

lanyue-llk merged 71 commits into
mainfrom
codex/browser-root-cause-report

Conversation

@lanyue-llk

@lanyue-llk lanyue-llk commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

结果与范围

同一批 90 题,保留原三组结果,追加两组 1.1.9 方法;共 450 条结果。

方法 通过
Chromium 90/90
Moli 1.1.8 55/90
Moli 1.1.8 · PR 640(39d75b69) 90/90
Moli 1.1.9 56/90
Moli 1.1.9 · PR 640(f315ff26,release) 90/90

每组开始重置一次站点,按冻结顺序执行,每题使用新浏览器上下文。旧结果不被新方法覆盖。不同日期和负载下的耗时不用于声称源码提速。

根因、合同与证据

  • 区分浏览器缺陷、共享观察器、站点就绪、网络传输、轨迹及评测规则。183、198、288 的共享 Magento 观察器修复保留在公共流程中。
  • 69 条失败结果均有绑定当前证据的复核;381 条通过结果未作独立全答案复核。失败分类可下钻到对应题目、准确报错、相关动作、原因、处理状态及完整净化证据。
  • 披露 12 项任务合同变更、8 个 fork 修改任务及 7 个本地/fork 重叠任务,不把修正版当作未修改的上游数据集。
  • 新增两组在 448、510 分别恢复最后一次保存和商品数量验收;旧三组保留历史规则与成绩,详情列明规则版本差异。这两题不能作为纯浏览器差异解释。
  • 相关源码:Moli PR #640;数据集及评测器:WebArena-Verified PR #2。

报告与独立解读

  • 报告
  • 独立报告解读
  • 保留 14 节机制分析、具体实验和逐题详情;主导航可从结果详情返回报告解读。
  • 修复独立下载版把结果链接拼到 /v/分享码/results.html 下导致的 404,保留分享权限、失败类别与方法筛选;原图下载也使用可访问的资源地址。
  • 独立 HTML 包含完整标准文档结构及内嵌插图。默认只生成中文,英文入口显示未生成说明;显式请求才生成英文。

已有验证

  • 相关解释页与报告测试:70 项通过;覆盖入口缺失、错误相对路径、重复入口、当前页标记,以及分享参数/筛选条件丢失的反向控制。
  • 发布包:549 个 HTML 页面、13,431 条链接、48 个桌面/窄屏与明/暗主题状态。
  • 450 条测量结果及解读正文保持不变;本次是页面访问和展示修复,没有重跑浏览器评测。
  • 用户要求停止追加本地测试之后,仅进行提交、发布及远端状态核对。

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 5m 39s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查 PR diff(48 个文件,+9649 / -513)
  • 发布审查结论

Review 结论

有条件通过

核心目标(历史分不变、视口缺陷证据、诊断附录、hash 绑定)实现正确。发现两处需在合并前或发布前确认的问题,另有一处术语不一致建议修复。


问题及建议

[P1] scripts/check_webarena_replay_report.py:207-261:fixes.html 及 en/fix/*.html / en/diagnostic/*.html 未纳入报告内容检查

新增的"修复日志"导航页(fixes.html/en/fixes.html)和修复详情页(fix/*.html/en/fix/*.html)、诊断附录页(diagnostic/*.html/en/diagnostic/*.html)未加入 core_names 列表(第 207-214 行),也未传入 _check_english_localization(第 255-261 行)。因此这些页面绕过了:(1)禁用内部词检查;(2)手写 SVG 检查;(3)英文本地化检查(CJK 可见文本、title、accessibility 属性)。
check_webarena_replay_visual.py 已正确将 fixes.html 加入视觉路由,但不能替代文本内容验证。
AGENTS.md 要求:"New or substantially rewritten report renderers must wire semantic presentation checks into their release gate."

建议:将 "fixes.html" 加入 core_names(或单独增加同等检查);在 _check_english_localization 调用中补充 *(root / "en/fix").glob("*.html") 和 *(root / "en/diagnostic").glob("*.html")(在有对应目录时)。


[P1] harness/trajectory_replay/webarena_report.py:1450 等处:Trajectory Replay 当前发布目标未绑定

PR body 明确声明:"The existing report profile points to the COM deployment; the available CN credential lists no sites, so the target must be resolved before publishing."
AGENTS.md:"Do not publish while … the publication target is ambiguous." 和 "Never embed a default deployment hostname or borrow a target from another report."
现有代码本次不发布,属于正确的保守行为;但若在本 PR 合并后直接发布而不先解决目标绑定,会违反发布规范。

建议:在合并前记录目标解决方案,或在 scripts/publish_webarena_replay_artifact_site.py 入口处加断言,在 CN 站点未绑定时明确拒绝。


[P2] harness/trajectory_replay/webarena_report.py 多处:英文标签 "Qualified" 更名不完整

本 PR 将部分英文标签从 "Qualified input/trajectory" 改为 "Fixed input/trajectory",但下列位置仍保留旧术语,造成同一报告内术语不一致(中文侧"标准轨迹"无变化,问题仅在英文侧):

  • L259:"Qualified arguments" 按钮
  • L268:"Qualified trajectory and official evaluation passed" 通过文字
  • L272:"Qualified action arguments" 步骤对话框标题
  • L1450:"Qualified actions" 数据集表头

建议:统一到 "Fixed arguments" / "Fixed trajectory and official evaluation passed" / "Fixed action arguments" / "Fixed actions",或回退为全部保留 "Qualified",避免同一报告术语混用。


其余已核验:原始 90 题 verdict 不变(evaluation/browser-use/current-report.json 仅添加 trajectory_replay_bridge 绑定);LEGACY_REPLAY_VALIDITY_INPUTS 以三元执行哈希键(results + dataset + profile SHA-256)唯一标识遗留批次;_check_metric_populations 正确验证全量分布分母与成功子集分母分离;publish/ 已在 .gitignore 保护;_validate_projection 在第 637 行定义;subprocess 仅在诊断分支以列表参数调用 git;viewport 验证三点(登录前、登录后、Agent 后)完整实施。

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 4m 14s —— View job


PR Review

  • Gather context
  • Read key changed files
  • Identify bugs and security issues
  • Post findings

Findings

No critical bugs or security vulnerabilities were found. Several minor issues are noted below.


1. Inconsistent symlink check for fix-log source path — harness/fix_log.py:43

if source.is_symlink() or not source.is_file() or _sha256(source) != binding["source_sha256"]:

This only checks whether source itself is a symlink, but not whether any parent directory is a symlink. Contrast with the artifact path check at line 83–84, which does check parents:

or path.is_symlink()
or any(parent.is_symlink() for parent in path.parents)

An attacker who can create a symlink one level above the source path could redirect the read. The SHA-256 check limits the blast radius but doesn't eliminate the inconsistency.

Fix this →


2. expanduser() on evidence paths with no root containment — harness/trajectory_replay/retrieval_acceptance.py:837

raw = Path(str(ref.get("path") or "")).expanduser()
if any(path.is_symlink() for path in [raw, *raw.parents]) or not raw.is_file():
    raise ValueError("missing or unsafe current-run retrieval evidence")

Unlike load_contracts (line 789–793), this has no root.resolve() not in raw.resolve().parents containment check. expanduser() also allows ~/ paths. The SHA-256 integrity check mitigates arbitrary reads, but the defense-in-depth posture is weaker than the rest of the codebase. The same pattern appears in harness/webarena_state.py:480.


3. LOCAL_PATH_RE in webarena_report.py omits /opt/ and /root/

LOCAL_PATH_RE = re.compile(r"/(?:Users|home|private|tmp|var)/[^\s\"']+")

publication.py's _LOCAL_PATH includes /opt/ but this regex does not. Neither covers /root/, which is the home directory when running as root. If the report pipeline ever runs as root, home paths in evidence strings would not be redacted. The fix_log.py public-text check shares the same gap.


4. next() without a default in diagnostic_closure.py:196

observation = next(
    item for item in observations if item["browser"] == audit["browser"]
)

If no observation matches audit["browser"], this raises a bare StopIteration instead of a ValueError. In practice the preceding browser-set validation ensures this path is unreachable, but a defensive next(..., None) with an explicit if observation is None: raise ValueError(...) would make the invariant explicit and avoid a confusing exception type surfacing to callers.


No issues were found with:

  • The JSON Pointer / projection evaluation logic in retrieval_acceptance.py (properly sandboxed, no code execution)
  • The CAPTURE_SCRIPT in webarena_state.py (CSS selectors passed as data, not interpolated into JS)
  • The HAR boundary/snapshot logic in har.py (immutable snapshots taken before event-loop pumping)
  • The model history continuity check in model.py (content snapshot rather than count is a correct fix)
  • Path traversal guards in load_contracts (the root.resolve() not in raw.resolve().parents check is sound)
  • The multipart boundary construction in publish_webarena_replay_artifact_site.py (uses SHA-256 of the archive, not user input)

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35202694197. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 3m 5s —— View job


PR #23 代码审查 / Code Review

  • 读取上下文 / Gather context
  • 审查关键变更文件 / Review key changed files
  • 发布审查结论 / Post findings

先前审查问题的跟进 / Follow-up on prior review findings

Three of the five issues from the previous automated reviews are already fixed in this PR's code:

  • ✅ fix_log.py:43 — parent symlink check is present (any(parent.is_symlink() for parent in source.parents))
  • ✅ LOCAL_PATH_RE — already includes /root/ and /opt/ (r"/(?:Users|home|root|private|tmp|var|opt)/[^\s\"']+")
  • ✅ diagnostic_closure.py:196 — next() already uses a None default with an explicit guard

Two findings remain unaddressed:


[Bug] retrieval_acceptance.py:837 — expanduser() with no root containment check

raw = Path(str(ref.get("path") or "")).expanduser()
if any(path.is_symlink() for path in [raw, *raw.parents]) or not raw.is_file():

expanduser() allows ~/-relative paths, and there is no containment check (root.resolve() not in raw.resolve().parents). The load_contracts function at line 789–792 of the same file applies both guards. The SHA-256 integrity check limits the blast radius, but the inconsistency weakens defense-in-depth.

Fix this →


[Bug] webarena_report.py — Mixed "Fixed" / "Qualified" English labels in the same report

Lines 490, 520, 523, 761, and 1450 still use "Qualified arguments", "Qualified trajectory and official evaluation passed", "Qualified action arguments", "Qualified trajectory is missing this step", and "Qualified actions", while lines 488, 522, and the narrative text use "Fixed input" / "Fixed trajectory". The Chinese side (标准轨迹) is consistent; the English side is not. Users reading the EN report will see contradictory terminology within the same page.

Fix this →


No other bugs or security issues found. The new publish idempotency logic, atomic_write, CAPTURE_SCRIPT data passing, pending_operation key validation, and diagnostic_closure pairing checks are all correct.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 3m 29s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查 PR diff(48 个文件,+9676 / -514)
  • 发布审查结论

Review 结论

有条件通过

核心目标(历史分不变、视口缺陷证据、诊断附录、hash 绑定)实现正确。发现一处需在合并前修复的 P1 缺口,另有一处 P2 术语不一致建议修复。前次审查指出的三个问题(fix_log.py:43 父目录 symlink 检查、diagnostic_closure.py:196 next() 无默认值、LOCAL_PATH_RE 缺少 /opt/ 和 /root/)均已在当前代码中修复,不再列入。


问题及建议

[P1] scripts/check_webarena_replay_report.py:207-261:fixes.html、diagnostics.html 及 en/fix/*.html / en/diagnostic/*.html 未纳入文本内容检查

本 PR 新增了 fixes.html、diagnostics.html、fix/{id}.html、diagnostic/{task_id}.html 及其英文镜像页,但 core_names(第 207-214 行)和 _check_english_localization 调用(第 255-261 行)均未包含这些页面,导致:

  • 禁用内部词(用户提示词、median 等)检查绕过
  • 手写 SVG 检查绕过
  • 英文本地化检查(CJK 可见文本、<title>、aria-label/placeholder 属性)绕过

check_webarena_replay_visual.py 已正确将 fixes.html(第 119 行)、fix/*.html(第 124 行)和 diagnostic/*.html(第 127-128 行)纳入视觉路由,但不能替代文本内容验证。AGENTS.md 要求:"New or substantially rewritten report renderers must wire semantic presentation checks into their release gate."

建议:将 "fixes.html"、"diagnostics.html" 加入 core_names;在 _check_english_localization 调用中补充 *(root / "en/fix").glob("*.html") 和 *(root / "en/diagnostic").glob("*.html")(目录存在时);在禁用词循环中同样覆盖 fix/*.html 和 diagnostic/*.html。


[P2] harness/trajectory_replay/webarena_report.py 多处:英文标签 "Qualified" 与 "Fixed" 混用

本 PR 将部分英文标签从 "Qualified" 改为 "Fixed",但下列位置保留了旧术语,与同页 "Fixed input" / "Fixed trajectory" 并存:

  • L490:"Qualified arguments" 按钮
  • L520:"Qualified trajectory and official evaluation passed" 通过文字
  • L523:"Qualified action arguments" 步骤对话框标题
  • L1450:"Qualified actions" 数据集表头

中文侧"标准轨迹"无变化,问题仅在英文侧。

建议:将上述位置统一为 "Fixed arguments" / "Fixed trajectory and official evaluation passed" / "Fixed action arguments" / "Fixed actions",或全部回退为 "Qualified",避免同一报告术语混用。


残余风险(不阻塞合并)

  • retrieval_acceptance.py:837 对 evidence 路径使用 expanduser() 且无 root 包含检查,较 load_contracts(L790-793)防御层次稍弱;但 SHA-256 已提供完整性保护,且 evidence 路径为运行时持久化的绝对路径,实际风险低。
  • 当前 profile 已明确绑定 COM 目标(site_slug: "7dF7uNK5SKIx",expected_version: "ver_fcd443ac19fe403f8baa3442262246e1"),CN 部署问题为未来发布步骤,不影响本次合并。

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35203503207. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查 PR diff(48 个文件)
  • 发布审查结论

View job run

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 1m 42s —— View job


PR #23 Code Review

  • Gather context
  • Read key changed files
  • Post findings

Two bugs remain unfixed from prior reviews. All other previously flagged issues are confirmed fixed in the current code.


[Bug] retrieval_acceptance.py:837 — expanduser() with no root containment check (third review cycle)

raw = Path(str(ref.get("path") or "")).expanduser()
if any(path.is_symlink() for path in [raw, *raw.parents]) or not raw.is_file():

expanduser() resolves ~/… paths outside the project tree, and there is no raw.resolve().is_relative_to(root.resolve()) containment guard. The analogous path in webarena_state.py:481 already omits expanduser() and the symlink check there covers parents correctly. The analogous load_contracts function in the same file (retrieval_acceptance.py:789–793) applies both guards. The SHA-256 check at line 841 limits blast radius but does not eliminate the inconsistency.

Fix this →


[Bug] publish_webarena_replay_artifact_site.py:167–172 — closure path missing parent symlink check

closure = Path(str(attestation.get("diagnostic_closure") or ""))
checks["diagnostic_closure"] = (
    closure.is_file()
    and not closure.is_symlink()
    and sha256(closure) == source_closure_sha
)

This checks closure.is_symlink() but not any(parent.is_symlink() for parent in closure.parents), unlike every other path guard in this codebase (e.g. fix_log.py:44, webarena_state.py:203). The SHA-256 check bounds the impact, but the pattern is inconsistent.

Fix this →


Previously flagged issues now confirmed fixed:

  • ✅ webarena_report.py — no remaining "Qualified" strings; all renamed to "Fixed"
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html now covered by forbidden-word, SVG, and English localization checks
  • ✅ fix_log.py:43 — parent symlink check present
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/
  • ✅ diagnostic_closure.py:196 — next() uses None default with explicit guard

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35204322710. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 2m 32s —— View job


PR #23 Code Review

  • Gather context
  • Check previously flagged bugs
  • Scan changed files for new issues
  • Post findings

All previously flagged issues are confirmed fixed in the current code. No new bugs found.

Confirmed fixed:

  • ✅ publish_webarena_replay_artifact_site.py:167–172 — parent symlink check added (not any(parent.is_symlink() for parent in closure.parents))
  • ✅ retrieval_acceptance.py:837 — expanduser() removed; not raw.is_absolute() guard added
  • ✅ webarena_report.py — no remaining "Qualified" strings; all renamed to "Fixed"
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html covered by forbidden-word, SVG, and English localization checks
  • ✅ fix_log.py:43 — parent symlink check present
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/
  • ✅ diagnostic_closure.py:196 — next() uses None default with explicit guard

The new idempotency machinery (pending_operation, idempotent_upload, completed_operation) is correct: key validation uses a strict alphanumeric regex, Idempotency-Key and X-Artifact-Share header values are sanitized before injection, and all operation states are explicitly handled.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 3m 25s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查 PR diff(48 个文件)
  • 发布审查结论

Review 结论

通过

本次 push 修复了前序所有 P1 问题。核心目标(历史分不变、视口缺陷证据、诊断附录、hash 绑定)实现正确。


问题及建议

未发现需要阻塞合并的问题。

残余风险(不阻塞合并)

  • webarena_report.py:151,346:_load_artifact 和 _copy_failure_screenshot 使用 expanduser() 且无 symlink 或 is_relative_to 包含检查,与 retrieval_acceptance.py:789–794 和 webarena_state.py:152–153 的防御层次稍弱;但路径来自内部构建的 evidence JSON,SHA-256 完整性保护已到位,实际风险低。
  • diagnostic_closure.py:115:load_diagnostic_closure 检查 source.is_symlink() 但未检查父目录 symlink;source 路径来自 profile 绑定,风险可接受。

前次审查问题确认均已修复

  • ✅ retrieval_acceptance.py:837:已移除 expanduser(),改为绝对路径检查 + 父目录 symlink 检查
  • ✅ publish_webarena_replay_artifact_site.py:167–172:closure 路径已补 any(parent.is_symlink() for parent in closure.parents)
  • ✅ check_webarena_replay_report.py:225–234,272–279:fixes.html/diagnostics.html 已加入 core_names;en/fix/*.html/en/diagnostic/*.html 通过 _semantic_page_inventory 的 english_details 已纳入禁用词、SVG 和英文本地化检查
  • ✅ webarena_report.py:所有 "Qualified" 标签已统一为 "Fixed arguments" / "Fixed trajectory and official evaluation passed" / "Fixed action arguments" / "Fixed actions" / "Fixed trajectory is missing this step"
  • ✅ fix_log.py:43–48:父目录 symlink 检查已存在
  • ✅ LOCAL_PATH_RE:已包含 /root/ 和 /opt/
  • ✅ diagnostic_closure.py:196:next() 已使用 None 默认值并有显式 guard
  • ✅ evaluation/browser-use/current-report.json:仅新增 trajectory_replay_bridge 绑定,原 90 题 verdict 不变

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35204708938. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 1m 56s —— View job


PR #23 Code Review

  • Gather context
  • Review PR diff for bugs and security issues
  • Post findings

No bugs or security issues found. The latest commit (f6196b2 — "Reject symlinked report evidence paths") fixes both residual risks flagged by the previous review cycle as non-blocking:

  • ✅ webarena_report.py:_load_artifact and _copy_failure_screenshot — expanduser() removed; not path.is_absolute() and any(part.is_symlink() for part in (path, *path.parents)) guards added (lines 153–154, 353–354)
  • ✅ diagnostic_closure.py:load_diagnostic_closure — not source.is_absolute() and any(parent.is_symlink() for parent in source.parents) now checked (lines 116–118)

All previously confirmed fixes remain in place. No new code paths introduce path traversal, shell injection, or integrity gaps.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 4m 47s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查 PR diff(48 个文件,+9806 / -530)
  • 发布审查结论

Review 结论

通过

本轮 push 修复了前序所有标注问题,核心目标(历史分不变、视口缺陷证据、诊断附录、hash 绑定)实现正确,无需阻塞合并的新缺陷。


问题及建议

未发现需要阻塞合并的问题。

已独立核验的全部修复

  • ✅ retrieval_acceptance.py:839 — 已移除 expanduser(),改为 not raw.is_absolute() + 父目录 symlink 检查
  • ✅ publish_webarena_replay_artifact_site.py:171 — closure 路径已补 any(parent.is_symlink() for parent in closure.parents)
  • ✅ webarena_report.py — 所有英文标签已统一为 "Fixed input" / "Fixed arguments" / "Fixed trajectory and official evaluation passed" / "Fixed action arguments" / "Fixed actions" / "Fixed trajectory is missing this step";无残余 "Qualified ..." 输出标签
  • ✅ check_webarena_replay_report.py:229-230,71-78,245,268,275 — fixes.html、diagnostics.html 已加入 core_names;fix/*.html、diagnostic/*.html 及其英文镜像页已通过 _semantic_page_inventory 纳入禁用词、SVG、中文未翻译标记和英文本地化四项检查
  • ✅ webarena_report.py:151,354 — _load_artifact 和 _copy_failure_screenshot 已改用 not path.is_absolute() + 父目录 symlink 检查(前次审查残余风险已消除)
  • ✅ diagnostic_closure.py:104,117-118 — 两处路径验证均覆盖父目录 symlink 检查(前次审查残余风险已消除)
  • ✅ evaluation/browser-use/current-report.json — 仅新增 trajectory_replay_bridge 绑定字段,原 90 题 verdict 不变
  • ✅ fix_log.py:43-47 — source 路径检查包含父目录 symlink 检查
  • ✅ LOCAL_PATH_RE — 已包含 /root/ 和 /opt/
  • ✅ diagnostic_closure.py:196 — next() 已使用 None 默认值并有显式 guard
  • ✅ participants.py — participant ID 格式以 [A-Za-z0-9][A-Za-z0-9_.-]* 正则验证,唯一性强制执行
  • ✅ _check_metric_populations — 分母与成功子集分母分离验证正确
  • ✅ browser-use-trajectory-replay-bridge.json — 轨迹和失败复核文件均绑定 SHA-256,effective_results 与历史分一致(Chromium 90/90、Moli 54/90)

残余风险(不阻塞合并)

CN 部署凭据尚无绑定站点,PR description 已明确声明,发布前需先解决目标绑定;COM 目标(site_slug/expected_version)已正确绑定,不影响本次合并。

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35205358856. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 1m 38s —— View job


PR #23 Code Review

  • Gather context
  • Read CLAUDE.md (not present)
  • Review PR diff for bugs and security issues
  • Post findings

No bugs or security issues found.

The new commits since the previous review cycle (d5b2a15, eab9eed, e7aa40e, 75e5d60, 2b4add1) add only JSON data files and minor display-text updates to diagnostic_closure.py and webarena_report.py. No security-relevant code paths were changed.

All previously confirmed fixes remain in place:

  • ✅ retrieval_acceptance.py:837–842 — expanduser() removed; not raw.is_absolute() + parent symlink check in effect
  • ✅ publish_webarena_replay_artifact_site.py:171 — any(parent.is_symlink() for parent in closure.parents) present
  • ✅ diagnostic_closure.py:116–119 — absolute path + parent symlink check on source
  • ✅ webarena_report.py — no remaining "Qualified ..." output labels
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html covered by forbidden-word, SVG, and localization checks
  • ✅ fix_log.py:43–47 — parent symlink check on source path
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查 PR diff(66 个文件,+12473 / -530)
  • 发布审查结论

View job run

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35208353988. Please check Claude's inline feedback and summary comment for details.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35559694902. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 54s —— View job


PR #23 Code Review

  • Gather context
  • Review new commits since last review cycle (67c64fc)
  • Post findings

No bugs or security issues found in the one new commit (2e4f1e0 — "Bind verified standalone interpretation publication").

Confirmed safe:

  • current-run.json — updates expected_version from ver_e599ac58… to ver_e40a44044…. Pure data binding change after re-publishing the standalone interpretation; no code paths affected.

All previously confirmed fixes remain in place (last full verification at the 67c64fc review cycle):

  • ✅ browser-use-trajectory-replay-bridge.json — moli_failure_review.path points to archived file with matching SHA
  • ✅ webarena_report.py:62-64 — _legacy_retrieval_provenance absolute path + parent symlink guards present
  • ✅ diagnostic_closure.py:1576-1578 — audit path routed through _bound_cause_audit → _verified_digest
  • ✅ retrieval_acceptance.py — expanduser() removed; not raw.is_absolute() + parent symlink check
  • ✅ publish_webarena_replay_artifact_site.py — any(parent.is_symlink() for parent in closure.parents) present
  • ✅ webarena_report.py — no remaining "Qualified …" output labels
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html covered
  • ✅ fix_log.py:43–47 — parent symlink check on source path
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/

@github-actions

github-actions Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 1m 10s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 核验前次审查状态及新增提交(2e4f1e0)
  • 发布审查结论

Review 结论

通过

自上一轮审查(67c64fc,已标记通过)以来,本 PR 仅新增一个提交 2e4f1e0("Bind verified standalone interpretation publication"),将 current-run.json 中独立解读文章发布目标的 expected_version 从 ver_e599ac58a71a40d1863e4d31c8ef78ab 更新为 ver_e40a44044966438192bea4cb1dc96e56。这是发布验证后绑定实际部署版本的纯数据更新,state: "verified" 与更新时序一致。无新缺陷。

问题及建议

未发现需要阻塞合并的问题。

前次审查 P0/P1 修复确认仍在位

  • ✅ research/browser-use-trajectory-replay-bridge.json:moli_failure_review.path 已绑定 research/trajectory-replay-reviews/20260917-original-36.json(SHA c2e07ab3 匹配)
  • ✅ harness/trajectory_replay/webarena_report.py:62-63:_legacy_retrieval_provenance 包含 not source.is_absolute() + any(part.is_symlink() for part in (source, *source.parents))
  • ✅ harness/trajectory_replay/diagnostic_closure.py:audit 路径读取已路由至 _verified_digest,包含完整路径安全检查

残余风险(不阻塞合并)

  • harness/trajectory_replay/interpretation.py:24-25:source 和 contract_audit 路径无 is_absolute() / 父目录 symlink 检查,但路径为项目内部构建路径,且 results_sha256 绑定在任何输出生成前验证,实际风险低。

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35560875508. Please check Claude's inline feedback and summary comment for details.

Comment thread research/trajectory-replay-illustrations/durable-response-body-en.png Outdated
Comment thread scripts/audit_replay_cart_assertion.py
Comment thread tests/trajectory_replay/test_interpretation.py
@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 3m 35s —— View job


PR #23 Code Review

  • Gather context
  • Review new commits since last review cycle (2e4f1e0)
  • Post findings

No bugs or security issues found in the one new commit (170bae3 — merge of c669947 "Add Moli version success and resource comparison").

Confirmed safe in new code:

  • scripts/moli_report/app.js — all innerHTML assignments use esc(), which correctly escapes &<>"'; fetched evidence text is also escaped (esc(raw)) before injection; the search-highlight path at line 1833–1839 escapes each segment individually.
  • harness/reporting/packs.py:32–34 — pattern.format(index=index) output is checked for is_absolute() and ".." in parts before writing; pack file created with mode "xb" (exclusive create), preventing silent overwrites.
  • scripts/moli_report/run_linux_resource_profiles.py:194, scripts/moli_report/verify.py:967–974 — all subprocess calls use list arguments, no shell=True.
  • harness/web_fetch/report_article_cases.py:34–36 — _link() enforces http/https scheme and passes the URL through escape(..., quote=True) before injecting into href. report_explainer.py:723 applies the same escape(HUB, quote=True) guard.
  • scripts/moli_report/verify.py — is_absolute() and is_symlink() checks are applied at all path-read sites; parent-symlink checks are absent, consistent with the documented acceptable pattern for CLI entry-point scripts.

All previously confirmed fixes remain in place:

  • ✅ browser-use-trajectory-replay-bridge.json — moli_failure_review.path points to archived file with matching SHA
  • ✅ webarena_report.py:62–64 — _legacy_retrieval_provenance has not source.is_absolute() + parent symlink guards
  • ✅ diagnostic_closure.py:1576–1578 — audit path routed through _bound_cause_audit → _verified_digest
  • ✅ retrieval_acceptance.py — expanduser() removed; not raw.is_absolute() + parent symlink check
  • ✅ publish_webarena_replay_artifact_site.py — any(parent.is_symlink() for parent in closure.parents) present
  • ✅ webarena_report.py — no remaining "Qualified …" output labels
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html covered
  • ✅ fix_log.py:43–47 — parent symlink check on source path
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/

@lanyue-llk

Copy link
Copy Markdown
Contributor Author

已在 170bae3 同步 main c669947。

完整 make ci 通过:1130 项 unittest(38 跳过),195 项 Browser Use、28 项环境、1284 项轨迹测试通过(5 跳过),UI 和 fixture 检查通过。

新增的四条存储边界、代码归属、抽象和测试清理意见仍在处理,未标记解决。本次同步不代表这些结构性意见已经完成。

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 6m 11s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 审查结构性问题(内联评论聚焦点)
  • 发布审查结论

Review 结论

不通过(结构性问题)

安全与正确性问题(前序 P0/P1)均已修复,不重复。本轮回应用户内联评论提出的四处问题,独立核验后归纳为以下结构性缺陷:


问题及建议

[P1] research/trajectory-replay-illustrations/ - 33MB 二进制 PNG 图片入 git

  • research/trajectory-replay-illustrations/ 在 origin/main 不存在,此 PR 新增 22 个 PNG 共 33MB
  • webarena_report.py:2951,2961 从该目录加载图片并 shutil.copyfile 到 output/assets/interpretation/ 发布;interpretation.py:67 在 standalone 模式下 base64 内嵌;发布后图片已在 artifact-site 有永久 URL
  • AGENTS.md:"Git may contain compact benchmark definitions, annotations, independent source evidence and public release metadata, but never measured outputs, execution manifests, provider artifacts";解读插图属于可外部托管的构建资源,不是需要版本追踪的代码或证据
  • 33MB 二进制永久写入 git 历史,每次 clone 都需拉取

建议:将图片从 git 删除;构建时从 artifact-site 的已知资源 URL 下载,或存储在 ~/.browser-eval/(AGENTS.md 规定的 git 外持久化位置);在 AGENTS.md 中硬化"illustration/插图资源不入库,通过 artifact-site URL 或 ~/.browser-eval/ 引用"规则。


[P1] evaluation/trajectory-replay/webarena-verified/trajectories-corrected.json(268KB)与已有 trajectories.json(259KB)冗余

  • trajectories.json 已在 origin/main(259KB),此 PR 新增 trajectories-corrected.json(268KB)作为"修正版本"
  • PR description 引用"数据集:WeArena-Verified PR Add reproducible Chromium and Moli browser evaluation harness #2 → lexmount/webarena-verified";trajectories-corrected.json 本质上是对该 fork 数据的本地修正副本,未作为 submodule 或 SHA-256 绑定外部引用
  • 同一目录因此存在两个高度重叠的轨迹 JSON,未声明哪个是当前权威源;revisions/task-corrections-20260918.json(270行)和 revisions/task-corrections-20260920-pre-510.json(272行)是 task-corrections.json 的时间戳快照副本,git 历史已记录演变,树中再存副本增加歧义

建议:厘清 lexmount/webarena-verified fork 与本仓库的数据边界——修正后的轨迹数据应在 webarena-verified 仓库中维护,本仓库通过 SHA-256 绑定引用,而非直接复制内容;revisions/ 快照副本移至 ~/.browser-eval/ 或删除(依赖 git 历史恢复)。


[P1] scripts/ 按报告周期累积专项工具,无复用抽象

新增专项脚本(本 PR 新增或仅针对当前报告):

  • scripts/audit_replay_cart_assertion.py:16,70:PRODUCT 字符串和 'task_id': 510 硬编码;参数默认值绑定 trajectories-corrected.json 和 task-510.json 具体路径
  • scripts/build_task67_retrieval_contract.py:13-16:task-67 文件路径硬编码
  • scripts/revise_original36_for_corrected_reference.py:original-36 批次专用
  • scripts/rescore_saved_retrieval_attempt.py:单条记录、无通用参数化
  • run_remote_candidate_cohort_diagnostic.py(705行)/ run_remote_mutation_diagnostic.py(621行)/ run_remote_three_method_cohort.py(472行):三者共享相同的 _browser_tool_config、_login_context、load_remote_sites、remote_benchmark、CdpHarRecorder 初始化逻辑,差异仅是执行模式,却各自独立实现(1909行合计)

此模式意味着下一轮报告将再产生同等规模的专项脚本。

建议:

  1. audit_replay_cart_assertion.py 改为从 trajectory-candidate JSON 读取 task_id 和商品断言脚本,成为通用 audit_replay_trajectory_assertion.py
  2. build_task67_retrieval_contract.py、revise_original36_for_corrected_reference.py 等合并为通用脚本(--task/--batch 参数化)
  3. run_remote_* 三脚本提取共享基类或通用入口,通过 --mode 参数区分诊断类型
  4. 在 AGENTS.md 中添加:"不为单个任务或单次报告创建专项脚本;通用逻辑提取为带参数的工具,放在 scripts/ 通用入口或 harness/ 共享模块"

[P2] harness/trajectory_replay/diagnostic_closure.py(2241 行)与 webarena_report.py(3075 行)职责混合

  • diagnostic_closure.py:证据加载(_bound_json、_verified_digest)+ 诊断计算(_load_fixed36_index)+ HTML 渲染(_write_diagnostic_closure)三种职责混在一个文件
  • harness/web_fetch/ 已有分层示范:report_components.py、report_i18n.py、report_build.py 各司其职
  • 两个文件总计 5316 行;每新增报告节都直接追加,无模块边界

建议:后续重构时将 diagnostic_closure.py 拆分为 _evidence.py(加载/验证)、_diagnosis.py(计算)、_render.py(HTML),与 harness/web_fetch/ 的分层对齐;当前不阻塞本次合并,但须在 AGENTS.md 中硬化"新渲染器不追加到已有 3000 行文件,而是拆分新模块"规定。


关于"动吗"/"从吗"

上述 P1 项中唯有 33MB PNG 入库 是本 PR 新引入且可立即操作的问题(origin/main 无此目录);其余为积累性架构问题,需要跨仓库协调(webarena-verified 数据边界)或专项重构 PR。

建议分步处理:

  1. 本 PR 合并前:从 git 中删除 research/trajectory-replay-illustrations/,修改 webarena_report.py:2951-2961,2981 改为从 artifact-site URL 或 ~/.browser-eval/ 加载插图;在 AGENTS.md 补充插图/illustration 不入库规则
  2. 独立 PR:scripts/ 专项工具合并/参数化
  3. 独立 PR:trajectories-corrected.json 与 webarena-verified fork 数据边界厘清
  4. 独立 PR(非紧急):diagnostic_closure.py 职责拆分

如需直接在此 PR 执行第1项(删除PNG + 修改加载逻辑 + 更新 AGENTS.md),请确认后我可以操作。

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35691585620. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 1m 45s —— View job


PR #23 Code Review

  • Gather context
  • Review new commits since last review cycle (170bae3)
  • Post findings

No bugs or security issues found in the one new commit (8c57fd5 — "refactor(replay): remove retired diagnostic report pipeline").

Confirmed safe in new code:

  • diagnostic_closure.py fully deleted; no dangling imports remain anywhere in harness/, scripts/, or tests/.
  • Removed functions from webarena_report.py (_write_replay_fix_log, _formal_affected_rows, _latest_moli_task_section, _fixed36_task_section, _write_diagnostic_closure) have no remaining callers.
  • diagnostic_closure_path parameter in webarena_report.py:1238 is intentionally retained as a tombstone guard — it now immediately raises ValueError("diagnostic-only cohorts cannot enter the three-method report"), blocking accidental use of the retired pipeline.
  • publish_webarena_replay_artifact_site.py:no_diagnostic_closure gate and its corresponding test in test_webarena_publish.py:583 are both intact — old artifacts containing a diagnostic_closure_sha256 field are still rejected at publish time.
  • _check_fixed36_output_scope and _check_formal36_output_scope removed from check_webarena_replay_report.py; all remaining imports in test_webarena_report.py (_check_affected36_comparison, _check_core_comparison, _check_legacy_retrieval_audit, _check_result_detail_semantics, _check_english_localization) still exist in the script.

All previously confirmed fixes remain in place:

  • ✅ browser-use-trajectory-replay-bridge.json — moli_failure_review.path points to archived file with matching SHA
  • ✅ webarena_report.py:62–64 — _legacy_retrieval_provenance has not source.is_absolute() + parent symlink guards
  • ✅ retrieval_acceptance.py — expanduser() removed; not raw.is_absolute() + parent symlink check
  • ✅ publish_webarena_replay_artifact_site.py — any(parent.is_symlink() for parent in closure.parents) present
  • ✅ webarena_report.py — no remaining "Qualified …" output labels
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html covered
  • ✅ fix_log.py:43–47 — parent symlink check on source path
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 7m 56s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 检查最新提交 8c57fd5 及与 origin/main 的完整 diff
  • 核验结构性问题处理状态
  • 发布审查结论

Review 结论

不通过

最新提交 8c57fd5("refactor(replay): remove retired diagnostic report pipeline")移除了整个旧版诊断流水线(约 5900 行),但与已发布报告产生不可调和的不一致;两处先前标注的 P1 结构性问题仍未处理。


问题及建议

[P1] scripts/check_webarena_replay_report.py:499:新增拒绝规则与已发布报告不一致

8c57fd5 在 check_webarena_replay_report.py:499 新增:

if any((root / route).exists() for route in ("diagnostics.html", "fixes.html", "data/diagnostic-closure.json")):
    raise ValueError("three-method report contains a separate diagnostic appendix")

同时从 harness/trajectory_replay/webarena_report.py 中移除了生成 fixes.html、diagnostics.html、fix/*.html、diagnostic/*.html 的全部代码(旧版 _write_diagnostic_closure 及相关渲染函数)。

已发布报告(PR body 链接:https://artifact-site.lexmount.cn/v/coY1pMVPbD6Z8cVLaUi_ZbpSnalfKpxY)是在包含上述代码时构建的,包含 fixes.html、diagnostics.html、fix/*.html、diagnostic/*.html 等页面(PR description 声称"549 个 HTML 页面"已通过验证)。

用当前代码重建报告会产生不同的页面集合;若对现有发布包运行当前 check_webarena_replay_report.py,将在 L499 抛出 ValueError 失败。AGENTS.md 要求 "Release only after…deployed-output verification pass"——当前代码无法验证已发布产物,已验证声明与当前 release gate 矛盾。

建议:在合并前选择其一:

  1. 从此 PR 中撤回 8c57fd5,保留诊断流水线,仅将结构性清理留到独立 PR;或
  2. 重新构建报告(不带诊断附录),重走发布验证流程,更新 PR description 中的"549 个 HTML 页面"与"已有验证"声明,再合并。

[P1] research/trajectory-replay-illustrations/(22 个 PNG,33 MB)入 git

此目录由本 PR 新增,harness/trajectory_replay/webarena_report.py:1772 在构建解读文章时从这里 shutil.copyfile 插图。AGENTS.md 明确要求 git 内容 "compact",并列举只允许"compact benchmark definitions, annotations, independent source evidence and public release metadata";33MB 二进制文件永久写入 git 历史,不符合"compact"定义。用户内联评论也明确提问"是否放在 artifacts-site",尚未处理。

建议:从 git 删除 research/trajectory-replay-illustrations/;在构建时从 artifact-site 的已知资源 URL 下载(或从 ~/.browser-eval/ 读取),并在 webarena_report.py:1772 处加断言确保图片来源安全。同时在 AGENTS.md 中补充"插图资源不入库"规则。


[P1] evaluation/trajectory-replay/webarena-verified/trajectories-corrected.json(268 KB)与 trajectories.json(259 KB)并存

current-run.json:22 引用 trajectories-corrected.json,但 trajectories.json(origin/main 已有)同样留在目录中,无注释说明哪个是权威源。另有 revisions/task-corrections-20260918.json(270 行)、revisions/task-corrections-20260920-pre-510.json(272 行)均是 task-corrections.json 的时间戳快照副本——三个高度重叠的文件同时在树中,产生歧义。

建议:明确将 trajectories.json 标为历史版本(或直接删除),将 trajectories-corrected.json 重命名为 trajectories.json 使其成为单一权威源;revisions/ 快照副本移至 ~/.browser-eval/ 或删除(依赖 git 历史)。


8c57fd5 本身的合理性核验(不阻塞合并,供参考)

  • 已确认:无残余 from harness.trajectory_replay.diagnostic_closure import 引用;test_diagnostic_closure.py 和 test_original36_latest_index.py 与代码一同移除;webarena_report.py:1258-1259 对 diagnostic_closure_path is not None 的处理改为直接 raise,防止旧路径复用。自身代码一致,无引入新缺陷。

前序已确认修复(未被本次提交破坏)

  • ✅ webarena_report.py:61-63:_legacy_retrieval_provenance 包含 not source.is_absolute() + 父目录 symlink 检查
  • ✅ retrieval_acceptance.py:expanduser() 已移除,绝对路径 + 父目录 symlink 检查在位
  • ✅ publish_webarena_replay_artifact_site.py:any(parent.is_symlink() for parent in closure.parents) 在位
  • ✅ fix_log.py:43-47:父目录 symlink 检查在位
  • ✅ LOCAL_PATH_RE:包含 /root/ 和 /opt/
  • ✅ webarena_report.py:无残余 "Qualified …" 输出标签
  • ✅ browser-use-trajectory-replay-bridge.json:moli_failure_review.path 绑定已归档文件(SHA c2e07ab3 匹配)
  • ✅ evaluation/browser-use/current-report.json:原 90 题 verdict 不变

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35695618830. Please check Claude's inline feedback and summary comment for details.

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 6m 30s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 检查最新提交 f39edab 及关键变更文件
  • 核验前次标注问题修复状态
  • 发布审查结论

Review 结论

通过

最新提交 f39edab("refactor(replay): externalize report content and share execution")解决了上一轮 2026-09-22T06:38:57Z 审查标注的全部 P1 结构性问题,无新缺陷。


问题及建议

未发现需要阻塞合并的问题。

本轮提交核验(f39edab)

问题 状态
33 MB PNG 入 git ✅ 已修复:22 个 PNG 全部从 research/trajectory-replay-illustrations/ 删除,改用 research/trajectory-replay-content.json + copy_bound_assets(~/.browser-eval/report-assets/trajectory-replay/)
research/trajectory-replay-interpretation.json(861 行)入 git ✅ 已修复:从 git 删除,同样通过 content manifest 引用
trajectories-corrected.json vs trajectories.json 两文件歧义 ✅ 已修复:README 明确说明两者分工(corrected = 当前权威数据集,original = 资格验证与修正溯源前体)
revisions/ 快照副本歧义 ✅ 已修复:README 明确说明为"不可变历史合同输入,非报告输出副本"
audit_replay_cart_assertion.py 硬编码值 ✅ 已修复:全部改为 --dataset、--candidate、--product 参数化
build_task67_retrieval_contract.py(120 行)专项脚本 ✅ 已删除
revise_original36_for_corrected_reference.py(168 行)专项脚本 ✅ 已删除
run_remote_* 三脚本代码重复 ✅ 部分修复:新增 harness/trajectory_replay/remote_execution.py 共享模块,run_remote_three_method_cohort.py 和 run_remote_candidate_cohort_diagnostic.py 已迁移;run_remote_mutation_diagnostic.py 因执行模型不同暂未迁移
AGENTS.md 无内容外置规则 ✅ 已修复:新增"report-specific prose/illustrations 不入库,改用 compact 绑定"和"删除废弃生成器"规则

新增模块核验(无安全问题)

  • harness/reporting/assets.py:copy_bound_assets:路径验证(is_absolute(), .., symlink)+ SHA-256 完整性 + 排他写入('xb'),设计正确
  • harness/reporting/assets.py:check_external_asset_boundary:CI 守门测试 test_repository_has_no_copies_of_bound_external_content 已接入,git ls-files research/trajectory-replay-illustrations/ 确认为空,测试通过
  • harness/trajectory_replay/remote_execution.py:subprocess 全部使用列表参数,无 shell=True;profile 目录参数安全注入

残余风险(不阻塞合并)

  • scripts/check_webarena_replay_report.py:499 拒绝含 diagnostics.html/fixes.html 的报告,而当前已发布版本(ver_e40a44044966438192bea4cb1dc96e56, state: "verified")是用旧代码构建的,包含这些页面。该检查是针对未来新构建的前向门控;已发布报告的验证记录在发布时已完成,历史结论不受新检查影响。如需重新发布须用当前代码重建(无诊断附录页)。
  • run_remote_mutation_diagnostic.py(621 行)仍使用独立 browser launch/execution 实现,未迁移至 remote_execution.py;mutation 测试执行模型与标准重放有差异,可后续独立重构。
  • interpretation.py:24-25 路径无 is_absolute() + 父目录 symlink 检查(此前审查已标注为可接受,SHA-256 完整性绑定在位)。

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 4m 18s —— View job


PR #23 Code Review

  • Gather context
  • Review new commit f39edab since last review cycle (8c57fd5)
  • Post findings

No bugs or security issues found in f39edab ("refactor(replay): externalize report content and share execution").

Confirmed safe in new code:

  • harness/reporting/assets.py:copy_bound_assets — relative.is_absolute() and '..' in relative.parts guard path traversal; any(parent.is_symlink() for parent in (path, *path.parents)) applied to both source and destination; SHA-256 verified before any write; all payloads collected before the write loop (xb mode prevents overwrites). check_external_asset_boundary correctly rejects re-committed externalized content.
  • harness/trajectory_replay/remote_execution.py — all subprocess calls use list arguments inherited from the prior reviewed code; task-dir guard (is_symlink() check on the directory) matches prior pattern; _write uses chmod(0o600) and file_sha256 consistently.
  • scripts/build_webarena_replay_report.py — interpretation_path now points into a tempfile.TemporaryDirectory populated by copy_bound_assets (SHA-256 verified), so the illustrations path at webarena_report.py:1773 resolves into that clean temp tree, not a user-controlled location.
  • scripts/audit_replay_cart_assertion.py — hardcoded product name and task_id removed; task_id now read from candidate.read_text() instead.
  • Deleted files (build_task67_retrieval_contract.py, revise_original36_for_corrected_reference.py) confirmed removed; no dangling imports remain.

Confirmed fixed from prior review cycles:

  • ✅ 22 PNG files (research/trajectory-replay-illustrations/) removed from git; externalized via research/trajectory-replay-content.json SHA-256 bindings
  • ✅ research/trajectory-replay-interpretation.json removed from git; externalized to data home
  • ✅ webarena_report.py:61–62 — _legacy_retrieval_provenance has not source.is_absolute() + parent symlink guards
  • ✅ browser-use-trajectory-replay-bridge.json — moli_failure_review.path points to archived file with matching SHA
  • ✅ retrieval_acceptance.py — expanduser() removed; not raw.is_absolute() + parent symlink check
  • ✅ publish_webarena_replay_artifact_site.py — any(parent.is_symlink() for parent in closure.parents) present
  • ✅ webarena_report.py — no remaining "Qualified …" output labels
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html covered by release gate; line 499 guard is consistent with newly-built reports (not a conflict with the published report, which was built from a prior code version and is already published)
  • ✅ fix_log.py:43–47 — parent symlink check on source path
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35697198559. Please check Claude's inline feedback and summary comment for details.

Comment thread research/trajectory-replay-task156-layout-audit.json Outdated
@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 3m 17s —— View job


PR #23 代码审查

  • 读取 AGENTS.md 和 SKILL.md
  • 检查自上轮审查(f39edab)以来的新提交(926de10、72de960、afa380f)
  • 独立审查新增变更
  • 发布审查结论

Review 结论

通过

三个新提交均为清理性变更,无新缺陷,前序所有 P0/P1 问题确认不受影响。


本轮提交核验

926de10(Makefile 清理)

移除 trajectory-replay-report 和 trajectory-replay-package 两个 Makefile 目标的 --diagnostic-closure 参数,与 8c57fd5 中移除诊断流水线一致。无代码逻辑变更。

72de960(同步 main / 合入 PR #25 WCXB 更新)

合并提交,将已合并入 main 的 PR #25(WCXB Moli 对照报告)变更引入本分支。轨迹重放侧仅 AGENTS.md 新增一行,将 WCXB builds 使用 <evidence>/report-assets/ 的规则恢复为独立条目。WCXB 代码变更(harness/web_fetch/report.py、report_build.py、scripts/check_wcxb_report.py 等)已在 main 分支完成审查,无新风险。

afa380f(删除 36 个诊断快照)

删除 research/trajectory-replay-task*-audit.json 共 36 个文件(约 1894 行)。经核验:所有被删除文件在 harness/、scripts/、tests/、evaluation/ 中均无引用,为报告开发过程中积累的一次性诊断记录,不是当前报告的必要输入。

保留的 research/trajectory-replay-task* 文件(task225-revised-reference.json、task279-revised-reference.json、task448-*、task510-quantity-revision.json、task67-reference-audit.json、task243-nickname-reference.json)均有有效引用(task-corrections.json、build_revised_webarena_dataset.py 或测试文件),属于压缩型评测定义和纠正收据,符合 AGENTS.md 入库标准。


问题及建议

未发现需要阻塞合并的问题。

残余风险(不阻塞合并,已在前次审查记录)

  • check_webarena_replay_report.py:499 的 diagnostics.html/fixes.html 拒绝规则针对未来新构建;已发布报告(ver_e40a44044966438192bea4cb1dc96e56,state: "verified")在规则引入前已完成发布验证,不受影响。
  • interpretation.py:24-25:source 和 contract_audit 路径无 is_absolute() + 父目录 symlink 检查,但路径为项目内部构建路径,results_sha256 绑定在任何输出生成前验证,实际风险低。

前序 P0/P1 修复确认未被本轮破坏

  • ✅ webarena_report.py:1259-1260:diagnostic_closure_path is not None tombstone guard 在位,阻断旧路径复用
  • ✅ research/browser-use-trajectory-replay-bridge.json:moli_failure_review.path 指向归档文件(SHA c2e07ab3 匹配)
  • ✅ webarena_report.py:62-63:_legacy_retrieval_provenance not source.is_absolute() + 父目录 symlink 检查在位
  • ✅ retrieval_acceptance.py:expanduser() 已移除,绝对路径 + 父目录 symlink 检查在位
  • ✅ publish_webarena_replay_artifact_site.py:closure 路径父目录 symlink 检查在位
  • ✅ check_webarena_replay_report.py:fixes.html、diagnostics.html 及英文详情页纳入禁用词、SVG、英文本地化检查
  • ✅ fix_log.py:43-47:父目录 symlink 检查在位
  • ✅ LOCAL_PATH_RE:包含 /root/ 和 /opt/

@github-actions

github-actions Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Claude finished @lanyue-llk's task in 2m 29s —— View job


PR #23 Code Review

  • Gather context
  • Review new commits since last review cycle (f39edab)
  • Post findings

No bugs or security issues found in the four new commits (afa380f, 926de10, 72de960, 5500b2f).

Confirmed safe in new code:

  • afa380f — removes 37 research/trajectory-replay-*-audit.json snapshot files from git (per the user's research/ cleanup request). No code changes.
  • 926de10 — Makefile-only change archiving a diagnostic recipe. No security impact.
  • 5500b2f (WCXB PR Explain Moli repairs in WCXB interpretation #25 merge) — the substantive code changes:
    • report.py:44 — review_scope now reads from out/'research/wcxb-representative-review.json' (the staging tempdir populated by copy_bound_assets with SHA-256 verification) rather than directly from the source tree. The read location is always a fresh tempdir, not user-controlled. Safe.
    • report_build.py:561–577 — optional UI-stripping evidence path checks use is_file(), is_symlink(), and SHA-256 integrity verification before reading; missing parent-symlink check is consistent with the documented acceptable pattern for evidence paths protected by SHA-256.
    • capture_wcxb_optional_ui.py — subprocess.run uses list arguments; binary is a Path from CLI, not shell-interpolated; f'{base}/case/4017' URL uses a hardcoded path segment; staged.rename(args.output) is atomic and guarded by double args.output.exists() check for immutability.
    • run_certified_benchmark.py — --replace-providers validated against set(WCXB_PROVIDERS) before use; shutil.copytree uses symlinks=False; no injection path.
    • run_webmainbench_benchmark.py — reads Moli version from committed evaluation/wcxb/current-report.json, not user input.
    • check_wcxb_visual.py — Playwright locators use hardcoded CSS selectors; image.get_attribute("src") is only used in an error message, not in a security-sensitive context.

All previously confirmed fixes remain in place (last full verification at f39edab review cycle):

  • ✅ browser-use-trajectory-replay-bridge.json — moli_failure_review.path points to archived file with matching SHA
  • ✅ webarena_report.py:62–64 — _legacy_retrieval_provenance has not source.is_absolute() + parent symlink guards
  • ✅ retrieval_acceptance.py — expanduser() removed; not raw.is_absolute() + parent symlink check
  • ✅ publish_webarena_replay_artifact_site.py — any(parent.is_symlink() for parent in closure.parents) present
  • ✅ webarena_report.py — no remaining "Qualified …" output labels
  • ✅ check_webarena_replay_report.py — fixes.html, diagnostics.html, en/fix/*.html, en/diagnostic/*.html covered
  • ✅ fix_log.py:43–47 — parent symlink check on source path
  • ✅ LOCAL_PATH_RE — includes /root/ and /opt/

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated Claude review completed. Review run: https://github.com/lexmount/browser-eval/actions/runs/35709005103. Please check Claude's inline feedback and summary comment for details.

@lanyue-llk
lanyue-llk merged commit 1c27aa0 into main Sep 22, 2026
4 checks passed
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.

1 participant