3345 字
9 分钟
Coding Agent 最大的问题不是写得慢,而是一次写太多:从 Stacked PR 重构 AI 代码评审

过去讨论 Coding Agent,最常见的问题是:

它能不能一次完成更大的任务?

但真正把 Agent 接进真实仓库以后,我越来越觉得这不是最重要的问题。

一个 Agent 如果能在 8 分钟内修改 20 个文件、写 1200 行代码、补测试、改接口、顺手重构几个旧模块,表面上看生产力很高;但如果最后落下来的是一个没有清晰边界的巨大 Pull Request,那么真正的瓶颈只会从“写代码”转移到“人类怎么确认这些代码是对的”。

于是 Agent 时代出现了一个非常现实的反直觉现象:

生成代码的吞吐越来越高,评审代码的吞吐却没有同步提高。

GitHub 在 2026 年 8 月公开的一篇工程文章里,专门用 stacked pull requests 讨论这个问题。官方示例把一个 1700+ 行、同时涉及数据层、API、业务连接与 UI 的巨大改动,拆成多个存在明确依赖关系的小 PR,让每一层都可以独立理解、验证和评审。

这篇文章不复述 GitHub 教程,而是从 Coding Agent 工程的角度进一步拆开一个问题:

未来 AI 开发流程真正需要优化的,可能不是“让 Agent 一次写更多”,而是“让 Agent 自动生成更容易被人类验证的变更结构”。

1. Agent 让“大 PR”问题变得更严重了#

传统人工开发里,一个 PR 变得过大通常是渐进发生的。

你先改一个模块,再发现接口要调整,再补几个测试,最后 UI 也跟着改。

等准备提交时才发现:

26 files changed
+1847 / -612

Coding Agent 不一样。

它可以在一轮任务里极快地完成跨层修改:

需求分析
↓
搜索仓库
↓
改 schema
↓
改 API
↓
改 service
↓
改 UI
↓
补 test
↓
跑 lint / build

从 Agent 视角看,这是一条连续任务链。

从 Reviewer 视角看,却可能是六个不同的评审问题被压进同一个 diff。

例如一个“给聊天应用增加商品搜索”的任务,可能同时包含:

  • 数据模型;
  • seed data;
  • API validation;
  • search endpoint;
  • chat grounding;
  • loading / empty / error states;
  • 产品引用卡片 UI。

这些内容虽然都属于同一个 Feature,但它们并不属于同一个认知单元。

因此真正的问题不是:

Agent 有没有完成整个 feature?

而是:

Reviewer 能不能在有限注意力里证明每个变化都正确?

2. Code Review 的瓶颈是“认知工作集”#

Review 一个 PR 并不是逐行检查代码有没有语法错误。

真正困难的是 Reviewer 需要在脑内建立一个临时模型:

旧系统怎么工作?
这次为什么改?
有哪些新增状态?
数据从哪里来?
接口契约变了吗?
异常路径是什么?
测试覆盖了什么?
有没有引入跨模块副作用?

PR 越大,这个临时模型越难维持。

可以把它理解成一种 review working set。

如果一个 PR 同时要求 Reviewer 记住:

数据库 schema
+ API 参数校验
+ service abstraction
+ React state
+ cache invalidation
+ Playwright 测试

那不是“多看几行代码”的问题,而是 Reviewer 必须不断在不同抽象层之间切换。

这也是为什么 1000 行改动不一定只是 100 行改动的十倍评审成本。

认知切换会让成本非线性上升。

3. Stacked PR 的核心不是“多个 PR”,而是依赖结构显式化#

Stacked PR 经常被简单理解成:

把一个大 PR 拆成几个小 PR。

这还不够准确。

真正关键的是:这些 PR 之间有明确顺序和依赖关系。

例如:

main
↓
L1: feat/catalog-data
↓
L2: feat/search-api
↓
L3: feat/chat-grounding
↓
L4: feat/grounded-ui

这里每一层都不是独立平行分支。

L2 依赖 L1,L3 依赖 L2,L4 依赖 L3。

于是整个 Feature 被重新表示成:

Feature = 一条可验证的依赖链

而不是:

Feature = 一个巨大 diff

这对 Coding Agent 特别重要,因为 Agent 本身非常擅长做依赖分析和任务分解。

4. 为什么 Agent 比人更适合维护 Stack?#

过去很多团队不愿意用 stacked PR,并不是因为不知道“小 PR 更好”,而是因为维护起来麻烦。

传统人工流程里需要不断处理:

branch A 更新
→ branch B 要 rebase
→ branch C 又依赖 B
→ review 修复进入 A
→ 后面全部同步

于是很容易变成:

review 更轻松
但 branch management 更痛苦

Coding Agent 恰好能吃掉这一类机械成本。

