已开启
[Bug] Sift merges conflicting fixture path aliases and overwrites scenario input #60
tianjun创建于  11 小时前
tianjun
11 小时前 创建

问题背景

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辅助调查与验证。

likedislike
Ttianjun
11 小时前 添加了label:bug
tianjun
11 小时前 评论:

/assign @Ethan_Zou

likedislike
CANN-robotCANN-robot成员
11 小时前 将 Ethan_Zou 设为负责人
Ttianjun
11 小时前 关联了pull request:fix(sift): preserve scenarios with conflicting fixture path aliases