Octagon / EdgeBench Integration Note
Juliet Vulnerability Analyzer:Public 与 Hidden 材料拆分说明
生成日期:2026-07-08。本文基于对 EdgeBench 公开任务 JSON、SForge 代码路径,以及官方 work/judge Docker 镜像的本地验证。
一句话结论
Juliet 这个题可以走方案 B:把 agent 可见的 public workspace 独立到 Octagon, 但 hidden judge 不建议作为普通 env 文件复制进项目;更稳妥的做法是让 Octagon scorer 调官方 judge image。严格地说,不是“绝对不能复制 hidden”,而是复制后必须保证 BA 沙盒永远看不到、 dispatch 永远不会上传、artifact 回收永远不会泄露,否则评测语义就变了。
SForge 的 Public / Hidden 是什么
Public / Work 侧
Public 是 agent 正常可见的题面、启动代码、公开样例数据和本地公开评分器。 在 SForge 里它来自 work image,agent 在 work container 中编辑代码、运行公开检查、提交归档。
对 Juliet 来说,公开任务要求是在
agent-start/analyzer.py
里实现确定性 facts-level 静态分析器,输出 findings JSON。
Hidden / Judge 侧
Hidden 是 agent 不应看到的真实测试集、标签和隐藏评分脚本。 在 SForge 里它来自 judge image,只有评测时的临时 judge container 能读取。
对 Juliet 来说,hidden scorer 会运行 agent 的 analyzer,读取隐藏 facts,
与隐藏 labels 对比,然后输出 SCORE=... 等指标。
本地验证到的 Juliet 文件分布
| 类别 | 来源 | 关键路径 / 内容 | 是否适合进 Octagon env |
|---|---|---|---|
| 公开题面与 starter | work image |
problem.md, README.md,
agent-start/analyzer.py, agent-start/requirements.txt
|
适合 |
| 公开数据 | work image |
data/public/facts.jsonl, labels.jsonl,
manifest.json。已验证 public cases 为 240,public labels 为 192。
|
适合 |
| 公开评分器 | work image |
score.sh, scoring/score.py。用于本地 public score,不代表最终 hidden 分。
|
适合 |
| 隐藏数据 | judge image |
/root/sebench_private/.../data/hidden/facts.jsonl,
labels.jsonl。已验证 hidden labels 为 723。
|
不建议作为普通 env 文件 |
| 隐藏评分脚本 | judge image |
/root/sebench_private/.../evaluator-hidden/score_hidden.sh
|
建议通过 judge image 调用 |
为什么不是简单“全部复制进 Octagon”
1. 问题不是 BA 当前能不能看到,而是隔离边界是否长期可靠
你说得对:如果 BA 运行在沙盒里,且沙盒只拿到 public workspace, 那它确实看不到项目里的 hidden 文件。这个前提成立时,安全风险可以控制。 但 Octagon 现有逻辑会把 env 的脚本、输入物料、workspace 复制或上传给 agent。 如果 hidden 文件放在普通 env 目录里,后续某次 dispatch、artifact 回收、调试脚本或“复制整个 env” 的改动都可能误把 hidden 带进 BA workspace。
2. hidden judge 的官方边界本来就是 judge image
EdgeBench/SForge 的设计是 work container 给 agent,judge container 做隐藏评分。 官方 task JSON 只暴露 judge image tag 和 eval command,而不是把 hidden 数据作为数据集文件公开。 因此让 Octagon scorer 调 judge image,最接近官方评测边界,也更容易说明“我们使用官方 judge 评分”。
3. 复制 hidden 后要承担额外的授权、版本和防泄露责任
EdgeBench 任务 JSON 和 SForge 代码有明确公开来源;但 judge image 内
/root/sebench_private
里的 hidden evaluator 是私有路径组织。即使镜像可拉,也不等于适合把 hidden 文件解包提交到仓库。
一旦复制到项目里,还需要证明文件没有被改过、没有被 agent 访问过、没有在 artifacts 或日志中泄露。
如果坚持把 Hidden 也放进 Octagon,需要怎么做
技术上可以,但应该按“服务端私有裁判资源”处理,而不是按 env 普通文件处理:
- 放在 env 目录外,或至少放在明确私有目录,例如
envs/edgebench-juliet/_judge_private/。 .gitignore必须忽略该目录,避免提交进仓库。- dispatch / upload / artifact recovery 必须显式排除该目录。
- scorer 只能在 Octagon 服务端读取 hidden,不能把路径写入 prompt、context、trace 或 agent workspace。
- 增加回归测试:创建 attempt 后检查 BA workspace 中不存在
hidden、sebench_private、score_hidden.sh等文件。 - 日志和错误信息要截断,不能把 hidden labels 或具体 hidden case 内容打印出来。
即便这样做,也只是“可控”,不如保留 judge image 简洁。judge image 天然提供了文件边界、版本 tag 和运行环境。
推荐的方案 B 变体
- 把 work image 中的 public workspace 抽取到 Octagon,例如
envs/edgebench-juliet/workspace_template/。 - BA 只拿到
agent-start/、题面和 public data,按题目修改analyzer.py。 - Octagon scorer 将 BA 产物复制到可写临时目录。
- scorer 调用官方 judge image:
seededge/edgebench.judge.juliet_vulnerability_analyzer:0c4f2c0057c2。 - 解析
SCORE=、SCORE_STATUS=、PER_CWE=等输出,写回 Octagon scores。
我已验证空 starter 经 hidden scorer 可得到 SCORE=10.00、
SCORE_STATUS=OK、RAW_TOTAL=723。可写临时目录挂载方式可正常运行;
只读挂载不行,因为 scorer 会在 agent-start/out/findings.json 写分析结果。
来源
- ByteDance-Seed/EdgeBench GitHub 仓库
- Hugging Face: juliet_vulnerability_analyzer.json
- Hugging Face: BENCHMARK.yaml
- 本地 Docker 验证镜像:
seededge/edgebench.work.juliet_vulnerability_analyzer:bae3ab85c5f5与seededge/edgebench.judge.juliet_vulnerability_analyzer:0c4f2c0057c2