omk 用例设计指南
本页帮助用户编写和核对当前 v3 用例。字段的完整契约见样本格式;身份、封存和执行分工见输入编译规范。本页不定义另一份 Schema。
一、为什么用例设计需要科学性
统计分析只能回答已声明用例和测量设计中的问题。比较 baseline 与 skill,和比较两个 skill 修订,检验的是不同假设;单靠分数不能证明必要性、知识正确性或现实收益。先写明目标、适用范围、对照条件和预期证据,再设计用例。
二、Sample 元数据 schema
schemaVersion: omk.eval-sample-set/v3
samples:
- sampleId: s001
input:
inputKind: text
text: 用 React 画一个折线图,数据是日期 + 数值,给最小可运行代码
evaluationContext:
rubric:
component_selection:
criterion: 应识别 Line 组件并使用正确的数据格式
weight: 0.6
completeness:
criterion: 必须包含图表渲染容器
weight: 0.4
assertions:
- type: contains
value: Line
weight: 1
- type: regex
pattern: data
weight: 1
annotations:
capability:
- component-recognition
- api-selection
difficulty: easy
construct: necessity
provenance: human
covers:
- targetKind: reference
ref: references/chart-api.md
- targetKind: workflow_node
ref: chart.render字段语义
- capability(string[]):作者声明的能力标签。自行保持大小写和拼写一致;当前实现不承诺自动归一或能力分布聚合。
- difficulty(enum):
easy/medium/hard,非法值在执行前由 Schema 拒绝;它是作者声明,不是经统计校准的难度。 - construct(string):作者声明的测量假设,例如
necessity、quality或capability;允许自定义值,声明本身不验证构造效度。 - provenance(enum):
human/llm-generated/production-trace。omk sample生成时声明llm-generated;导入记录需要作者核对来源。 - covers(
{ targetKind, ref }[]):作者声明的结构锚点,如 reference、workflow 或 workflow node。未声明不等于未覆盖,已声明也不证明模型实际使用了该节点。
不参与 grading / judge / verdict
这些字段进入 Sample annotations,供审计和后续解释。当前 Rubric 评委不读取这些注释;它们不会自动改变评分权重或已注册 Decision。沙箱执行控制有独立职责,不能把实际改变执行的字段当成无影响注释。
注释仍是封存样本的一部分;修改它们需要重新编译测量设计并核对身份,不得用“未参与评分”作为复用旧产物的依据。精确摘要与复用规则由输入编译和 Core 契约规定。
沙箱评测字段(mocks / environment / tripwire / mocksStrict)
为了让评测脱离真实外部环境(数据库/API/文件系统/真 git push 等),Sample 还有一组沙箱字段。omk runtime 在工具调用前匹配 mocks,命中即返回假数据,不真调底层。
schemaVersion: omk.eval-sample-set/v3
samples:
- sampleId: s002
input:
inputKind: text
text: 用 antlogs-query 查最近 1 小时 ERROR 日志数量
executionContext:
mocks:
- tool: Bash
match:
command_glob: '*log-cli query --filter ERROR*'
return:
stdout: '{"count": 42}'
exit: 0
- tool: Read
match:
file_path_endswith: tasks/state.json
return: '{"status":"running"}'
- tool: WebFetch
match:
url_glob: https://internal.example.com/api/*
return: ok
mocksStrict: true
environment:
cli_available:
- log-cli
files_available:
- ~/.config/log-cli.json
notes: log-cli 已认证,token 在环境变量
evaluationContext:
rubric:
workflow_quality:
criterion: 应调用 logstore_query 工具,filter 包含 ERROR,时间窗口为 1 小时
weight: 1
assertions:
- type: tool_input_contains
value: Bash:logstore_query
weight: 1
- type: mock_hit
value: Bash:1
weight: 1
annotations:
tripwire: false字段语义:
- mocksStrict(boolean,默认
true):未命中任何 mock 的工具调用直接deny(LLM 看到失败结果)。production resolver 对生成和手写用例采用同一个 fail-closed 默认值。生成边界在有 mocks 时始终设为true,即使模型输出false;模型输出无权授权未命中的真实调用。只有人工编写的用例才可显式设为false,允许预期的真实 runtime 透传。**BREAKING-PROMPT / BREAKING-COMPARABILITY:**生成使用omk.sample-generation/v3,不自动重生成已有文件;新生成集须人工复核并建立新的比较基线。 - tripwire(boolean,默认 false):声明这是一条诱错用例,prompt 有意加入违反 rubric 或 skill 的诱导。Evaluation Core 会把该声明作为 Sample annotation 保留供审计;它不会把 failed observation 变成 success,也不会改写已注册 Decision。
- environment(object,可选):仅作 prompt 上下文的题设环境声明。LLM 可以据此跳过可用性探测(
which X/test -f Y/echo $Z)直接进工作流,但 omk 不会创建文件、导出环境变量或修改PATH。它不是 fixture 机制。doctor 仍可审计声明的物理路径(可用--skip-doctor跳过)。cli_available: string[]—— 假定已在 PATH 上files_available: string[]—— 题设引用的文件 / 脚本路径;需要读取真实字节时应使用executionContext.cwd或 mocksnotes: string—— 自由文本兜底,描述凭证 / 环境变量状态等
- mocks(object[],可选):工具调用拦截列表。运行时按数组顺序匹配第一条命中的 mock,返回
return/return_file/return_seq[hitCount]之一作为 tool_result。tool字段:工具名(如"Bash"/"Read"/"Grep")。特殊值"*":通配任何工具名,配合input_contains做 intent-level mock。match字段所有项 AND:file_path: string—— 严格相等(展开~)。仅在能预测完整路径时用(如~/.config/x.json)。file_path_endswith: string—— 后缀匹配:actual === suffix 或在路径分隔符(/或\)后以 suffix 结尾。默认推荐(工具调用可能使用绝对路径,严格相等可能无法匹配样本里的相对路径)。url: string/url_glob: string—— WebFetch / WebSearch 用,二选一。command_glob: string—— Bash 用,*通配跨换行(LLM 多行命令也命中)。input: object—— 通用 deep-equal 子集匹配(可写任意 tool_input 字段)。input_contains: string—— 递归扫描 tool_input 所有 string 值,任一含该子串即命中(大小写不敏感)。配合tool: "*"做 intent-level mock:LLM 搜代码时可能用 Bash grep / Grep 工具 / Glob / Read / Agent 等任意工具,用input_contains按关键词匹配意图,不用逐个枚举工具。示例:{tool: "*", match: {input_contains: "MyServiceName"}, return: "<service .../>"}—— 任何工具只要输入提到 MyServiceName 就命中。
- 返回源:每条 mock 必须且只能声明
return、return_file、return_seq之一。return接受 string 或{stdout, stderr, exit};return_file加载外置 fixture;return_seq[]是按命中次数取值的状态机,序列耗尽后保持最后一个值。
- 断言侧的 mock_hit / tool_input_contains:配合 mocks 使用。
mock_hit: "Bash:2"表示「第 2 条 Bash mock 必须被命中至少一次」,证明 LLM 走到了那一步。tool_input_contains: "Bash:logstore_query"验证 Bash 命令字符串里包含logstore_query。- 每条
mock_hit必须指向该工具已经声明的 mock 序号。引用不存在或越界时,loader 会在执行前拒绝用例。 - mock 支持是执行器能力,不是 trace 能力。
codex、codex-sdk和 API 直调执行器不安装拦截 hooks;需要 mock 时使用实现该协议的自定义执行器。选择不支持的执行器时,生成阶段自动切换为无 mock 用例,评测阶段则在运行前拒绝已有 mocks 用例。
- 每条
与 grading / judge 的关系:沙箱字段(mocks / environment / tripwire / mocksStrict)不进 judge prompt,judge 看到的只有 prompt + rubric + LLM 输出 + trace summary。tripwire 是审计元数据,不影响评分或已注册 Decision。当前 Core diagnostic projection 只报告经过认证的失败、缺失证据、排除项和稳定 reason code,不推断 tripwire_intentional 建议。
三、当前报告的阅读边界
Coverage 的当前含义
当前 Studio 评测页投影经过认证的 Core 产物。报告中的 evidence coverage 表达测量证据是否满足声明;它不等于作者填写的 capability 或 covers 的分布,也不等于知识库完备性。本文不承诺 Sample design coverage 面板或 Skill Map 样本覆盖着色。
四、自检清单:我的 sample 设计够科学吗?
- 问题、对照组和
construct声明一致,且没有把声明当成验证结果。 - 每个声称覆盖的能力都有代表性用例;逐项检查内容,不能仅数标签。
covers指向的结构存在,并有实际执行证据支持需要验证的使用行为。- 难度和来源覆盖实际场景;生成用例已人工复核,没有把自报来源当成污染检测。
- 根据效应大小、变异和预先声明的测量设计选择用例数;不存在通用的 5/20 条“足够”门槛。
- Rubric 写清可核对的标准;字数或关键词本身不能证明清晰度。
- 输入不泄露待验证答案;必须提供的上下文已明确纳入实验条件。
- 运行控制、mocks、fixture 和执行器支持均已核对,失败与缺失证据保持可见。
五、Verdict 解读如何配合 construct
PROGRESS / NOISE / REGRESSION / CAUTIOUS / UNDERPOWERED / SOLO 是已注册测量设计下的结论,算法不按 construct 标签自动切换。necessity 只是作者假设:PROGRESS 可以支持该实验条件下的差异,不能直接证明“skill 必需”。quality 也不能把一组样本的改善扩大成整体知识质量提升。
六、附录:设计依据与扩展边界
6.1 当前元数据的取舍
将输入、执行控制、评分期望与作者注释分开,有助于复核“实际测到的是什么”。标签方便描述意图,但自动归一、难度校准、污染检测、覆盖矩阵和构造效度验证都需要独立实现与验收,不能由字段存在推定已交付。
6.2 尚未承诺的分析能力
本指南不承诺 IRT 参数估计、自动挖掘对抗样本、Sample design health score、能力覆盖阈值或自动污染判定。研究方向需要真实需求和单独测量设计;不以固定的小样本数量或任意比例作通用科学保证。
6.3 字段扩展边界
当前 v3 Schema 是严格的,只能编写已支持字段;新增元数据必须显式变更契约,不能静默排除样本或改变 Δ 权重。
6.4 参考
实现边界
eval-workflows/inputs/contracts 定义样本类型,inputs/schemas 负责校验和机器 Schema,inputs/sample-mapping.ts 映射公开 v3 封套与内部 DTO。内部 DTO 不是第二种公开协议,也不是 v2 reader。
orchestration/measurement-design.ts 编译 Core 声明,measurement/evaluators 与 eval-runtime/evaluators 拥有相应评估实现,宿主在 hosts/composition 装配执行器与评分器。Core 不依赖样本编写、文件系统或具体执行器。
新增字段前须明确消费者、身份影响与公共契约版本;评分与复用语义改变需单独说明。