它可以负责:

  • 维护依赖顺序;
  • 自动 rebase / restack;
  • 检查每层 CI;
  • 根据底层 review 修改同步后续层;
  • 更新 PR description;
  • 重新跑受影响测试;
  • 提醒 stack 中哪一层变得 stale。

换句话说,人类真正不擅长的 stacked PR 运维,反而正好是 Agent 很擅长的确定性工作。

所以 Agent 并不是让 stacked PR 过时,而可能让 stacked PR 第一次真正变得低成本。

5. 一个更适合 Agent 的任务分解方式#

我不会直接告诉 Agent:

实现完整商品搜索功能

然后期待它最后自动生成一个漂亮 PR。

更可靠的 Harness 应该先要求生成 change graph。

例如:

Goal: 商品搜索
Dependency graph:
Data model
↓
Search service
↓
API endpoint
↓
Chat integration
↓
UI citation state

然后再根据几个规则决定是否应该拆层。

规则一:不同抽象层尽量拆开#

数据库、API、业务逻辑、UI 通常天然适合不同 PR。

规则二:不同 reviewer ownership 尽量拆开#

例如:

Data owner → L1
Backend owner → L2
Frontend owner → L3/L4

这比把所有人都拉进一个大 PR 更有效。

规则三:每层应该有独立验证信号#

例如:

L1 → unit test / schema validation
L2 → API contract test
L3 → integration test
L4 → browser / visual test

如果一个层无法独立验证,说明拆分边界可能还不够好。

规则四:不要为了“小”而切碎#

反面极端也存在。

如果一个 60 行改动被拆成 8 个 PR,Reviewer 反而要来回跳转更多上下文。

真正目标不是:

PR 越小越好

而是:

每个 PR 恰好对应一个可独立理解的 change unit

6. 我更关心“Review Surface”,而不是 LOC#

传统 PR 规模经常用 lines changed 衡量。

例如:

small < 200 LOC
medium < 500 LOC
large > 1000 LOC

但 Agent 时代我更想引入一个概念:

Review Surface。

它不只是行数,而是 Reviewer 需要同时理解多少种变化。

例如两个 PR 都是 400 行。

PR A:

新增一个独立 parser
+ parser unit tests

PR B:

改数据库字段
+ 改 API
+ 改 auth
+ 改 UI
+ 改缓存策略

它们的 LOC 相近,但评审难度完全不同。

可以粗略把 review surface 表示成:

Review Surface
≈ changed modules
× abstraction layers
× behavior paths
× ownership boundaries

这不是严格数学公式,但比单看 LOC 更接近现实。

7. Coding Agent 的任务成功率应该把“可评审性”算进去#

现在很多 Agent benchmark 只判断:

tests passed ?

或者:

issue resolved ?

但企业实际采用 Agent 时,还有一个关键指标:

这个 patch 是否容易被安全地接受?

我会增加几项指标。

Review Time#

从 PR ready 到 Reviewer 能做出 accept / request changes 的时间。

Review Reopen Count#

一个 PR 因上下文不清、scope 混杂而来回要求拆分多少次。

Cross-layer Correction Rate#

Reviewer 修复底层问题以后,有多少上层逻辑也需要跟着重做。

Change Rejection Cost#

如果最后决定不要这个 Feature,回滚需要撤销多少无关改动。

Reviewer Context Switches#

一次 Review 需要切换多少技术域。

这些指标能区分两种 Agent:

Agent A:一次写 1800 行,测试全绿
Agent B:拆成 4 层,每层验证清晰

在真实团队里,B 往往更容易进入生产。

8. Stack 中每一层都应该有自己的 CI Gate#

Stacked PR 最大的风险之一,是大家把所有验证都推到最顶层。

这样底层 PR 看起来虽然小,但并不能证明自身正确。

更合理的是:

L1
→ unit tests
→ type check
→ schema validation
L2
→ inherited L1
→ API contract tests
L3
→ inherited L2
→ integration tests
L4
→ inherited L3
→ Playwright / visual verification

这里一个非常重要的原则是:

每层负责证明自己新增的风险。

底层已经验证过的事实,不需要 Reviewer 在每一层重新从零证明。

这也是 stack 能降低认知成本的原因。

9. Review 顺序为什么通常应该 bottom-up?#

GitHub 的官方文章提到一个很实用的阅读方式:可以先从 Stack 顶部理解最终目标,但具体 Review 应该从底层往上。

原因很简单。

假设:

L4 UI
依赖 L3 chat integration
依赖 L2 API
依赖 L1 data model

如果 L1 的数据模型设计就是错的,那么直接 Review L4 的 UI 细节价值有限。

底层稳定以后,上层的语义才有可靠基础。

因此更合理的流程是:

