Closed
[V1111-BENCH0] [P0·core] 拆除 benchmark 分支:评测的胜负判据已回流成产品完成定义,且评测环境下主动关闭质量闸(含 SWEBENCH_CACHE 隐蔽通道) #61
kemengAdd on 8 days agoClosed at 2 days ago
kemeng
8 days ago Comments:
8 days ago Comments:
【ar审核】纳入·lane=km主体(P2涉xwtui提示语一处由tx配)·理由:bench判分口径占用产品完成定义(check_exit has_patch门),P0,与#59同批设计。体量大,进版下版启动时定,本版不动bench面。


kemeng
8 days ago Comments:
8 days ago Comments:
【ar追审】下版(v1.10.12)首件:诊断docs/BENCH_BRANCH_REMOVAL_DIAGNOSIS_20261101.md §七四步(P0-1删SWEBENCH_CACHE旁路/P0-2完成判据去评测化与#59同批/P1提示词合并+停止判据统一/P2删开关本体)。用户令:下版先不合入其他issue,专注拆除。km落点(跨5仓)已收,待v1.10.11关版后下版令。


kemeng
3 days ago Comments:
3 days ago Comments:
[ar审核 2026-11-05] 结论:✅可认领开发。建议:km优先(建议仅负载均衡,任何人可抢,接单即开分支占位,comm同步防撞)。依赖:无。规范:一issue一分支,PR过L3;改门禁/契约/完成判据语义者ar复核diff。方向:拆除benchmark分支、判据回流完成定义,km认领;涉及门拆除ar复核。


一 复述
用户裁定:bench 是手段不是目的,产品里不应保留评测专用选项与分支。
Claude Code / Codex(公开 CLI 参数面)都没有评测档——评测由外部 harness 用产品本来就有的
通用旋钮(prompt / 超时 / 沙箱 / 权限)组合出来,产品不关心自己是否在被打分。
本 issue 不是「修 bench 的某个缺陷」,而是请求拆除
benchmark这一档本身,并把其中真正有价值的部分上收为产品通用能力。
关联诊断:
docs/BENCH_BRANCH_REMOVAL_DIAGNOSIS_20261101.md。先说清与既有 issue 的关系:现有 bench 类 issue(#34 #35 #36 #37 #38 #39 #53 #54)全部在
「让 bench 更好用」,没有一条问过「bench 该不该有」。过去一年为 bench 修的东西已经形成了
沉没成本,这个 issue 要求先回答那个没问过的问题。
二 影响面(10 处行为分叉 · 3 条激活通道)
2.1 三条激活通道,语义互不同步
--benchmarkxwkernel v1.4.38kernel-host/src/args.rs:305-308--scenario benchmark:302-303;xwrepl 0.2.56contract.rs:97-98SWEBENCH_CACHE环境变量xw-tools 0.1.32file_edit.rs:1018附带缺陷:
--mode benchmark静默成功但不生效——AgentMode::from_name("benchmark")(
xwcore 0.1.59config.rs:127-131)返回Default,oneshot.rs:388-396只校验名字合法性,于是它变成一个合法的
Default,不报错、不警告、不启用 bench。xwtui/src/app/input.rs:478的提示语还在教用户这个写法是合法的。
2.2 行为分叉清单(★ = 改变质量属性,不只是话术)
xw-tools file_edit.rs:906(:1233再跳一次)cargo check,新错误 > baseline 则回滚xwcore stages/check_exit.rs:26-35task_complete仅在has_patch时算完成,否则ignoredxwcore runtime/mod.rs:742-747task_complete工具xwcore prompt_kernel.rs:892-897use_bench时提前 return,只留 3 段:400-408[Benchmark Mode](英文):410-416xwcore stall_manager.rs:409-412:651:813xwcore runtime/init.rs:237-252Err退出2.3 提前 return 砍掉的 6 个通用段
prompt_kernel.rs:892-897在只组装了mbase + benchinject + benchdiag后return,:900-916这些段永远进不了 bench 的 system prompt:"修复类请求才需要产出 patch,问答类请求直接回复即可"← 区分「答题」与「施工」的唯一一句PromptMutate3.PromptLangVerify4.PromptDiagnostic(32 行)PromptDispatch6.# 项目语言: {lang}+PromptLangGuidance三 实测读数
3.1 我们自己的评测从没开过 bench
dswe_agents/xwcode_agent.py:132use_benchmark: bool = False;:322-329注释说明因 1.10.2 的HTTP 400 duplicate tool name而关闭。tests/benchmark/terminal_bench/xwcode_agent.py:229-239无该参数。3.2 而那个「修复条件」在 v1.10.4 已满足,注释已过期
task_complete重复注册xw-tools 0.1.32executor.rs:1136单测ac_1a_1_task_complete_def_not_unconditionally_exposed;xwcore runtime/request.rs:139-146最终tools[]按名去重50868c00a(1.10.2 期)git log -S "duplicate tool name"⇒ 为评测写的全部能力,我们一次都没验证过;而它的副作用已经在影响真实用户。
3.3 旁路被测试锁死(这是「手段变目的」的标本)
xw-tools tests/v1105_p16_cargo_check.rs:203-220:file_edit.rs:906的原注释更直白:「the eval harness (not the compiler) determines correctness」。好消息:DeepSWE / TB 都没设
SWEBENCH_CACHE(它只出现在tests/benchmark/swebench/{Dockerfile:66, run_host.py:595,1500}),所以 R3/R4 的归因不受影响。坏消息:走 SWE-bench 链路的评测,测的不是用户拿到的东西,分数不构成产品证据。
3.4 引用量(改动面可控)
生产引用(排除测试):
xwcore 35·xwkernel 14·xwrepl 10·xw-tools 7·xw-subagent 1≈ 67 处;测试侧断言
xwcore 15·xwkernel 10。3.5 已有一个先例:配置键层已去过一次
xwcore config.rs:928:assert!(!m.contains_key("benchmark"), "benchmark key removed per user decision")——用户此前已决定去掉
benchmark配置键。只去了配置键,代码层没去。四 为什么必须拆,而不是留着
4.1 评测的胜负判据,已经变成了产品的完成定义
check_exit.rs:26-35:task_complete只在has_patch时生效。在 SWE-bench 语境里「完成 = 有 patch」是判分器的定义;搬进产品后:
task_complete被 ignored ⇒ 无法以「完成」收尾纯信息型任务在产品里没有合法的完成路径。 唯一出口「不调工具、输出纯文本」又被
plan_detected挡住(stages/mod.rs:341)。两条路都堵死,行为上就是「答完还要继续干」。⇒ 这是 #59 的机制源头:
#59说「完成判据缺『这次不用施工』一档」,本 issue 指出那一档为什么缺——它被 bench 的判分口径占用了。两者应同批设计。
4.2 矛盾已被察觉,但选择的是「再造一个开关」
xwcore config.rs:212-226给batch_mode的字段注释:今天
benchmark_mode(评测档)与batch_mode(无人值守档,detect_batch_mode = !stdin_is_terminal)并存,后者才是评测真正需要的那一档,前者已被架空。
4.3 这不是野生行为,是制度化的
#30(已 closed)标题即「
benchmark场景系统提示加 API 形状硬约束」——为一次评测失败(
E0283、17 断言全灭)在提示词里加一条针对隐藏测试的规则。要拆 bench,需要同时停止这类加法。五 修法(分四步,每步可独立验收)
P0-1 删
SWEBENCH_CACHE旁路(先止血)file_edit.rs:1018(判定源)与:906/:1233(两处消费);v1105_p16_cargo_check.rs:203改为反证:断言「旁路已不存在 ⇒ 高错误编辑必被回滚」。P0-2 完成判据去评测化(与 #59 合并)
check_exit.rs:26-35的has_patch前置改为「任务目标达成」,信息型任务(无 patch)也可正常收尾;task_complete暴露面(runtime/mod.rs:746)从「Plan ∪ bench」改为全档可见。P1 提示词合并 + 停止判据统一
Into<T>/AsRef<T>)」prompt.benchinjectvs 注释prompt.benchmark.injectstall_manager.rs三处(:409-412/:651/:813)改由batch_mode门控,删benchmark_mode判据;4 条 bench 单测按
batch_mode改写。P2 删开关本体
--benchmark/--scenario benchmark/AgentMode::from_name("benchmark")三处入口;RuntimeConfig::benchmark_mode字段与build_runtime的对应形参(该函数已#[allow(too_many_arguments)],减一是净收益);batch_mode作为唯一「无人值守」档。六 验收
xwcode --benchmark→ unknown argument;--mode benchmark→ 明确报错(不再静默降级)。grep -r "SWEBENCH_CACHE" crates/仅剩run_host.py/Dockerfile(缓存目录用途,与行为无关)。grep -rn "benchmark_mode" xwcore/src为空;prompt_kernel.rs无use_bench分支与提前return。< /dev/null下,system prompt 只差「无人值守」相关行,不再差 6 个段。task_complete收尾,finish_reason=TaskCompleted,无 patch。失败形状收敛到「补丁对/不对」,不再出现「零动作」「散会」「跑了但编译不过」三类与模型能力无关的形态。
七 明确不做
max_iterations替代拆除。 那会把「该停没停」换成「没做完被迫停」,直接带回 R3 那批零动作失败(同 #59 §「明确不做」)。--benchmark。 开关即将删除,此刻翻它只污染基线可比性;R5 必须在拆除之后跑。batch_mode表达,不得再引入评测语义。