Sift 的 merge_same_task_evals 用原始字符串检查 fixture 内容冲突,但 EvalCase.setup_fixtures 按文件路径写入。data/input.txt 和 ./data/input.txt 指向同一个文件;两题使用相同 prompt、这两个路径及不同内容时,被误合并,后一个场景输入覆盖前一个,评测不再同时保留两套输入。
merge_same_task_evals
EvalCase.setup_fixtures
data/input.txt
./data/input.txt
在 packages/sift、已安装包依赖的环境执行:
packages/sift
from pathlib import Path from tempfile import TemporaryDirectory from sift.evals.transforms import merge_same_task_evals from sift.models import EvalCase, EvalSet, FixtureFile cases = EvalSet(skill_name="fixture-alias", evals=[ EvalCase(id=10, prompt="Inspect data/input.txt", fixtures=[FixtureFile(path="data/input.txt", content="success")]), EvalCase(id=20, prompt="Inspect data/input.txt", fixtures=[FixtureFile(path="./data/input.txt", content="failure")]), ]) out = merge_same_task_evals(cases) with TemporaryDirectory() as directory: out.evals[0].setup_fixtures(Path(directory)) print(len(out.evals), out.evals[0].flags, (Path(directory) / "data/input.txt").read_text())
当前输出:1 ['merged:2-evals'] failure。期望保留两题并标记 split:2-evals-conflict,各自在独立工作目录中得到原来的 success/failure 输入。多余分隔符及路径中间的 . 也会绕过检查,反转题目顺序同样复现。
1 ['merged:2-evals'] failure
split:2-evals-conflict
.
基于当前 master 9ce8017ee71e4dd3ddaebc2f568f3ca041d0c837,Python3.12 Host。13项真实公共合并入口/fixture落盘回归,在未修改基线上8失败、5控制通过;修复后13通过,现有生成器73项也通过,共86项。只在冲突比较时将相对路径中的 . 和多余分隔符归一,保留原始 fixture 路径、内容和兼容合并行为,不访问文件系统解析链接。
9ce8017ee71e4dd3ddaebc2f568f3ca041d0c837
核对59条所有状态Issue、91条所有状态PR及空尾页,未发现同一合并修复。#50涉及fixture路径越界,本问题使用工作区内普通相对路径,是不同场景输入被覆盖;修复不处理路径越界或符号链接安全。
原生Sift完整测试对照:未修改基线1798通过、修复版1811通过,均有相同6项既有缓存目录PermissionError、9跳过、1项e2e未选择;未关闭测试或修改期望,不声明全量通过。原生三文件适用pre-commit通过,OAT包装器BSD sed诊断保留;直接OAT扫描2个Python文件,文件类型/许可兼容/许可头均0问题,新测试真实Ethan_Zou版权署名1项不在规则名单,保留真实署名及原许可。没有真实Agent、模型或NPU执行。AI辅助调查与验证。
/assign @Ethan_Zou
问题背景
Sift 的
merge_same_task_evals用原始字符串检查 fixture 内容冲突,但EvalCase.setup_fixtures按文件路径写入。data/input.txt和./data/input.txt指向同一个文件;两题使用相同 prompt、这两个路径及不同内容时,被误合并,后一个场景输入覆盖前一个,评测不再同时保留两套输入。最小复现
在
packages/sift、已安装包依赖的环境执行:from pathlib import Path from tempfile import TemporaryDirectory from sift.evals.transforms import merge_same_task_evals from sift.models import EvalCase, EvalSet, FixtureFile cases = EvalSet(skill_name="fixture-alias", evals=[ EvalCase(id=10, prompt="Inspect data/input.txt", fixtures=[FixtureFile(path="data/input.txt", content="success")]), EvalCase(id=20, prompt="Inspect data/input.txt", fixtures=[FixtureFile(path="./data/input.txt", content="failure")]), ]) out = merge_same_task_evals(cases) with TemporaryDirectory() as directory: out.evals[0].setup_fixtures(Path(directory)) print(len(out.evals), out.evals[0].flags, (Path(directory) / "data/input.txt").read_text())当前输出:
1 ['merged:2-evals'] failure。期望保留两题并标记split:2-evals-conflict,各自在独立工作目录中得到原来的 success/failure 输入。多余分隔符及路径中间的.也会绕过检查,反转题目顺序同样复现。验证与修复范围
基于当前 master
9ce8017ee71e4dd3ddaebc2f568f3ca041d0c837,Python3.12 Host。13项真实公共合并入口/fixture落盘回归,在未修改基线上8失败、5控制通过;修复后13通过,现有生成器73项也通过,共86项。只在冲突比较时将相对路径中的.和多余分隔符归一,保留原始 fixture 路径、内容和兼容合并行为,不访问文件系统解析链接。核对59条所有状态Issue、91条所有状态PR及空尾页,未发现同一合并修复。#50涉及fixture路径越界,本问题使用工作区内普通相对路径,是不同场景输入被覆盖;修复不处理路径越界或符号链接安全。
原生Sift完整测试对照:未修改基线1798通过、修复版1811通过,均有相同6项既有缓存目录PermissionError、9跳过、1项e2e未选择;未关闭测试或修改期望,不声明全量通过。原生三文件适用pre-commit通过,OAT包装器BSD sed诊断保留;直接OAT扫描2个Python文件,文件类型/许可兼容/许可头均0问题,新测试真实Ethan_Zou版权署名1项不在规则名单,保留真实署名及原许可。没有真实Agent、模型或NPU执行。AI辅助调查与验证。