先理解 top-level intent
↓
Review L1
↓
Review L2
↓
Review L3
↓
Review L4

对于 Agent 生成的改动,这一点更关键。

Agent 很可能在最初错误假设上继续构建大量后续代码。

越早在底层阻断错误,浪费越少。

10. Agent 应该什么时候自动拆 Stack?#

不是所有任务都值得 stacked PR。

我会给 Harness 设置一些触发条件。

例如满足任意两三项时自动进入 decomposition mode:

changed files > 10
estimated diff > 500 LOC
跨越 3 个以上目录
涉及 DB + API + UI
需要多个 reviewer ownership
存在明确依赖链
预计任务时间 > 30 min

然后 Agent 输出:

Proposed stack:
L1: foundation
L2: backend behavior
L3: integration
L4: UI

由人或 policy 选择是否接受。

这比等 PR 已经膨胀到 2000 行再人工要求“请拆一下”高效得多。

11. Stack 不是 Micro-PR 狂热#

有一种错误实践是:

一个函数一个 PR
一个类型一个 PR
一个测试一个 PR

这样会让依赖链变得比代码本身还复杂。

正确拆分应该满足一个基本条件:

每层都能够用一句话解释“为什么它自己就是一个完整的变化”。

例如:

L1: 建立商品数据模型与查询接口
L2: 暴露搜索 API 并完成参数校验
L3: 让 Chat 基于真实搜索结果生成回答
L4: 增加引用卡片与错误状态 UI

每一句都对应一个明确的行为边界。

如果你无法描述某层的独立价值,它可能只是机械切片,而不是工程切片。

12. 对 Agent 来说,Stack 还是一种 Context Management#

这个角度我认为特别值得重视。

如果 Agent 一次处理整个 2000 行 Feature,它自己的上下文也会越来越脏:

数据库决策
+ API schema
+ UI state
+ 测试日志
+ review feedback
+ browser output

而 stacked workflow 可以天然帮助 Agent 分隔工作集。

例如:

L1 Agent context
只关注 data layer
L2 Agent context
继承 L1 contract
但不需要保留 L1 的所有探索日志
L3 Agent context
只需要 API contract + chat code

这和 subagent / context pruning 的逻辑非常接近。

所以 stacked PR 不只是 Git 分支管理技巧,也可以成为 Agent context boundary。

13. 一个我会采用的 Coding Agent Stack Harness#

如果自己设计,我会把流程做成:

User Goal
↓
Repository Analysis
↓
Change Graph
↓
Stack Planner
↓
┌──────────────┐
│ L1 Executor │ → verify → commit
└──────┬───────┘
↓
┌──────────────┐
│ L2 Executor │ → verify → commit
└──────┬───────┘
↓
┌──────────────┐
│ L3 Executor │ → verify → commit
└──────┬───────┘
↓
Stack Submit
↓
Human Review Bottom-up

每一层 Agent 都只拿:

原始 goal
+ 当前 layer specification
+ 上一层的稳定 contract
+ 当前相关代码

而不是完整保留所有历史工具结果。

这会明显减少 context drift。

14. 怎么做一次 A/B 实验?#

如果你团队已经在用 Coding Agent,可以选 10 个真实中型 Feature 做对照。

A 组:Single PR#

让 Agent 自由实现完整 Feature。

记录:

总 diff
CI failure 次数
review time
review comments
返工次数
最终 merge 时间

B 组:Stacked PR#

模型、工具和任务不变,只增加 stack planner。

再记录:

每层 diff
每层 CI
底层修改传播次数
review time
总 merge time

最后重点比较:

Time to first review
P50 review duration
P90 review duration
Reviewer correction rate
Total human attention time

不要只比较 Agent 完成代码花了多久。

如果 Agent 多花 5 分钟做 decomposition,但 Reviewer 少花 40 分钟理解 diff,整体吞吐才是真正提升。

15. 真正应该优化的是 Accepted Change Throughput#

Coding Agent 很容易让团队关注一个危险指标:

Generated LOC / day

这个指标几乎必然会暴涨。

但组织真正想要的是:

被验证、被接受、能安全上线的变化数量

也就是我更愿意叫:

Accepted Change Throughput。

可以粗略表示成:

Generated Changes
× Verification Quality
× Reviewability
× Acceptance Rate

如果生成速度提高 5 倍,但 Reviewability 降低一半、返工率翻倍,最终收益不会有想象中那么大。

Stacked PR 的价值,就在于它不是提高“写代码速度”,而是在修复 Agent 时代最容易被忽略的后半段吞吐。

16. 一个适合个人项目的轻量版本#

个人开发者没有多个 reviewer,也不一定需要完整 gh stack 流程。

但仍然可以借鉴同样的设计。

例如一个较大 Feature,先让 Agent按顺序做:

