轨迹调试与回放¶
把真实失败转化为可检查的证据,必要时进一步形成确定性回归测试。 Tracing 记录执行过程;轨迹汇集相关 attempt、模型/工具工件、对话上下文和结果标注。 添加埋点时参考追踪与埋点 API,本页介绍如何保存证据、诊断和回放。
保存失败 Attempt¶
Tracing 默认启用,可由 RAVEN_TRACING 或 tracing.enabled 改变。
失败后再开启追踪,不能补回此前缺失的工件。使用与失败运行相同的安装/trace store,
包括可能存在的 RAVEN_TRACING_DIR 覆盖。
raven trajectory list
raven trajectory save ATTEMPT_ID
将 ATTEMPT_ID 替换为列表中的 ID。Trace ID 可解析为所属 attempt,因此保存它可能
收集多个轮次。对于另一 Agent 的 workspace,可使用
save --workspace /path/to/agent/home 定位 session 记录。
save 创建自包含 bundle,并 pin 该 attempt,防止普通清理删除。
它不会脱敏。Manifest 报告缺失工件/消息和是否包含 session 上下文;
缺少证据的 bundle 不一定能回放。
原始 bundle 保留在本地、不要进入 git。其中可能有源码、prompt、凭据、工具输出 和私有对话历史。
生成经审核的报告¶
raven trajectory report ATTEMPT_ID --config /path/to/agent/config.json
使用被追踪 Agent 实际使用的 config,为已知 secret 脱敏提供依据。 命令重新打包当前证据,对副本脱敏,在审核/确认流程后生成本地可分享 tarball, 原始 bundle 保留。自动扫描通过不保证所有商业隐私都已删除。
结构化 bug package 示例:
raven trajectory report-bug ATTEMPT_ID \
--description "The tool result was omitted from the next model request" \
--expected "The next request includes the tool result" \
--actual "The next request has no tool result"
它创建本地记录/包,不会创建 GitHub issue 或上传报告。分享前检查 findings 和包内容。
--yes 不代表敏感数据风险授权,不应习惯性使用 --accept-risk 绕过,
或宣称所有 token 都无害。
回放 Harness,而不重复动作¶
raven trajectory replay ATTEMPT_ID --strict
raven trajectory replay ATTEMPT_ID --warn --json --out /tmp/raven-replay-report.json
这里的 ID 定位已经保存的 bundle,也可直接传目录。Replay 在临时 workspace 中, 将录制的模型回复和工具结果交给当前 harness,不执行真实工具代码,也不让新模型重新评估任务。 回放一次部署记录,不会通过其中录制的工具调用再次部署。
| 模式/结果 | 含义 |
|---|---|
--strict |
第一次请求与录制发生 divergence 时停止 |
--warn,CLI 默认 |
记录差异,继续按顺序喂入录制 |
| Exit 0 | 到达结束;warn 模式仍可能存在 divergence |
| Exit 1 | 目标或调用错误 |
| Exit 2 | 严格差异或录制耗尽导致提前停止 |
查看 divergence 的调用种类/index、字段、预期值和实际值。 “无差异”说明当前 harness 重现了被比较的录制,不说明原任务正确。 修复后出现一个特定差异,可能正是所需证据。
制作回归用例¶
在源码树中,从已保存 bundle 或审核报告创建骨架:
raven trajectory regression init /path/to/bundle --name tool_result_preserved
命令最小化并脱敏 cassette,检查剩余 findings,全部 gate 通过后才在
tests/trajectories/tool_result_preserved/ 发布草稿。已有目录会被拒绝。
完成以下文件后,才能认为用例就绪:
case.yaml:issue、owner、保护的契约、什么情况下允许重录; 对残留 findings 给出明确审核理由。expect.yaml:期望忠实复现还是特定的首次 divergence,并对真实请求作断言。
如果某个 fixture 的第一次模型请求现在包含修正后的用户消息, 以下说明性 expectation 可检查这个变化:
mode: strict
divergence:
kind: llm
index: 0
field: messages[1]
checks:
- call: llm
index: 0
message: 1
op: contains
value: expected corrected text
Index、字段和文本必须来自自己的 replay report,不能原样粘贴到无关案例。
需要忠实复现时省略 divergence,并断言应保持稳定的行为。
raven trajectory regression validate tests/trajectories/tool_result_preserved
raven trajectory regression validate --all
uv run pytest tests/test_trajectory_regressions.py -q
静态校验检查元数据、cassette 完整性、残留审核和大小;Pytest 才运行 replay 断言。
校验成功不能替代实际测试。贡献 cassette 前读 tests/trajectories/README.md;
原始报告和报告资产不能放进仓库。
明确 Replay 不测试什么¶
当前比较覆盖模型/streaming 路径、消息 role 和非 system 内容、工具调用与工具名称; 有意不比较 system-message 正文和完整工具 schema。
录制媒体不会重新输入,工具 display/abort/blocks 元数据不完整重建, 并行交错按顺序消费。顺序变化会表现为 divergence,不会智能重配。 缺少 attempt 之前的历史也可能导致提前出现差异。
System prompt 装配应使用针对性单元测试;provider 行为、浏览器、并发和外部副作用 应使用真实集成测试。固定回复不能证明新模型仍选择相同动作。 Evolver执行新的基准评估,replay 则针对录制诊断 harness 行为。
排障与保留¶
| 现象 | 检查 |
|---|---|
| 列表中没有 attempt | Trace root、追踪配置和日志是否保留 |
| 缺 session/artifact | Agent workspace 与 bundle manifest 完整性 |
| 回放立即停止 | 首次差异、缺失输入或 attempt 前历史 |
| Warn 成功退出但仍有 bug | 检查 divergence 并编写断言 |
| Init 后静态校验失败 | 完成草稿元数据/expectation,审核残留 |
| Trace 存储持续增长 | Pin 的语料与导出 bundle,不只是日志轮转 |
raven trajectory unpin ATTEMPT_ID 取消保留保护,不会删除导出的副本,
也不会给既有 bundle 脱敏。证据保留、分享和删除是不同决策。
实现位于 raven/trajectory/replay.py、regression.py、cassette.py、
redact.py 和 raven/cli/trajectory_commands.py。