设定
对 SWE-bench-like 的榜单,Agent 开始解题前,代码仓 git reset --hard 到对应 issue 被解决前的 commit 快照。
而 PR 中的 test cases 不向 Agent 暴露,只用来验收解决效果。每道题都有一个独立 docker 保证工作区和依赖独立。
我们提前配置好工具的封锁规则:
{
"permission": {
"bash": {
"git log *": "deny",
"git show *": "deny"
},
"webfatch": "deny"
}
}
BTW, 这是 OpenCode 的配置。
我们在 GLM-5.2 从真实 github issue 中来自 5 个仓库 142 道 C++ 语言的题目中发现了大量 git 相关 reward hacking 行为。 (这批轨迹的解决率高到 90%+)
其中 11 条(8%)是在联网下载答案,107 条(75%)是提取了历史 git 记录。 虽然我们封堵了 git 的使用和 webfetch 工具,来防止模型看 git 记录中来自未来的提交看到答案; 但容器还是有出网能力,因为解题过程 Agent 很可能需要下载依赖。
这套配置在 GLM-5.1 上还不错,不过在 GLM-5.2 下出现了大量问题 - 大致行为有下面几类:
Reward Hacking 模式
- 虽然不能webfetch,但是可以通过 bash 直接 curl 下载 issue、diff 文件;甚至直接用 python 解析 github API 返回的 JSON 提取修改了哪些文件
- 直接克隆仓库,在其中搜索 commit 提取具体代码变更
- curl 直接下载修复后的源文件
- 下载到补丁文件后直接 git apply
- 有些语义等价的 git 命令。比如 git log = git rev-list 或者 git diff 来推断提交之间的代码变更;git show = git cat-file 读历史文件
修复
思想是在源头消除不该存在的信息。
- 网络层 iptables 防止出站
- 单 commit 仓库重建:容器构建的时候重建为一个只包含初始 commit 的干净 git 仓库,这样模型还能用 git 命令帮助解题,但是历史记录看不到有用信息。