Commit 1: data / types
Commit 2: core behavior
Commit 3: UI
Commit 4: tests / polish

每个 commit 都保持:

可构建
可验证
说明清楚

即使最终只提交一个 PR,review / rollback / bisect 都会轻松很多。

所以 stacked thinking 的价值并不依赖团队规模。

17. 我对 Agent-native Git 工作流的判断#

过去 Git 工作流主要是围绕“人写代码”设计的。

Agent 时代会逐渐出现新的基础动作:

Task decomposition
Dependency graph
Layered branch creation
Automated restack
Per-layer CI
Review-aware context
Change propagation

这些动作很可能最终会成为 Coding Agent Harness 的标准能力。

模型只负责生成代码还不够。

真正成熟的 Agent 应该知道:

这次改动是不是太大?
应该怎样拆?
哪些改动属于同一风险边界?
哪一层应该先验证?
review feedback 应该影响后面哪些层?

这才是从“AI code generator”进入“AI software engineer”真正需要的工程能力。

结语#

Coding Agent 的最大优势,是能够极快地跨越仓库完成复杂修改。

它最大的风险,也来自同一个地方:它太容易一次做太多。

当生成代码不再昂贵以后,下一阶段真正稀缺的资源会变成:

Reviewer attention
Verification bandwidth
Change isolation
Trust

Stacked PR 的意义不是回到“慢慢写代码”,而是让高速生成的改动重新获得清晰结构。

所以以后我判断一个 Coding Agent 是否成熟,不会只看它能不能一次完成 2000 行 Feature。

我更关心:

它能不能主动把一个大任务拆成一组有依赖顺序、每层可独立验证、可被人类快速理解的变化?

当 Agent 开始优化这个问题时,AI Coding 才真正开始进入团队工程效率,而不只是代码生成速度比赛。


参考资料#

本文中的 Review Surface、Accepted Change Throughput、自动拆层触发条件与 Harness 结构属于基于 GitHub 官方 stacked PR 机制做出的工程分析,并非 GitHub 官方 benchmark 或强制实践。文中没有虚构团队性能数据。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Coding Agent 最大的问题不是写得慢,而是一次写太多:从 Stacked PR 重构 AI 代码评审
https://blog.katelya.top/posts/2026-08-22-coding-agent-stacked-pr-review/
作者
Katelya
发布于
2026-08-22
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
AI Coding Agent 让开源项目快了 20 倍?从 vLLM/SGLang 33228 个 PR 看懂真正的工程信号
技术分享 基于一项覆盖 vLLM 与 SGLang 共 33228 个合并 PR 的最新纵向研究,拆解 AI Coding 时代开源基础设施开发速度、PR 周期、评论密度与机器人贡献的真实变化,并给出团队评估 Agent 效率时更可靠的指标框架。
2
Agent Plugins 1.0 到底统一了什么?从 Skills、MCP、Hooks 到可移植 Coding Agent 能力包
技术分享 Agent Plugins 1.0 不只是一个“插件市场”规范。它正在把 Skills、MCP Server、Hooks 与 Agent 配置打包成可版本化、可治理、可跨客户端迁移的能力单元。本文从工程结构、权限边界、团队复用和供应链风险四个角度拆解它真正解决的问题。
3
GitHub 把 Coding Agent 放进 CI 后,为什么不让它直接写?拆解 gh-aw 的 Sandbox、MCP 与 Safe Outputs
技术分享 从 GitHub Agentic Workflows v0.87.0 的安全加固出发,拆解 Coding Agent 进入 CI 后最关键的三层边界:Agent Sandbox、MCP Gateway 与 Safe Outputs,并给出可落地的最小权限工作流设计方法。
4
AI 写代码最怕的不是“屎山”,而是没人记得为什么:拆解 DeepSeek Harness 的 Agent Notes 决策记忆层
技术分享 2026 年 8 月,一篇关于 DeepSeek Harness Agent Notes 的社区讨论再次把一个老问题推到台前:AI Coding Agent 能快速生成代码,但代码之外的决策理由、被放弃的方案和验证边界往往没有被保存。本文回查 DeepSeek Harness 官方仓库,拆解其 proposed / implemented / rejected 生命周期、强制 alternatives、格式校验与归档机制,并讨论如何把“决策记忆”变成 Coding Agent 的长期工程资产,而不是把所有历史都塞进上下文窗口。
5
Coding Agent 真正的护城河不是模型:从 Vercel Harness 拆开工具循环、Sandbox 与 Context Pruning
技术分享 从 Vercel 新近公开的 Coding Agent Harness 教程出发,拆解为什么真正决定 Agent 能否长期工作的往往不是模型榜单,而是工具契约、执行隔离、上下文裁剪、子代理和验证闭环,并给出一套适合个人开发者复现的最小架构。

目录