过程分析 · 方法论收口 · 第 4 讲
点 + 线:过程评估方法论与 Trajectory Linting
前三讲的所有工具——PRA、5 个 detector、step 分类——都在一条已经跑完的轨迹上做切片分析,这叫「点级」评估。 但真实软件开发是长时序的:一个任务接一个任务、一个补丁接一个补丁,loop 能不能持续推进、不破坏前序成果,是另一个维度的问题——「线级」评估。 这一页先搭出「点 + 线」的完整方法论地图(含 LoopsBench 的 25.00% 天花板警示), 再介绍把代码 linting 范式平移到轨迹上的 Trajectory Linting:8 条机械可判的规则,在一条真实 45 步轨迹上抓出 75% 的形式问题。
概览
5
评估层级栈
25.00%
线级评测天花板(最强配置)
8
示例 lint 规则
75%
真实轨迹形式问题抓出率
第一篇 · 五层评估栈:你评的到底是哪一层?
第 1 讲 · 1 盘点表
图 1 · 五层评估栈:左边三层是"一条轨迹自身有多可靠"(点),右边两层是"loop 在长时序上能不能持续推进"(线)——互补,不重叠。
任务级 → 点级 → 流程级 → 线级 → 形式层
| 层级 | 评测对象 | 本仓现状 | 代表工具 / 来源 |
|---|---|---|---|
| 任务级(终态) | 最终 patch 是否通过 F2P/P2P | ✅ 完整 | answer_evaluator(SWE-bench harness) |
| 点级(step 内) | 单个 step 的语义 / 结构正确性 | ✅ 完整 | 5 个 detector(第 3 讲的分类学与决策树) |
| 流程级(run 内) | 整个 run 的可靠性与约束遵守 | ✅ 完整 | PRA 七维 + 一票否决(第 2 讲) |
| 线级(long-horizon) | loop 在多任务 / 多 patch 上的持续性 | ❌ 空白(论文锚点已入仓) | LoopsBench(本页第二篇) |
| 形式层(lint) | trajectory 形式层静态检查 | ⚠️ 设计提案 | Trajectory Linting(本页第三篇) |
flowchart TB
subgraph SingleRun["单次 run 的评估(前三讲)"]
L3["任务级 · 终态
F2P/P2P · %Resolved"] L2["点级 · step 内
5 detector · 四分类"] L1_["流程级 · run 内
PRA 七维 + 一票否决"] L3 --- L2 --- L1_ end subgraph LongHorizon["跨 run 的评估(本讲补全)"] LOOP["线级 · loop 上
DAG 推进 · 回归义务保留
LoopsBench 5 metric"] LINT["形式层 · 静态检查
8 条机械规则 · 毫秒级
Trajectory Linting"] LOOP --- LINT end SingleRun ==>|「点+线」合并| LongHorizon
F2P/P2P · %Resolved"] L2["点级 · step 内
5 detector · 四分类"] L1_["流程级 · run 内
PRA 七维 + 一票否决"] L3 --- L2 --- L1_ end subgraph LongHorizon["跨 run 的评估(本讲补全)"] LOOP["线级 · loop 上
DAG 推进 · 回归义务保留
LoopsBench 5 metric"] LINT["形式层 · 静态检查
8 条机械规则 · 毫秒级
Trajectory Linting"] LOOP --- LINT end SingleRun ==>|「点+线」合并| LongHorizon
关键区分:点 = 在已存在的轨迹上做事后切片分析;线 = 让 loop 跑一条 DAG 任务,过程中记录它怎么路由、怎么保留回归义务。
本仓 5 个 detector 全是后处理,而线级评测要求把"评测契约嵌入 harness"——这是范式差别,不是加个工具的事。
素材:wiki/39 §0-§1
第二篇 · 线级评测:LoopsBench 与 25% 天花板
第 2 讲 · 1 抽象 + 1 警示
dependency DAG:把任务从"一题一补丁"抬到"依赖图上的多补丁"
核心抽象
- 每个 task 是一组可独立测试的开发单元(unit),单元之间用有据可依的前置依赖连成 DAG(4 种入边模式:sequential / structural / functional / compositional)
- 1 个 task = 多个 patch(如一个 Django 序列任务含 209 个 unit);而 SWE-bench 一个任务只有 1 个 patch
Flow-aware 评测运行时的 3 个机制
| 机制 | 做什么 | 防什么 |
|---|---|---|
| 拓扑门控测试发布 | 测试沿 DAG 按层释放,多前驱节点即门 | 防止"跳过前置直接做后置" |
| 回归义务保留 | 已完成 unit 的测试,永远是后续所有层的回归义务 | 防止"做新的、坏旧的"(SWE-bench 的 P2P 只查一次,这里持续查) |
| 双容器快照管线 | 容器 A 写入、容器 B 裁定,快照队列隔离 | 防止评测与执行互相污染 |
防作弊的关键约束:"门只影响评分,不影响编辑权限"——loop 可以跨层编辑任何文件,但不能看见 ready 标识。
评测契约嵌在 harness 里,而不是事后判分:这与人机协作中的"过程治理前置"同构——好的规则要在执行路径上拦截,而不是等出事再追责。
5 个指标与关键发现
| 指标 | 测什么 |
|---|---|
| RR(Resolve Rate) | 严格终态:所有已释放测试全过的任务占比 |
| TPR | 释放测试集合上的平均通过率 |
| Depth | 第一次人工接管前,单段执行沿 DAG 走了多深 |
| Reg | 回归义务保留能力(之前过、后来挂的比例) |
| Tok | 资源成本(输入 + 输出 token) |
三个泼冷水的发现(论文 RQ1-RQ3)
- 天花板极低:最强配置(Opus-4.7 + Claude Code + 外层续跑)RR 也只有 25.00%——长时序是 2026 年 frontier 模型的中心限制,不是"个别模型弱"
- loop 工程差异可达 3 倍:同一模型配不同 loop,RR 从 7.84%(Ralph 循环)到 24.11%(dynamic workflows)——而当前主流评测把 loop 当固定值,这层差异完全不可见
- 上下文刷新不消除回归压力:dynamic workflows 用 3 倍上下文预算拿到 24.11%,但每个 run 仍有 0.36 次回归事件——"忘掉历史"不等于"不欠历史的债"
素材:wiki/39 §3
LoopsBench 论文 PDF
第三篇 · Trajectory Linting:把 ESLint 的范式搬到轨迹上
第 3 讲 · 1 映射 + 8 规则
概念映射:代码 linting → trajectory linting
| Linting 概念 | 在 trajectory 上的对应 |
|---|---|
| 源代码文件 | 一条轨迹(JSONL,约 105KB) |
| 行号 | Step N(第 N 轮工具调用) |
| AST | 已结构化的事件序列(system / assistant / user / result) |
| Lint rule | 单条机械可判的规则(见下表 8 条) |
| severity(warn / error) | info / warning / error 三级 |
| --max-warnings 0 卡 CI | --max-errors 0 卡轨迹入库(流水线门票) |
| ESLint 报告 | violations[] 数组 + summary,每条带 fix_suggestion |
四条硬约束(守住才有意义):①机械可判——能从 JSONL 字段直接 parse/grep,不需要 LLM;
②只查形式不查语义——"行为模式"归 linter,"行为质量"归 detector;
③毫秒级——单条轨迹全量 lint < 100ms(detector 才是慢路径);
④每条规则必须给出修复建议。这跟 LLM 语义判断(agent_diet_analyzer)正交——linter 看形式,detector 看语义。
8 条示例规则 + marshmallow-1359 真实命中
| # | 规则 | 级别 | 触发条件 | 45 步真实轨迹命中 |
|---|---|---|---|---|
| 1 | redundant-pre-edit-reads | ⚠️ | 同一文件读 ≥5 次仍无编辑 | ✅ Steps 7,9,10,12-15 连读 fields.py 7 次,Step 19 才编辑 |
| 2 | wasted-edit-revert | ⚠️ | 编辑后 ≤3 步内删回,净效果为零 | ✅ Step 42 加测试、Step 44 删回 |
| 3 | no-verify-after-edit | 🔴 | 编辑后 ≥5 步无测试运行 | ✗ 未命中(Step 19 编辑→Step 20 立即 pytest,行为正确——阴性对照) |
| 4 | env-stuck-loop | 🔴 | 连续 ≥3 次命令失败且同类错误 | ✅ Steps 20-26 连续 4 次 ModuleNotFoundError(simplejson ×2 / pytz / distutils) |
| 5 | wide-net-search | ⚠️ | find 扫全盘 / 大目录且超时 | ✅ Step 2 扫整个 home 目录 120s 超时 |
| 6 | premature-tool-without-context | ⚠️ | 首个工具调用引用未验证的 env var / 绝对路径 | ✅ Step 1 cat $TASK_DIR/ca-issue.json——env var 实际未注入 |
| 7 | edit-without-test-scaffold | ⚠️ | 先改代码后补环境(本 run 有失败测试且最终未过) | ✅ Step 19 编辑后 Step 20 因环境问题失败——"先跑通 baseline 再动手"更稳 |
| 8 | trajectory-noop | 🔴 | ≥10 轮但最终 patch 为空 | ✗ 未命中(该轨迹成功交付) |
命中统计:该真实轨迹触发 6 warning + 1 error,8 条规则抓出 6/8 = 75% 的形式问题。
注意两条"未命中"的价值——它们是阴性对照,证明规则不是见谁咬谁。
而 Step 1(假设 $TASK_DIR 存在直接失败)与 Step 2(扫全盘找文件)连起来看,就是第一讲 L1 元决策层缺了"先确认工作目录"这个动作——lint 规则与过程模型互相印证。
素材:wiki/40 §1-§3
案例轨迹:experiments/marshmallow-1359
第四篇 · 三件套互补:lint · detector · PRA 怎么配合
第 4 讲 · 1 互补表 + 3 层路径
linter 是流水线门票,detector 是质量评测,PRA 是综合评分
| 维度 | Lint(形式) | Detector(语义) | PRA(综合) |
|---|---|---|---|
| 输出 | 违规列表(step + 消息 + 修复建议) | 分类计数 + 逐类证据 | 0-100 综合分 + 评级 |
| 速度 | 毫秒级 | 秒级(启发式)到分钟级(LLM) | 分钟级 |
| LLM 依赖 | 0 | 可选(启发式 / LLM / hybrid) | 可选(W3 单点 judge) |
| 用途 | 流水线门票(轨迹入库前必须 lint 通过) | 质量评测(详情页深挖) | 综合 verdict(评分卡) |
| 报告对象 | CI 门禁 | 分析工作台 | 训练数据筛选 / 人工复核 |
实现路径:从 1-2 天的 CLI 到 1-2 周的 auto-fix
- L1(1-2 天):rule pack + 单独 CLI——python -m trajectory_lint run --trajectory X --format json,输出 ESLint 风格报告
- L2(3-5 天):接入 detector_registry——@register_lint 装饰器 + S7 末尾自动跑 + --max-errors 0 卡 CI
- L3(1-2 周):auto-fix + 平台集成——修复建议经人确认后应用;Web 详情页加 Lints 标签;跨轨迹统计规则命中率当训练信号
为什么大规模训练特别需要它:MegaFlow 的 200 万+ 次执行、SWE-Universe 的 50 万条轨迹 / 30B token——所有大规模 agent 训练都需要廉价的轨迹质量筛。
LLM 级筛选每条都要花钱,lint 级筛选毫秒级免费:在昂贵的 rejection sampling 之前先用 linter 砍掉低质量轨迹,
等价于训练集清洗的初筛。这正是"形式层"在整个评估栈里的生态位。
思考与讨论
- 五层评估栈里,你所在的团队现在做了哪几层?缺的那层,最便宜的补法是什么?
- LoopsBench 显示"同模型不同 loop 差 3 倍"——如果你的产品只测过一种 loop,你的评测结论有多脆弱?
- 给 8 条 lint 规则再设计一条:从你自己的 Agent 使用经历里找一个"机械可判的坏味道",写出触发条件 + 修复建议。
- lint 的 --max-errors 0 卡在轨迹入库处 vs 卡在 PR 合并处——两个位置各拦住什么?各放过什么?
收口:整个单元的四讲地图
「轨迹分析与过程评估」单元总结:
- 第 1 讲(读):八阶段模型——轨迹有结构,S0-S7 + 两个循环 + 弯路四元组;控制源分布是人机分工的地图
- 第 2 讲(评):PRA 量表——100 分五维 + 一票否决;过程×结果矩阵救出"可疑成功"与"可信失败"
- 第 3 讲(诊):四分类 + 五工具——两套论文 7 个标签收敛成用户视角;24.88% F1 警示"LLM 裁判不能当唯一可信源"
- 第 4 讲(纲):点+线五层栈——线级 25% 天花板与 loop 3 倍差;lint 是毫秒级的形式层门票