What · 是什么
无 diff 审查:枚举→过滤→分束→批处理→DEDUP 去重→项目总结,ScanItem 携带全文件内容
全文件扫描引擎实现无 diff 审查:不依赖 git diff,对仓库全量文件内容做审查
Run 时序:Enumerate→filterScanItems→filterLargeScans→dispatchSubtasks(按 batch)→maybeRunProjectSummary→WaitBackground→Finalize
ScanItem 携带全文件 Content,供模型基于全文审查
DiffLookup 返回合成 Diff:NewFileContent=全文、Diff 为空,使 resolveFromFileContent 路径生效
额外存在 DEDUP_TASK(CommentCollector.Snapshot/Since/ReplaceSince 批次级去重)与 PROJECT_SUMMARY_TASK
Provider.Enumerate 用 git ls-files + 未跟踪文件列举,2MiB 大小上限,8000 字节内容嗅探
Why · 为什么
原理 · Principle
新仓库/未提交场景没有 diff 可审,全文件扫描是唯一可行的审查入口
全文件内容让模型看到完整上下文,能发现跨函数/跨文件的逻辑问题(diff 模式看不到未改动区域)
合成 Diff 复用同一套解析管线,无需为 scan 单独实现定位逻辑
DEDUP_TASK 解决批次重复生成相同评论的问题;PROJECT_SUMMARY_TASK 提供项目级整体结论
How · 怎么做
Enumerate 枚举仓库文件:git ls-files 列出跟踪文件 + 未跟踪文件,共同构成扫描候选集
filterScanItems 过滤无需扫描的项,filterLargeScans 剔除超大文件(2MiB 上限)
内容嗅探:8000 字节取样判断文件类型/可审性,跳过二进制等不可审内容
每个 ScanItem 携带全文件 Content 进入子任务,按 batch 经 dispatchSubtasks 分发
DiffLookup 为扫描项返回合成 Diff(NewFileContent=全文、Diff 为空),使 resolveFromFileContent 生效,行号定位直接基于全文
批次级 DEDUP_TASK 通过 CommentCollector.Snapshot/Since/ReplaceSince 对重复评论去重
maybeRunProjectSummary 视条件触发 PROJECT_SUMMARY_TASK 生成项目级总结,最后 WaitBackground 等待后台任务后 Finalize
案例 · Cases
| 代表性案例 |
|---|
| 全新仓库首次审查无 git 历史,scan 模式全量枚举并逐文件审查 |
| 仓库含 3 个 5MB 大文件被 filterLargeScans 剔除,其余文件正常扫描 |
| 多个子任务对同一代码模式给出重复评论,DEDUP_TASK 批次级去重只保留一条 |
| 未跟踪的新文件被 Enumerate 纳入扫描范围,提交前就能被审查 |
反模式 · Anti-patterns
- 把 scan 模式当 diff 模式用,期待行号定位基于 diff 行号而非全文(合成 Diff 语义不同)
- 忘记 2MiB 上限,超大文件直接进子任务拖垮上下文
- 忽略 8000 字节嗅探,二进制文件被当文本扫描产出垃圾评论
- 不做 DEDUP_TASK 去重,批次重复评论成倍污染最终结果
正反实例论证 · Evidence
正例 · Pro
2MiB 上限+8000 字节嗅探,过滤不可审内容
items := Provider.Enumerate() // git ls-files + 未跟踪items = filterScanItems(items)items = filterLargeScans(items, 2*1024*1024) // 2MiB 上限for it := range items { if sniff(it, 8000) == Binary { skip(it) } // 字节嗅探}超大文件在进入子任务前被 2MiB 上限剔除,8000 字节取样嗅探跳过二进制,避免大文件拖垮上下文、二进制产出垃圾评论。
反例 · Con
不设上限不嗅探,超大/二进制文件直接进子任务
# 错误:全量扫描不过滤for _, f := range enumerateAll() { dispatch(ScanItem{Content: readAll(f)}) # 5MB 文件+二进制}超大文件直接进子任务撑爆上下文导致该任务失败,二进制文件被当文本扫描产出无意义评论,白白消耗预算。
正例 · Pro
DEDUP_TASK 批次级去重 + PROJECT_SUMMARY_TASK 项目级结论
snap := collector.Snapshot()since := collector.Since(snap)collector.ReplaceSince(dedup(since)) // 批次级去重maybeRunProjectSummary(items) // 项目级总结WaitBackground()Finalize()CommentCollector.Snapshot/Since/ReplaceSince 实现批次级去重,同一模式被多个子任务重复评论时只保留一条;PROJECT_SUMMARY_TASK 补充项目级整体结论。
反例 · Con
不做去重,批次重复评论成倍污染结果
# 错误:各子任务评论直接汇入collector.AddAll(subtaskResults) # 相同问题重复 N 条# 无 Snapshot/Since/ReplaceSince 去重多个子任务对同一代码模式给出相同评论时不做批次级去重,重复评论成倍污染最终审查结果,开发者被迫处理大量冗余噪音。