trace-grader
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: trace-grader
Skill: trace-grader
Grade an agent's trajectory, not just its output. A run can return the right
answer via a bad path (force-pushed, retry-stormed, edited a file it never read) —
"corrupt success" — and it can be flaky (passes once, fails on rerun). An
answer-only checker is blind to both; TraceGrader inspects the path.
评估 Agent 的 trajectory(执行轨迹),而不仅是输出。一次运行可能通过不良路径返回正确答案(force-push、retry storm、编辑了从未读取的文件)——即“corrupt success”——也可能是 flaky(一次通过,重跑失败)。仅检查答案的检查器对这两种情况都无能为力;TraceGrader 会检查执行路径。
WHAT
WHAT(是什么)
Purpose và context
目的与上下文
- Purpose: chấm ĐƯỜNG ĐI của agent (tool choice, ordering, retries, repeatability, grounding) chứ không chỉ đáp án, để bắt "corrupt success" và flakiness bằng tín hiệu tất định gate được trong CI.
- Trigger (when to use):
- You have one or more agent runs (traces) and want to know how the answer was reached, not only whether it was reached.
- You need a repeatability gate: "does this task pass on ALL k reruns?" ().
pass^k - You want a deterministic, CI-gateable signal on tool choice / ordering / retries / step budget — before reaching for an LLM judge.
- Non-goals: không chấm chất lượng đáp án cuối; không bật trục agent-as-judge (STUB, chưa gọi) khi config còn ; không sửa run bị gắn cờ.
verified:false
- 目的: 对 Agent 的执行路径(工具选择、顺序、重试、可重复性、grounding)评分,而不仅是答案,以通过可在 CI 中作为 gate 的确定性信号捕获“corrupt success”和 flakiness。
- 触发条件(何时使用):
- 你拥有一次或多次 Agent 运行记录(traces),想知道答案是如何得出的,而不只是是否得出了答案。
- 你需要一个可重复性 gate:“这个 task 是否在全部 k 次重跑中都通过?”()。
pass^k - 你希望获得关于工具选择、顺序、重试或步骤预算的确定性、可用于 CI gate 的信号,而不是直接依赖 LLM judge。
- 非目标: 不评估最终答案的质量;只要 config 仍为 ,就不启用 agent-as-judge 轴(STUB,不会调用);不修改被标记的 run。
verified:false
Mental model
心智模型
trace nguồn (traces.json · audit jsonl · session transcript) → parser → run = [{step, tool, args, observation, ok}] → rule checks (config) + pass^k → verdict per run (clean-pass · pass-with-warnings · corrupt-success · fail) → exit 3 nếu corrupt/flakyharness/trace-grader.config.yamltrace 来源(traces.json · audit jsonl · session transcript)→ parser → run = [{step, tool, args, observation, ok}] → 规则检查(config)+ pass^k → 每次运行的 verdict(clean-pass · pass-with-warnings · corrupt-success · fail)→ 若存在 corrupt/flaky 则 exit 3harness/trace-grader.config.yamlInput và output contract
输入与输出契约
| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | | có (một trong ba) | canonical |
| In | | khi dùng audit/transcript | gán run vào task để tính |
| In | | không | output máy đọc |
| In | | có | forbidden tools, |
| Out | verdict per run + flags + khối | có | báo cáo |
| Out | exit code | có | |
| 字段 | 必填? | 含义 | |
|---|---|---|---|
| 输入 | | 是(三者之一) | 规范的 |
| 输入 | | 使用 audit/transcript 时必填 | 将 run 关联到 task,以计算 |
| 输入 | | 否 | 机器可读输出 |
| 输入 | | 是 | forbidden tools、 |
| 输出 | 每次运行的 verdict + flags + | 是 | 报告 |
| 输出 | exit code | 是 | 若存在 |
Rules và capabilities
规则与能力
- RULE-01 (MUST): The config file is the ONLY place rule parameters live. Same guess in two places = a leak.
- RULE-02 (MUST): Never present a guessed threshold as verified — the file stays until validated.
verified:false - RULE-03 (MUST): The agent-as-judge axis is OFF and uncalled until configured + verified; never fake an inferential score.
- RULE-04 (MUST): The audit parser cannot see per-step /observations, so
okwon't fire from a pure audit log — use fullretry_stormwhen you need failure-aware checks.traces.json - Capabilities: đọc file trace/log/transcript cục bộ; đọc một file config adapter; không gọi model (judge tắt), không ghi gì ngoài báo cáo.
- RULE-01 (MUST):配置文件是规则参数唯一存放的位置。在两处采用相同的猜测 = 泄漏。
- RULE-02 (MUST):绝不能将猜测的阈值表述为已验证;在完成验证前,文件保持 。
verified:false - RULE-03 (MUST):在完成配置与验证前,agent-as-judge 轴保持关闭且不会被调用;绝不能伪造推断性评分。
- RULE-04 (MUST):audit parser 无法看到每一步的 /observation,因此纯 audit log 不会触发
ok;需要 failure-aware 检查时,应使用完整的retry_storm。traces.json - 能力:读取本地 trace/log/transcript 文件;读取一个 config adapter;不调用 model(judge 已关闭),除报告外不写入任何内容。
Failure boundaries
失败边界
- Có run hoặc
corrupt-success→ exitpass^k = FAIL(failed cho CI gate) — đó là tín hiệu, không phải lỗi tool.3 - Nguồn chỉ là audit log → không thấy /observation từng bước,
okkhông bắn → kết quả partial, dùngretry_stormđầy đủ nếu cần.traces.json - Transcript không có task-verdict → bị ép True → tin FLAGS, không tin verdict delivered.
run.ok - Ngưỡng chưa kiểm trên trace thật → giữ , không trình bày như đã xác minh.
verified:false
- 若存在 run 或
corrupt-success→ exitpass^k = FAIL(对 CI gate 而言为 failed)——这是信号,而不是工具错误。3 - 来源仅为 audit log → 看不到每一步的 /observation,
ok不会触发 → 结果为 partial;如需 failure-aware 检查,请使用完整的retry_storm。traces.json - Transcript 没有 task-verdict → 被强制设为 True → 应信任 FLAGS,而不要信任已交付 verdict。
run.ok - 阈值尚未在真实 trace 上验证 → 保持 ,不要将其表述为已验证。
verified:false
HOW
HOW(如何使用)
Main workflow
主流程
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | deterministic | runs | Collect traces ( | nguồn trace | chỉ audit → partial (B01) |
| W02 | judgment | dự án | Set the boundary: chỉ sửa | config | — |
| W03 | deterministic | trace + config | Grade: chạy | verdict + flags + | rc 3 → W04 |
| W04 | judgment | báo cáo | Act on signal: điều tra bước bị cờ / coi task flaky là không tin được | kết luận | — |
| W05 | judgment | trace thật | (Later) verify adapter rồi flip | config verified | chưa đủ bằng chứng → giữ false (B02) |
Chi tiết từng bước (nguồn chân lý cho W01–W05):
- Collect traces. Either emit in the schema above, or point
traces.jsonat a--auditjsonl (one run perhooklib.audit()).session_id - Set the boundary. Edit ONLY — forbidden tools,
harness/trace-grader.config.yaml,retry_threshold,step_budget. Keep it the single place these values live.order_constraints - Grade. Run the grader; read per-run verdicts + flags + the block.
pass^k - Act on signal. = right answer, bad/unsafe path → investigate the flagged step.
corrupt-success= flaky → not safe to rely on.pass^k = FAIL - (Later) verify the adapter. Validate thresholds against real traces, then flip
. Only then consider enabling the agent-as-judge axis.
verified:true
| 步骤 | 类型 | 输入 | 操作 | 输出/退出 | 失败/下一步 |
|---|---|---|---|---|---|
| W01 | deterministic | runs | 收集 traces( | trace 来源 | 仅有 audit → partial(B01) |
| W02 | judgment | 项目 | 设定边界:只修改 | config | — |
| W03 | deterministic | trace + config | 评分:运行 | verdict + flags + | rc 3 → W04 |
| W04 | judgment | 报告 | 根据信号采取行动:调查被标记的步骤,或将 flaky task 视为不可信 | 结论 | — |
| W05 | judgment | 真实 trace | (稍后)验证 adapter,然后切换至 | config verified | 证据不足 → 保持 false(B02) |
各步骤详情(W01–W05 的唯一事实来源):
- 收集 traces。 根据上述 schema 生成 ,或让
traces.json指向--audit生成的 jsonl(每个hooklib.audit()对应一次 run)。session_id - 设定边界。 只能编辑 ——用于设置 forbidden tools、
harness/trace-grader.config.yaml、retry_threshold、step_budget。这些值只能保存在这一处。order_constraints - 评分。 运行 grader;读取每次运行的 verdict + flags + 块。
pass^k - 根据信号采取行动。 = 答案正确,但路径不良或不安全 → 调查被标记的步骤。
corrupt-success= flaky → 不可依赖。pass^k = FAIL - (稍后)验证 adapter。 对照真实 traces 验证阈值,然后切换至 。只有在此之后,才考虑启用 agent-as-judge 轴。
verified:true
How to run
如何运行
bash
undefinedbash
undefinedbundled 3-case self-test (clean / corrupt / flaky)
bundled 3-case self-test (clean / corrupt / flaky)
python3 harness/scripts/trace-grader.py --self-test
python3 harness/scripts/trace-grader.py --self-test
grade canonical traces, an audit log, or a full session transcript; --json for machine output
grade canonical traces, an audit log, or a full session transcript; --json for machine output
python3 harness/scripts/trace-grader.py --traces traces.json
python3 harness/scripts/trace-grader.py --audit .claude/audit/<date>.jsonl --task my-task
python3 harness/scripts/trace-grader.py --transcript ~/.claude/projects/<proj>/<session>.jsonl --task my-task
Exit code is `3` if any run is `corrupt-success` or any task is flaky (so CI can gate).python3 harness/scripts/trace-grader.py --traces traces.json
python3 harness/scripts/trace-grader.py --audit .claude/audit/<date>.jsonl --task my-task
python3 harness/scripts/trace-grader.py --transcript ~/.claude/projects/<proj>/<session>.jsonl --task my-task
如果任何 run 为 `corrupt-success`,或任何 task 存在 flaky,退出码将为 `3`(因此可用于 CI gate)。Branches
分支
| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | conditional_required | nguồn là audit jsonl thuần | chấm được nhưng | cần failure-aware → chuyển | W03 |
| B02 | capability_optional | judge model đã cấu hình VÀ config | mới xem xét bật trục agent-as-judge ( | chưa đủ → STUB, không gọi | W04 |
| ID | 类型 | 条件 | 行为 | 跳过/失败 | 汇合 |
|---|---|---|---|---|---|
| B01 | conditional_required | 来源为纯 audit jsonl | 可以评分,但 | 需要 failure-aware → 改用 | W03 |
| B02 | capability_optional | judge model 已配置且 config 为 | 只有此时才考虑启用 agent-as-judge 轴( | 证据不足 → 保持 STUB,不调用 | W04 |
Validation và stopping
验证与停止条件
Tất định: (3 case clean / corrupt / flaky), verdict và exit code do engine quyết. Cần review: việc flip sau khi so ngưỡng với trace thật. Dừng sau W04; W05 là bước làm sau, không chạy trong cùng lượt nếu chưa có trace thật.
python3 harness/scripts/trace-grader.py --self-testverified:true确定性验证:运行 (3 个 clean/corrupt/flaky case),verdict 和退出码由引擎决定。需要人工审查:将阈值与真实 trace 对比后,再切换至 。在 W04 后停止;如果尚无真实 trace,W05 属于后续步骤,不应在同一轮中执行。
python3 harness/scripts/trace-grader.py --self-testverified:trueExamples
示例
- Positive: trên phiên có Edit vào file chưa từng Read → flag
python3 harness/scripts/trace-grader.py --transcript ~/.claude/projects/<proj>/<session>.jsonl --task my-task(medium), verdictedited_without_read, chỉ ra bước bị cờ.pass-with-warnings - Boundary/failure: 3 lần chạy cùng task, 1 lần fail → → exit
pass^k = FAIL, task bị coi là flaky; run trả đúng đáp án nhưng có3(force-push, high) →forbidden_tool, exitcorrupt-success.3
- 正面示例: 在一个包含 Edit、但文件从未 Read 的会话上运行 → 标记
python3 harness/scripts/trace-grader.py --transcript ~/.claude/projects/<proj>/<session>.jsonl --task my-task(medium),verdict 为edited_without_read,并指出被标记的步骤。pass-with-warnings - 边界/失败: 同一 task 运行 3 次,其中 1 次失败 → → exit
pass^k = FAIL,该 task 被视为 flaky;某次 run 返回了正确答案,但使用了3(force-push,high)→forbidden_tool,exitcorrupt-success。3
Reference — What it is (build-now vs adapter)
参考 — 它是什么(当前构建与 adapter)
Built now — deterministic, no unknowns:
- Trace schema (the contract): a run = list of steps .
{step, tool, args, observation, ok} - Parsers: canonical ; the audit jsonl shape written by
traces.json(and code-loggerllmwiki/.claude/hooks/hooklib.audit()); OR a full Claude Code session transcript (events.jsonl) — the richest source: it recovers retrieval args (Grep--transcript, Readpattern),file_path, and per-stepobservation, so grounding + outcome are observable. Sidechain (sub-agent) lines are skipped; a transcript carries no task-verdict so itsokis forced True — trust the FLAGS.run.ok - : k runs of one task → require ALL k to deliver; report
pass^k.pass^k - Rule checks (config-driven): (high),
forbidden_tool(medium, viaout_of_order),must_precede(medium, >N consecutive same-tool failures),retry_storm(low, > budget),excessive_steps(medium — grounding proxy: an Edit/MultiEdit to a file never Read/Grep'd/Write-authored first; gated byedited_without_read).grounding.enabled - Verdict per run: /
clean-pass/pass-with-warnings(delivered and a high-severity flag) /corrupt-success(not delivered).fail
Quarantined behind ONE adapter — , :
harness/trace-grader.config.yamlverified:false- the rule PARAMETERS (forbidden list, retry threshold, step budget, order
constraints) — project-specific best-guesses, each ;
# ASSUMPTION - the inferential agent-as-judge axis (task-completion / tool-rationale /
planning rubric) — is a STUB, not called until a judge model is configured and the file is flipped
judge_trajectory().verified:true
Adapting later = edit that one file, never the engine.
当前已构建——确定性,无未知项:
- Trace schema(契约): 一次 run = 步骤列表 。
{step, tool, args, observation, ok} - 解析器: 规范的 ;由
traces.json(以及 code-loggerllmwiki/.claude/hooks/hooklib.audit())写入的 audit jsonl 形态;或者完整的 Claude Code session transcript(events.jsonl)——信息最丰富的来源:可恢复检索参数(Grep--transcript、Readpattern)、file_path和每一步的observation,因此可以观察 grounding + outcome。Sidechain(sub-agent)行会被跳过;transcript 不携带 task-verdict,因此其ok被强制设为 True——应信任 FLAGS。run.ok - : 同一 task 的 k 次 run → 要求全部 k 次都成功交付;报告
pass^k。pass^k - 规则检查(配置驱动): (high)、
forbidden_tool(medium,通过out_of_order)、must_precede(medium,同一工具连续失败超过 N 次)、retry_storm(low,超过预算)、excessive_steps(medium——grounding 代理指标:对某文件执行 Edit/MultiEdit,但该文件此前未被 Read/Grep,也不是先由 Write 创建;由edited_without_read控制)。grounding.enabled - 每次运行的 verdict: /
clean-pass/pass-with-warnings(已交付 且 存在 high-severity flag)/corrupt-success(未交付)。fail
隔离在单一 adapter 之后——,:
harness/trace-grader.config.yamlverified:false- 规则参数(forbidden list、retry threshold、step budget、order constraints)——项目特定的最佳猜测,每项均标记为 ;
# ASSUMPTION - 推断型 agent-as-judge 轴(task-completion / tool-rationale / planning rubric)——是一个 STUB,在配置 judge model 并将文件切换至
judge_trajectory()之前不会调用。verified:true
后续适配 = 只修改该文件,绝不修改 engine。
Reference — Files
参考 — 文件
| File | Role |
|---|---|
| deterministic engine: schema, parsers, pass^k, rule checks, report, judge STUB |
| the ONE adapter ( |
| self-test fixtures: clean / corrupt-success / flaky |
| 文件 | 作用 |
|---|---|
| 确定性 engine:schema、解析器、 |
| 唯一的 adapter( |
| self-test fixtures:clean / corrupt-success / flaky |