v0.21.0
Minor — BREAKING bench ci 改名 bench gate(消除 omk 里 "CI" 歧义,从此 CI 永远只指置信区间),gate 内核切换为完整 verdict;single-run 盲区在用户旅程三处可见;CLI 双语 i18n 全面落地;发版自动化(publish.yml 现自动从 CHANGELOG 抽 release notes 建 GitHub Release)。
注:0.20.2 已 merge 到 main 但未发到 npm(tag 没打),所以从 0.20.1 升级的用户会在本版本一次性收到 0.20.2 + 0.21.0 两批改动。
Added
- CLI 双语输出 (zh / en):
omk所有 CLI 输出现支持中英两种语言。优先级--langflag >OMK_LANG环境变量 > 默认zh。覆盖范围:omk --help主帮助文档(140 行)+ 所有子命令 help(gold/verdict/diagnose/failures/saturation/debias-validate/diff/analyze)- 实时进度反馈(预检 / 重试 / 执行中 / 评委评审 / 已完成 / 已跳过 / 错误)
- 评测完成提示 + report server 启动信息 + gold dataset 对比反馈
- 参数校验提示(
--repeat/--judge-repeat/--judge-models/--bootstrap-samples/--no-debias-length等) bench gen-samples/bench evolve/bench gold/bench saturation等子命令的 runtime 反馈
- CLI i18n 基础设施:
src/cli/i18n.ts(tCli/getCliLang/parseLangFromArgv/langFromArgv/makeOnProgressfactory)+src/cli/i18n-dict.ts(~80 个 key,zh/en 双写,Record类型强制对齐)。新增test/cli-i18n.test.ts(10 用例)做 dict parity / placeholder 替换 / lang 优先级 runtime 校验。 src/cli/i18n-dict.ts头部翻译守则文档(受 lizhiyao/cc-viewer i18n 方案启发):明确"保留原文白名单"(产品名 / 子命令名 / 业务术语 skill/variant/sample/judge / 技术参数 / 文件名 / 数学缩写) vs "必须翻译的内容"(动作 / 状态 / 引导文案 / 解释),后续维护者按守则审 dict。
Changed
-
⚠️ BREAKING:bench ci删除,改名bench gate,内核同步升级为完整 verdict:omk 里 "CI" 一直有歧义——既指 Continuous Integration(bench ci命令),又指 Confidence Interval(bootstrap CI/diff CI/95% CI)。读代码注释 / 文档 / commit message 时常常需要看上下文猜哪个 CI。本版直接删除bench ci(omk 0-1 阶段不留兼容层),命令改名bench gate,从此 omk 里 CI 永远只指置信区间。改动范围:
- CLI:
omk bench ci→omk bench gate(=runEvaluation + computeVerdict + 0/1 exit code) - 内部:
evaluateCiGates→evaluateLayerGates,CiGateResult→LayerGateResult,VerdictOptions.ciThreshold→gateThreshold - 文件:
src/eval-core/ci-gates.ts→layer-gates.ts,test/ci-gates.test.ts→test/layer-gates.test.ts - 文档:
README.md/README.zh.md/docs/comparison.md/docs/zh/comparison.md/docs/knowledge-gap-signal-spec.md全部 sweep terminology-spec.md加 §5"CI 在 omk 里只指 Confidence Interval"显式规则
为什么改名"gate"而不是别的:业界 vocabulary(SonarQube Quality Gate / Azure release gates / Spinnaker pipeline gates),"gate" 在 CI/CD 圈是通用名词。codebase 内本来满地是
gate(three-layer gate/gate.allPass/layer-gate check),命令名也叫 gate 后,代码 / 文档 / commit 讲同一个词,可搜索性升一级。同步行为变更:gate 内核统一为 verdict——之前
bench ci只看三层平均分阈值(evaluateCiGates),用户花钱跑--bootstrap但 ci 退出码完全忽略 bootstrap diff CI、saturation、Krippendorff α——是个隐性漏洞。本版把handleCi重写为runEvaluation + computeVerdict + formatVerdictText,exit code 与bench verdict对齐:只有 PROGRESS / SOLO-pass 才 0;NOISE/UNDERPOWERED/CAUTIOUS/REGRESS全 1。这是行为变更:之前三层都过 3.5 即 PASS 的 underpowered run 现在会 FAIL——这正是 gate 应有的语义(数据不显著就不该进 deploy)。--threshold继续生效作为三层 gate 阈值,新增--trivial-diff调"实际可忽略的小差距"门限。两个 CLI 表层(gate一句话跑+判 /verdict离线判已有报告)继续保留,内核共用。这一改与下面的 single-run verdict rationale 是同一回路:underpowered 数据自动 FAIL,堵住"单轮过 PASS 就 deploy"的漏洞。迁移指南(用户面):GitHub Actions / GitLab CI / 任何 shell pipeline 把
omk bench ci替换为omk bench gate,其余 flag 不变。omk 还在 0.x,主动放弃兼容层,不留 deprecation alias。内部代码引用evaluateCiGates/ciThreshold的请相应改名。 - CLI:
-
single-run 盲区在用户旅程三处可见(三处一致信号):之前用户跑单轮(
--repeat=1)评测,没有任何一个面提醒"稳定性测不到"——单轮报告读起来就像满分,容易误读为"稳"。本版在用户接触 omk 的三个时间点都加显眼信号,单轮的盲区不会再被默默忽略:-
进门(
bench run/--dry-run跑前 stderr)——pre-flight 结构性预警,N<5 / N<20 / repeat=1 三档:N < 5→⚠ exploration-only, any conclusion is unreliable, CI will be uselessly wide5 ≤ N < 20→⚠ large-effect-only (Cohen's d > 0.8), medium effects hard to detect--repeat=1→⚠ single-run cannot measure stability (CV will be marked "not measured")
不预测 MDE 数值 — σ 跑前不知道,拍脑袋写"CI 半宽 ±0.4"是 hand-wave。所以纯结构性 hard-floor,严肃 power 判定交给
bench verdict+ saturation 曲线 post-hoc。buildPowerWarnings(n, repeat): string[]抽为纯函数,9 个单测覆盖各档边界。 -
决策(
bench verdict/bench gate)——computeVerdict加rationale.stability字段,三态:--repeat ≥ 2+ variance 数据齐:报CV=X.X% (稳定/中等/不稳, runs=N)主指标(阈值参考 terminology-spec §5)--repeat ≥ 2但 variance 缺失:标"variance 数据缺失"--repeat < 2:显式说「稳定性未测量(单轮评测,需 --repeat ≥ 2 才能测 CV)」
formatVerdictText同步打印 Stability 行,SOLO 单 variant 路径走同一逻辑。之前 verdict 不报告稳定性,导致单轮用户无法感知盲区。 -
复盘(HTML 报告稳定性列)——
--repeat=1时从灰色—+ 灰色"需 --repeat ≥ 2"改成红色⚠ 未测量+ 红字引导文案(英文⚠ Not measured/single-run; needs --repeat ≥ 2 to measure CV)。之前太弱容易被误读为"无显示=没问题",改红让缺失可见。zh + en snapshot 同步重生,UI 结构 0 改动。
无论用户是 CLI pipeline、verdict 用户、还是只看 HTML 的用户,都能在最自然的地方看到这个盲区。
-
-
user-facing 中文文案统一用「用例」,不用「样本」:
docs/terminology-spec.md§6 加显式规则——代码 / API / 文件名 / CLI flag(Sample/sample_id/eval-samples.json/--samples)继续用sample(开源 API + 英文圈通用术语),只 user-facing zh 切换。理由:omk 的eval-samples是开发者手挑的测试用例,不是从某分布随机抽样的统计样本——「样本」会暗示"再多跑就能扩大样本量"误导用户,实际是要补设计、补用例。本版同步把
src/cli/i18n-dict.ts(15 处 zh CLI 输出)/src/renderer/{summary,layout}.ts(报告 UI zh)/src/grading/{debias-validate,gold-cli}.ts(5 处 stderr)/src/analysis/{report,sample}-diagnostics.ts(22 处 diagnostic message)/src/authoring/{generator,evolver}.ts(7 处 LLM prompt zh) /src/types/report.ts+src/analysis/gap-analyzer.ts+src/eval-core/schema.ts注释 /docs/{knowledge-gap-signal-spec,zh/comparison}.md全部 sweep。HTML 报告 zh 快照同步重生。例外:统计学术语场景保留「样本」——Cohen's d / Hedges' g 的"小样本修正"、"样本均值"、"样本量"、bootstrap "重采样" 等是 stats 领域固定提法(对应英文 small-sample correction / sample mean / sample size / resampling),硬翻成「用例」反让懂统计的读者多一拍。判定准则:这个词指的是对总体的一次随机抽样(stats 概念,用「样本」),还是开发者手挑的一条测试用例(用「用例」)——两者不混用,上下文清晰。本版当前涉及 4 处统计语境(Cohen's d 多重比较 disclaimer / Hedges' g 小样本修正版描述 / t-test 正态假设小样本提示)保留「样本」。
-
CLI 默认输出从英文混搭中文改为彻底双语化:之前
omk bench run/omk --help/ 进度反馈混合中英文(例如 "评测完成 done"),用户每次 review 报告或调试都要"切语境"。本版整体重写:中文用户读到的全是中文,英文用户读到的全是英文,无任何中英混搭。 -
lib 层(非 cli)user-facing 错误统一英文:遵循"对客表达层 i18n / 内部实现层统一英文"分层原则,把
src/inputs/eval-config.ts(16 处)/skill-loader.ts(5 处)/load-samples.ts(4 处)/eval-workflows/run-evaluation.ts(3 处)/inputs/url-fetcher.ts(2 处)/inputs/mcp-resolver.ts(4 处)/executors/{anthropic,openai}-api.ts(2 处)/eval-core/evaluation-execution.ts(1 处)/server/report-server.ts(2 处)/authoring/{generator,evolver}.ts(6 处)/grading/gold-cli.ts(1 处)的中文throw new Error和process.stderr.write改英文。zh 用户看到的最终输出形如"错误: skill file not found: /path"——前缀本地化(由 cli 层负责),内部错误细节是英文工程内容。 -
unknown提示文案更准:未知模块→未知顶层命令,未知 bench 子命令→未知子命令: bench {command}(中文语序更自然)。 -
Skill 健康度日报中英混搭 bug 修复:之前 HELP 主常量中文版混杂了中文短语 "skill 健康度日报",现在英文版改为skill health report。
Fixed
-
directory-skill 路径解析(
SKILL.md约定):符号链接或非 cwd 子目录里的 directory-skill(例如~/.claude/skills/foo/SKILL.md引用assets/references/...相对路径)在评测时:- preflight 把所有 artifact 的文件依赖 fold 进单一 cwd 检查,不同 skill 的
assets/foo.md互相覆盖,会产生大量 false-positive missing。 - 运行时 executor cwd =
process.cwd()而非 skill 根,LLM 的 Read 工具按 SKILL.md 的相对路径找文件全部失败,触发反复 retry / 模型放弃 / 长时间超时。
修复:
Artifact加skillRoot?: string,在src/inputs/skill-loader.ts对 SKILL.md 约定的 directory-skill 设值(单文件 file-skill 维持process.cwd()语义不变)。src/eval-core/task-planner.tscwdfallback 链改为artifact.cwd > artifact.skillRoot > sample.cwd > null,src/eval-core/dependency-checker.tspreflightDependencies文件依赖按 artifact 分桶解析(每个 skill 用各自skillRoot当 base)。WCC skill 端到端验证:bug-fix 前 41 个 false-positive missing + 1 个 sample 180s 超时;fix 后 preflight 通过、tool failure 减半、不再超时,wcc 平均分从 4.25 拉回 4.62,与 baseline diff CI 不再显著负向。 - preflight 把所有 artifact 的文件依赖 fold 进单一 cwd 检查,不同 skill 的
-
依赖文件提取 regex 收紧:之前
FILE_PATH_REGEX把 SKILL.md 里"查看.d.ts/index.ts文件"这种示例性扩展名提及 / bare 文件名提及误识别为依赖。新增过滤:跳过以.开头的路径(扩展名讨论)和不含/的 bare 文件名(通用文件名几乎都是示例)。要声明package.json/README.md等 bare 文件作为真依赖请走显式requires:。 -
(已知漏洞)CLI 中英混搭:历史上 cli.ts / lib 层中混有大量"中文 stderr 嵌入英文 token / 英文 console.error 嵌入中文短语"。
grep -E "console\\.(log|error|warn).*[一-鿿]|process\\.stderr\\.write.*[一-鿿]|throw new Error.*[一-鿿]" src/现为 0 残留(除judge.ts测量学锚点不动)。
Internal
publish.yml自动从 CHANGELOG 抽 release notes 创建 GitHub Release:push tagv*触发后,workflow 在npm publish之后自动找 CHANGELOG.md## [VERSION]section,用作 GitHub Release 的 body。维护者只需 bumppackage.json+ 改 CHANGELOG[Unreleased]→[VERSION] - YYYY-MM-DD,merge release PR 后打 tag + push tag 即可,Release notes 不再手动写。- 协作者入场文档
CLAUDE.md精简(61 → 39 行,-36%):删除与CONTRIBUTING.md重复内容,目标"AI / 新人 90 秒读完不踩雷"。 src/cli.ts顶部const HELP142 行原英文模板字符串删除,内容完整迁到 dict。HELP现通过tCli('cli.help.main', lang).trim()取得。- 13 处
parseArgs options块统一 spreadCOMMON_OPTIONS = { lang: { type: 'string' } },所有子命令都接收--langflag。 defaultOnProgress改为makeOnProgress(lang)factory:evaluation engine 异步回调时拿不到 argv,通过 closure 闭住 lang。每个 handler 入口通过langFromArgv(argv)一行拿到 lang 并传 factory。- 测量学不变量未受影响:
src/grading/judge.tsprompt 文本字节级未动,test/grading/judge-hash-frozen.test.ts仍冻结v2-cot=fdc81b19c721/v3-cot-length=629bf3b8c41d两个 hash。 - 10 处测试 assertion regex 同步从中文更新为英文(
test/eval-config.test.ts/test/runner.test.ts/test/inputs/{load-samples,skill-loader}.test.ts/test/grading/gold-cli.test.ts)。
What's Changed
- docs: 加 CLAUDE.md(AI 协作者 / 新人入场必读) by @lizhiyao in #7
- ci: publish.yml 自动创建 GitHub Release by @lizhiyao in #6
- 特性(v0.21 D.1+D.4): CLI 双语 i18n + lib 层 user-facing 文本统一英文 by @lizhiyao in #8
- release: v0.20.2 — CLI 双语 i18n + publish.yml 自动化 by @lizhiyao in #9
- docs(claude-md): commit message 规则改为英文前缀 + 中文正文 by @lizhiyao in #10
- refactor(types): 删 facade src/types.ts, import 统一指向 types/index.js by @lizhiyao in #11
- fix(ci): publish.yml release 创建改用 softprops/action-gh-release, 修 yaml 解析失败 by @lizhiyao in #12
- fix(skill,preflight): directory-skill cwd 默认锚到 SKILL.md 所在目录 by @lizhiyao in #13
- chore(terminology): user-facing 中文统一用「用例」, 不用「样本」 by @lizhiyao in #14
- feat(verdict-stability): single-run 盲区在用户旅程三处可见 by @lizhiyao in #18
- chore(sync): bench gate 改名同步到 develop (PR #19 漏 sync 修复) by @lizhiyao in #20
- release: v0.21.0 by @lizhiyao in #21
Full Changelog: v0.20.1...v0.21.0