Open Code Review 项目解析知识图谱 / 分组目录 / 审查引擎 / 全文件扫描引擎

全文件扫描引擎

审查引擎高级方法机制G-B · 审查引擎

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

正反实例论证 · 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 去重
多个子任务对同一代码模式给出相同评论时不做批次级去重,重复评论成倍污染最终审查结果,开发者被迫处理大量冗余噪音。

实践资产 · Assets

源码节选
ReAct 主循环节选:RunPerFile / 终止条件 / 工具分派 / 异步评论
internal/llmloop/loop.go · 1778 B
源码节选
全文件扫描引擎节选:Run 时序 / DEDUP / PROJECT_SUMMARY
internal/scan/agent.go · 2732 B
源码节选
git 子进程并发限流(默认 16)
internal/gitcmd/runner.go · 1271 B

相关边