v0.22.0
Fixed
VariantSummary.toolDistribution修真实 call count:之前 aggregate 阶段按result.toolNames(per-sample dedup 列表)累加,语义是"出现该 tool 的 sample 数",跟字段名"工具调用分布"不符 — 用户读 summary 看到Read: 5以为模型调了 5 次 Read,实际是"5 个样本里出现过 Read"。修法:VariantResult加 per-sampletoolDistribution(从toolCallsreduce 得到真实 call count map),aggregate 时 sum per-sample 字段。旧报告 result 没toolDistribution字段时 fallback 到老toolNames语义保兼容。- release hardening:
- report server 测试改用动态端口(
port: 0),避免本机 7799 被占用导致测试套件偶发失败。 eval.yaml中的blind: true不再被bench run的 CLI 默认值覆盖;只有显式传--blind时才覆盖 config。- 启动期更新检查改为从
dist/src向上查找package.json,修复发布包内dist/src/package.json不存在导致的静默失效。
- report server 测试改用动态端口(
Changed
-
⚠️ BREAKING:report server URL 从/run/<id>改为/reports/<id>:命名跟 codebase 内一致语义(Report类型 /~/.oh-my-knowledge/reports/目录 /omk bench reportCLI 命令)对齐。/run/是 omk 内部把 "evaluation run" 当 entity 的旧叫法,但用户打开 URL 是来"看报告"的——/reports/直接匹配心智。同步改:/api/run/<id>→/api/reports/<id>,/api/runs→/api/reports。直接删旧路径,不留兼容 alias(omk 0-1 阶段)。已有书签需要更新。 -
⚠️ BREAKING-COMPARABILITY:bench run/bench gate默认对 baseline-kind variant 启用 skill isolation(--strict-baselinedefault true)。这是 omk 测量学严谨性的根本承诺补全:之前 baseline 通过三条 channel(SDK skill auto-discovery / subagent Skill 工具 / cwd 文件系统)拿到~/.claude/skills/全部 skill,导致 baseline-vs-skill 比较 construct invalid——baseline 自动发现并使用了被测 skill 的内容,verdict 看起来 NOISE 实为污染。本版默认三堵(main session skills + subagent Skill 工具 + cwd 切到 isolated empty dir),baseline 真正干净 → 验证用例集上 verdict 从 NOISE 翻盘到 PROGRESS。改动范围:
- CLI flag:新增
--strict-baseline(default true) /--no-strict-baseline(显式 opt-out 逃生口)。bench run+bench gate同步支持。pre-flight 在--no-strict-baseline+~/.claude/skills/非空时 stderr 显式提醒。 - eval.yaml schema:新增
variants[].allowedSkills?: string[]显式声明,优先级高于 CLI flag。undefined= 默认 /[]= 完全隔离 /[name1, name2]= 白名单。YAMLallowedSkills:不写值会被 parse 成 null,显式 reject(语义不清)。 - executor 行为:claude-sdk 注入
skills+disallowedTools:['Skill'];claude-cli 等价(--disable-slash-commands+--disallowedTools Skill,文档说前者就是 "Disable all skills"),任意非空白名单 throw 提示改 sdk(CLI 没暴露 partial whitelist);script 仅 stderr warn 不参与 isolation。 - cache key 升级
v2:prefix + 含 allowedSkills:旧 cache 一次性失效(避免 strict / non-strict 切换时误命中污染结果)。同 prompt 不同 isolation 必拿不同 cache key。 - report.meta.skillIsolation:新字段记录每个 variant 的 allowedSkills 快照(undefined → null),供跨报告对比。
--resume时 isolation 状态不一致 stderr warn 不阻塞。 - 隔离覆盖(三条 channel):
- main session skills(SDK
options.skills):skills:[]关 SDK 内部 skill 发现 - subagent Skill 工具(SDK
options.disallowedTools):disallowedTools:['Skill']关 SDK 内置 task subagent 调 Skill 工具 - cwd 文件系统访问(切到 isolated empty dir):baseline 默认 cwd 是
process.cwd()(用户评测工作目录),那里通常有skills/<name>/symlink 给 treatment 用 — baseline 用 Glob/Read 直接顺 symlink 读 SKILL.md 就完全绕过 SDK 隔离。strict 模式 + 用户没显式 cwd 时切到~/.oh-my-knowledge/isolated-cwd/(stable 空目录,cache 稳定),Glob/Read 探索不到任何 skill 文件。这条是 verdict 翻盘的真正 load-bearing channel:仅堵 SDK 两条 baseline 输出仍多处泄露被测 skill 的私有标识,加 cwd 隔离后绝大多数干净,残余少量是 prompt 自带。
- main session skills(SDK
- MCP servers:已默认堵(SDK
settingSources默认[]+ omk 不传mcpServers)。 - 已知 limit:
AgentDefinition.skills白名单精确控制留 follow-up(白名单场景 subagent 仍能调 Skill 工具,但 v1 用户主要用[]完全隔离,影响小)。
breaking-comparability 标记:旧报告(无
meta.skillIsolation)与新报告 verdict / Δ 不可跨版本对比——等同 judge prompt bump 一档;CHANGELOG 显式 callout。迁移指南:- 已有 baseline-vs-skill 评测脚本无需改 flag 即享受 default strict;旧报告作为"污染基线"留存,新跑作为"干净基线"。
- 需要老行为(测 baseline 走默认 skill 发现的效果)显式加
--no-strict-baseline。 - 跨版本对比 verdict / Δ 前先看
meta.skillIsolation是否一致。
设计 spec 见 docs/terminology-spec.md §七 Skill Isolation。
- CLI flag:新增
Internal
- 新增
buildSdkIsolationOptions(allowedSkills)(纯函数,可测) +buildIsolationWarnings(artifacts, strictBaseline)pre-flight helper。 resolveArtifacts(skillDir, variants, opts)新增opts: { strictBaseline?, variantAllowedSkills? },旧 caller 0 改动(opts 全 optional)。cacheKey()signature 加allowedSkills?: string[]入参,旧 caller 不传时退化到默认行为(但 prefix 升级到v2:,旧 cache 一次性失效)。- 单测覆盖:resolveArtifacts 三种优先级 / cache key 不同 isolation 不同键 + 顺序不敏感 / SDK option 形态契约 / claude-cli throw 非空白名单 / eval-config schema reject null + 非数组 / report.meta.skillIsolation populate / pre-flight isolation warning 触发条件。
What's Changed
- feat(skill-isolation): 默认隔离 baseline 的 skill auto-discovery 修 construct invalidity by @lizhiyao in #23
- refactor(server): URL /run/ → /reports/ 跟 Report 语义对齐 by @lizhiyao in #22
- docs(skill-isolation): 补 cwd 文件系统这条 channel + 三堵语义全描述 by @lizhiyao in #25
- fix(eval-core): VariantSummary.toolDistribution 修真实 call count by @lizhiyao in #24
- chore(release): 0.22.0 by @lizhiyao in #27
Full Changelog: v0.21.0...v0.22.0