Post

用 Codex 构建可验证的多 Agent 编码工作流:A 实施、B 审查、C 验证

用 Codex 构建可验证的多 Agent 编码工作流:A 实施、B 审查、C 验证

当一个 App 已经完成需求梳理、架构整改和任务拆分之后,真正困难的往往不再是”应该怎么改”,而是:

如何把几十甚至上百个整改任务稳定、可控、可验证地落地到代码里。

如果使用 VS Code 中的 Codex 进行开发,一个很自然的想法是:

  • 开一个窗口 A,让 Codex 负责实施;
  • 开一个窗口 B,让另一个 Codex 对 A 的实施进行独立审查;
  • 再增加一个 C,用测试、构建、静态检查等确定性工具进行客观验证。

最终形成:

1
2
3
A = Implementer
B = Reviewer
C = Verifier

也就是:

A + B + C

这比简单的”双 Agent 左右互搏”更加可靠。

因为真正的软件工程质量,不应该建立在”两个 AI 都觉得没问题”之上,而应该建立在:

1
2
3
4
5
Implementation
+
Independent Review
+
Deterministic Verification

之上。

适用场景:本文面向代码整改、技术债治理、安全修复、系统重构和大型 Refactor 等项目。当方案设计已经完成、任务清单已经确定、主要矛盾是”如何稳定落地”时,这套工作流价值最大。

不太适合的场景:需求尚不明确的原型探索、一次性小改动、临时调试。这些场景引入三个角色只会增加不必要的开销——具体边界见文末「附录 C」。

核心结论(TL;DR)

  • 单 Agent 会上下文漂移、自我审查存在天然偏差、测试通过不代表需求完整;
  • 双 Agent(A + B)本质都是语言模型,可能出现”一致但错误”的相关性判断;
  • 引入 C(确定性验证)并贯穿整个实施闭环,才能让”可验证”落到实处;
  • 执行顺序推荐 A → C → B,而不是 A → B → C;
  • 一 Task 一 Commit,B 只 Review 稳定 Commit,且 B 默认不修改代码;
  • 最终判定:DONE = B PASS + C PASS,而不是”A 说完成了”。

全文结构

  1. 单 Agent 与双 Agent 的不足(一 ~ 二)
  2. A + B + C 模型与角色隔离(三 ~ 五)
  3. A:Implementer 的实施纪律(六 ~ 八)
  4. B:Independent Reviewer 的审查纪律(九 ~ 十二)
  5. Git 作为 Agent 之间的同步协议(十三 ~ 十五)
  6. C:Verifier 的确定性验证(十六 ~ 十九)
  7. 执行顺序、状态机与记录协议(二十 ~ 二十四)
  8. 落地方式:VS Code 布局与 Git Worktree(二十五 ~ 二十九)
  9. 本质与最终原则(三十 ~ 三十二)
  10. 附录:Prompt 示例、落地检查清单与适用边界

一、为什么单 Agent 不够

假设我们已经有一份完整的整改计划:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FE-01 修复登录状态管理
FE-02 重构 API Error Handler
FE-03 统一前端请求重试策略

BE-01 重构 Auth Middleware
BE-02 增加 Refresh Token Rotation
BE-03 修复并发 Refresh Race Condition
BE-04 完成数据库 Migration

SEC-01 修复敏感信息泄漏
SEC-02 增加 Resource Ownership 校验

TEST-01 增加认证 Integration Tests
TEST-02 增加关键流程 E2E Tests

最简单的方式当然是:

1
2
3
把完整整改方案交给 Codex
        ↓
让它一路实施到底

但随着任务数量增加,这种模式很容易出现几个问题。

1. 上下文漂移

一开始 Codex 可能严格按照任务实施。

做到后面,它可能开始:

1
2
3
4
5
顺手重构
顺手优化
顺手改 API
顺手抽象
顺手调整数据结构

最终得到的代码也许”更优雅”,但已经偏离原始整改要求。

2. 自我审查存在天然偏差

如果 Codex 刚刚写完某段代码,再问:

1
请检查一下刚才的实现有没有问题。

它很容易沿着原来的思路继续证明自己的方案。

也就是说,当:

1
2
3
Implementer
=
Reviewer

时,缺少真正意义上的独立判断。

3. 测试通过不代表任务完成

例如整改要求是:

1
所有资源读取接口必须校验 Resource Ownership。

Codex 修改了:

1
GET /api/orders/:id

但可能漏掉:

1
2
3
GET /api/orders/:id/items
GET /api/invoices/:id
GET /api/files/:id

此时:

1
2
3
4
lint PASS
typecheck PASS
test PASS
build PASS

依然不能说明整改任务完整完成。

因为:

1
2
3
代码正确
≠
需求完整

二、为什么只用 A + B 仍然不够

于是我们自然会想到:

1
2
A = Developer
B = Reviewer

A 负责写代码,B 负责独立 Review。

这已经比单 Agent 强很多。

但仍然存在一个根本问题:

A 和 B 都是语言模型。

它们可能出现相关性错误(correlated errors)。

例如:

1
2
3
4
5
6
7
8
9
A 错误理解某个业务规则
        ↓
实现了一套逻辑
        ↓
B 阅读代码
        ↓
觉得"逻辑合理"
        ↓
PASS

问题在于:

1
两个 AI 一致

并不意味着:

1
代码一定正确

因此需要第三个角色——一个不依赖模型主观判断的确定性角色。


三、A + B + C 模型

最终架构:

1
2
3
4
5
A = Implementer

B = Reviewer

C = Verifier

其中:

A:负责实施

职责:

1
2
3
4
5
理解 Task
修改代码
补充测试
执行本地检查
形成 Git Checkpoint

B:负责独立审查

职责:

1
2
3
4
5
6
7
8
对照 Requirement
检查 Git Diff
检查遗漏
检查边界条件
检查回归风险
检查安全问题
检查测试有效性
给出 PASS / FAIL

C:负责确定性验证

C 不是第三个 Codex。

C 是:

1
2
3
4
5
6
7
8
9
10
lint
typecheck
unit test
integration test
E2E test
build
static analysis
security scan
API contract test
migration test

C 的特点是:

不参与讨论,只给结果。

例如:

1
2
3
4
5
TypeScript Compile: PASS
Unit Test: PASS
Integration Test: FAIL
E2E: PASS
Build: PASS

它不会因为代码”看起来合理”而放过问题。


四、完整架构

整个流程可以表示为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
                  MASTER REMEDIATION PLAN
                           │
                           ▼
                       TASK QUEUE
                           │
                           ▼
                    Select One Task
                           │
                           ▼
                 ┌─────────────────┐
                 │        A        │
                 │   IMPLEMENTER   │
                 └────────┬────────┘
                          │
                    Implement Code
                          │
                          ▼
                 ┌─────────────────┐
                 │        C        │
                 │    VERIFIER     │
                 └────────┬────────┘
                          │
                lint / test / build
                          │
                     PASS?
                    ┌─────┴─────┐
                    │           │
                   NO          YES
                    │           │
                    ▼           ▼
                  Fix A      Git Commit
                                │
                                ▼
                      ┌─────────────────┐
                      │        B        │
                      │    REVIEWER     │
                      └────────┬────────┘
                               │
                         PASS / FAIL
                         ┌─────┴─────┐
                         │           │
                        FAIL        PASS
                         │           │
                         ▼           ▼
                         A          DONE
                         │
                      Fix Code
                         │
                         ▼
                         C
                         │
                         ▼
                         B

这里非常重要的一点是:

C 不应该只在最后出现。

而应该贯穿整个实施闭环。


五、三个角色必须严格隔离

A + B + C 能否真正发挥作用,关键取决于:

Role Separation(角色隔离)。

三个角色不能互相越界。

推荐定义:

1
2
3
4
5
6
7
8
9
10
11
12
A:
有代码修改权

B:
有审查权
有否决权
默认没有代码修改权

C:
有验证权
没有设计权
没有解释权

六、A:Implementer

A 的目标不是”让代码变得更漂亮”。

而是:

准确完成当前 Task。

例如:

1
2
3
TASK: AUTH-03

实现 Refresh Token Rotation。

要求:

1
2
3
4
5
6
7
8
9
1. 每次使用 refresh token 后生成新的 refresh token;

2. 旧 token 立即失效;

3. 支持 token reuse detection;

4. 不修改 access token API;

5. 增加 integration tests。

A 的工作流程应该固定为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
读取 Requirement
      ↓
阅读相关代码
      ↓
理解影响范围
      ↓
实施修改
      ↓
补充测试
      ↓
调用 C
      ↓
修复失败项
      ↓
检查 Git Diff
      ↓
Commit

七、A 不应该拥有需求解释自由

整改阶段和探索开发阶段不同。

如果技术方案已经确定,那么 A 的权限应该受到限制。

例如不要告诉 A:

1
请优化整个认证系统。

而应该:

1
2
3
4
5
6
7
8
9
只实施 AUTH-03。

不要改变任务范围。

不要主动修改现有 API。

如果发现与本任务无直接关系的问题,
记录为 Finding,
不要顺手修复。

这样可以有效防止:

1
Scope Creep(范围蔓延)

八、一次只处理一个 Task

Multi-Agent Workflow 最常见的问题,不是模型能力不足,而是:

Task 太大。

不推荐:

1
2
3
TASK-01

重构整个认证系统。

推荐拆成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AUTH-01
统一 Access Token Validation

AUTH-02
重构 Refresh Token Storage

AUTH-03
实现 Refresh Token Rotation

AUTH-04
增加 Token Reuse Detection

AUTH-05
处理 Concurrent Refresh

AUTH-06
补充 Integration Tests

任务粒度越小:

1
2
3
4
5
6
7
8
9
Diff 越小

Review 越准确

Regression 越容易发现

失败越容易回滚

上下文越稳定

九、B:Independent Reviewer

B 的身份不是:

1
第二个 Developer

而应该是:

1
Independent Reviewer

它不负责回答:

1
"如果是我,我会怎么实现"

而负责回答:

1
"当前实现是否真正满足原始要求"

这是两个完全不同的问题。


十、B 应该基于 Requirement,而不是 A 的解释

例如 A 完成后说:

1
2
我已经解决了 Refresh Token Race Condition,
同时完善了并发保护和异常处理。

不要把这段话作为 B 的主要输入。

否则容易产生:

1
Anchoring Bias(锚定偏差)

更好的 B 输入应该只有:

1
2
3
4
5
6
7
Original Requirement
+
Current Code
+
Git Diff
+
Tests

即:

1
2
3
4
5
6
7
Requirement
    +
Implementation
    ↓
Reviewer
    ↓
Independent Conclusion

而不是:

1
2
3
Developer Conclusion
    ↓
Reviewer Verification

十一、B 应该检查什么

B 的 Review 至少应该覆盖以下几个维度。

1. Requirement Coverage

逐条检查:

1
2
3
4
5
Requirement 1 → DONE / NOT DONE

Requirement 2 → DONE / NOT DONE

Requirement 3 → DONE / NOT DONE

不是笼统地说:

1
整体看起来完成了。

2. Scope

检查:

1
2
3
4
5
6
7
有没有修改与 Task 无关的模块?

有没有扩大整改范围?

有没有改变原有 API Contract?

有没有修改不应该修改的数据结构?

3. Regression

例如修改:

1
Auth Middleware

需要考虑:

1
2
3
4
5
6
7
8
login
logout
refresh
session restore
API auth
WebSocket auth
background jobs
mobile client

是否受到影响。

4. Error Handling

检查:

1
2
3
4
5
6
7
8
invalid input
null
empty value
timeout
network failure
database failure
retry
partial failure

5. Concurrency

重点检查:

1
2
3
4
5
6
7
race condition
duplicate request
retry
idempotency
transaction
lock
parallel execution

6. Security

涉及用户和权限时,检查:

1
2
3
4
5
6
7
8
Authentication
Authorization
Resource Ownership
Privilege Escalation
Replay Attack
Token Leakage
Sensitive Logging
Input Validation

7. Test Quality

不是只检查:

1
有没有 Test

而是检查:

1
Test 有没有真正覆盖 Requirement

例如:

1
Refresh Token Rotation

至少应考虑:

1
2
3
4
5
6
7
8
9
10
11
正常刷新

旧 Token 失效

非法 Token

过期 Token

Token Reuse

Concurrent Refresh

十二、B 默认不要修改代码

这是整个模型最重要的纪律之一。

正确权限模型:

1
2
3
4
5
A = Write

B = Review

C = Verify

而不是:

1
2
3
A = Write

B = Review + Write

否则很快会变成:

1
2
3
4
5
6
7
8
9
A 修改 auth.ts
        ↓
B Review auth.ts
        ↓
B 顺手修复
        ↓
A 同时继续修改
        ↓
代码状态漂移

最终很难确认:

1
2
3
4
5
谁改了什么

Review 的是什么版本

失败应该归因到哪个改动

十三、不要实时互搏,要回合制

两个 Agent 同时操作同一个项目,看起来效率很高:

1
2
3
A Coding

B Reviewing

但实际上:

1
B 看到的文件状态

可能几分钟后就被 A 改掉。

于是:

1
2
3
Review Input
≠
Final Implementation

更好的方式:

1
2
3
4
5
6
7
A 完成稳定状态
      ↓
C 验证
      ↓
Git Commit
      ↓
B Review

也就是说:

Review Stable Checkpoint,而不是 Review Moving Target。


十四、Git Commit 是 Agent 之间的同步协议

在这个工作流中,Git 不只是版本管理工具。

它还是:

Agent Communication Protocol(Agent 之间的通信协议)。

例如:

1
2
3
4
5
6
7
8
9
AUTH-03
   ↓
A Implement
   ↓
C Verify
   ↓
commit abc123
   ↓
B Review abc123

这样 B Review 的对象永远明确:

1
Commit abc123

而不是:

1
A 当前工作目录里的某个瞬时状态

十五、一 Task 一 Commit

建议:

One Task, One Commit。

例如:

1
fix(AUTH-03): implement refresh token rotation

下一项:

1
fix(AUTH-04): detect refresh token reuse

这样 Reviewer 可以直接:

1
git show <commit>

而不需要面对:

1
2
3
4000 行 Diff
37 个文件
9 个 Task 混在一起

十六、C:Verifier

A + B + C 和普通双 Agent 工作流最大的区别,就是 C。

C 的目标是:

把能机械判断的问题全部交给机器。

避免 B 把时间浪费在:

1
2
3
4
5
6
7
代码是否能编译

类型有没有报错

单测有没有挂

Lint 有没有失败

这些问题应该由 C 判断。

B 应该把注意力放在:

1
2
3
4
5
6
7
8
9
10
11
需求完整性

逻辑漏洞

遗漏

风险

安全

边界条件

十七、C 应该包含哪些检查

根据项目类型不同,C 可以包括:

1
2
3
4
5
6
7
8
9
10
11
12
lint
format check
typecheck
unit test
integration test
E2E
build
migration test
API contract test
static analysis
dependency scan
security scan

例如一个 Web App:

1
2
3
4
5
npm run lint
npm run typecheck
npm run test
npm run test:integration
npm run build

如果是 monorepo,可以进一步:

1
2
3
4
frontend checks
backend checks
shared package checks
database migration checks

十八、C 的价值在于确定性

A 和 B 都可能说:

1
我认为这个实现没有问题。

C 不会。

C 只会给出:

1
PASS

或者:

1
FAIL

例如:

1
2
3
4
5
6
7
8
9
Lint: PASS

TypeCheck: PASS

Unit: PASS

Integration: FAIL

Build: PASS

那么当前 Task 就不能进入 Review PASS。


十九、C 不能替代 B

反过来也要注意:

1
All Tests PASS

不能代替 Code Review。

因为自动化验证只能测试:

1
已经被写成断言的东西

它不知道:

1
2
3
4
5
6
7
8
9
有没有漏接口

Requirement 是否理解错了

有没有不必要的架构修改

有没有未来维护风险

有没有安全设计缺陷

所以:

1
C ≠ B

同理:

1
B ≠ C

两者是互补关系,缺一不可。


二十、推荐的执行顺序

一个 Task 最稳的生命周期是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Requirement
    ↓
A Implement
    ↓
C Verify
    ↓
A Fix
    ↓
C PASS
    ↓
Commit
    ↓
B Review
    ↓
FAIL?
    ↓
A Fix
    ↓
C Verify
    ↓
Commit
    ↓
B Re-review
    ↓
PASS

因此:

1
A → C → B

其实比:

1
A → B → C

更加合理。

因为 B 不应该浪费精力去 Review 一份:

1
连 build 都过不了

的代码。


二十一、推荐状态机

如果整改任务很多,可以给每个 Task 一个明确状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TODO
 ↓
IMPLEMENTING
 ↓
VERIFYING
 ↓
IMPLEMENTED
 ↓
REVIEWING
 ↓
┌─────────────┐
│             │
▼             ▼
REJECTED     PASSED
│             │
▼             ▼
FIXING        DONE
│
└────→ VERIFYING

二十二、每个 Task 最好拥有自己的记录

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
id: AUTH-03

title: Refresh Token Rotation

status: REVIEWING

requirements:
  - rotate refresh token on successful refresh
  - invalidate previous token
  - preserve current access-token API

implementation_commit:
  - abc123

verification:
  lint: PASS
  typecheck: PASS
  unit_test: PASS
  integration_test: PASS
  build: PASS

review:
  status: FAIL

findings:
  - severity: P1
    description: concurrent refresh scenario is not handled

  - severity: P2
    description: expired refresh token path is not covered

这样整个整改过程不再是:

1
一堆 AI 对话记录

而变成:

1
一套有状态的软件工程流程

二十三、统一 PASS / FAIL 协议

B 的输出不要是:

1
2
整体写得不错,
还有一些地方可以完善。

因为这种结论无法驱动工作流。

建议固定输出:

1
STATUS: PASS

或者:

1
STATUS: FAIL

如果失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
STATUS: FAIL

P0:
- None

P1:
- Concurrent refresh may issue two valid refresh tokens.

P2:
- Integration test does not cover expired refresh tokens.

P3:
- Error naming is inconsistent.

二十四、严重等级

推荐定义:

1
2
3
4
P0 = Critical

必须立即修复。
存在严重安全、数据一致性或系统不可用风险。
1
2
3
P1 = Blocking

当前 Task 不允许 PASS。
1
2
3
P2 = Should Fix

原则上应在当前 Task 中处理。
1
2
3
P3 = Optional

代码质量或维护性建议。

PASS 条件例如:

1
2
3
P0 = 0

P1 = 0

对于高风险整改可以要求:

1
2
3
P0 = 0
P1 = 0
P2 = 0

二十五、推荐 VS Code 布局

最简单的方式:

1
2
3
4
5
VS Code Window A
/project

Codex Role:
IMPLEMENTER

以及:

1
2
3
4
5
VS Code Window B
/project

Codex Role:
REVIEWER

但要严格要求:

1
B 不修改文件

这样成本最低。


二十六、更稳定的方式:Git Worktree

如果项目较大,推荐进一步隔离工作环境:

1
/project

用于 A。

1
/project-review

用于 B。

例如:

1
2
3
4
5
6
7
workspace/

├── project/
│   └── Codex A
│
└── project-review/
    └── Codex B

A 负责:

1
implementation branch

B 负责:

1
stable review workspace

这样可以避免:

1
两个 Codex 同时访问不断变化的 Working Tree

二十七、不要让 B 提前看到 A 的思考过程

为了保持独立性,不建议把 A 的大量解释交给 B。

B 最好只看到:

1
2
3
4
5
6
7
Task Requirement

Git Diff

Relevant Code

Test Results

而不是:

1
2
3
4
5
A 为什么选择这个架构

A 为什么认为这是正确的

A 认为哪些风险已经解决

因为这些信息会影响 Reviewer 的独立判断。


二十八、把 AI 的主观判断与机器的客观结果分离

一个完整 Task 最终应该形成两类证据。

主观证据(来自 B)

1
2
3
4
5
6
7
Requirement covered

No obvious regression

Security model acceptable

No missing call sites

客观证据(来自 C)

1
2
3
4
5
6
7
Lint PASS

TypeCheck PASS

Tests PASS

Build PASS

最终:

1
2
3
4
5
DONE
=
B PASS
+
C PASS

而不是:

1
2
3
DONE
=
A 说完成了

二十九、最终推荐架构

完整模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
                      REMEDIATION PLAN
                             │
                             ▼
                         TASK QUEUE
                             │
                             ▼
                       ONE TASK ONLY
                             │
                             ▼
                   ┌─────────────────┐
                   │        A        │
                   │   IMPLEMENTER   │
                   └────────┬────────┘
                            │
                        Code Change
                            │
                            ▼
                   ┌─────────────────┐
                   │        C        │
                   │    VERIFIER     │
                   └────────┬────────┘
                            │
           lint / typecheck / tests / build
                            │
                         PASS?
                    ┌───────┴───────┐
                    │               │
                   NO              YES
                    │               │
                    ▼               ▼
                 A FIX          GIT COMMIT
                                    │
                                    ▼
                           ┌─────────────────┐
                           │        B        │
                           │    REVIEWER     │
                           └────────┬────────┘
                                    │
                              PASS / FAIL
                           ┌────────┴────────┐
                           │                 │
                          FAIL              PASS
                           │                 │
                           ▼                 ▼
                         A FIX              DONE
                           │
                           ▼
                           C
                           │
                           ▼
                           B

三十、这实际上是一个 Mini Engineering Team

到了这里,Codex 已经不只是:

1
AI Coding Assistant

而是在一个软件工程系统中承担角色。

整个结构类似一个小型研发团队:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Product / Architect
        │
        ▼
Requirement
        │
        ▼
Developer
        │
        ▼
CI / QA
        │
        ▼
Code Reviewer
        │
        ▼
Merge

映射到 Codex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Remediation Plan
        │
        ▼
Codex A
Implementer
        │
        ▼
C
Automated Verification
        │
        ▼
Codex B
Independent Reviewer
        │
        ▼
PASS

这已经非常接近一个小型研发团队的协作方式。


三十一、A + B + C 真正解决的不是”写代码速度”

它真正解决的是:

1
2
3
4
5
6
7
8
9
10
11
错误如何被发现

错误如何被阻断

任务如何被追踪

代码如何被验证

改动如何被回滚

需求如何避免遗漏

也就是说:

A + B + C 的目标不是让 Codex 更聪明,而是让整个系统对 Codex 的错误更加不敏感。

这是一个非常重要的区别。


三十二、最终原则

如果把整个方法压缩成几条规则,可以总结为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1. 一次只做一个 Task。

2. A 只负责实施。

3. C 负责所有可以机械验证的问题。

4. B 负责独立判断需求是否真正完成。

5. B 默认不修改代码。

6. Review 稳定 Commit,不 Review 动态工作目录。

7. 一 Task 一 Commit。

8. B 不依赖 A 的自我评价。

9. C PASS 不等于 B PASS。

10. DONE = B PASS + C PASS。

最终闭环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Implement
    ↓
Verify
    ↓
Commit
    ↓
Review
    ↓
Fix
    ↓
Verify Again
    ↓
Re-review
    ↓
PASS

附录 A:A / B 的 Starter Prompt 示例

原则讲清楚之后,附上可以直接使用的启动 Prompt,方便落地。

A:Implementer 的 Prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
你是 Implementer。

当前任务:
<粘贴 Task 描述>

要求:
1. 只实施这个 Task,不要扩大范围;
2. 不修改与任务无关的模块,不改变现有 API Contract;
3. 修改代码前先阅读相关调用链,理解影响范围;
4. 为本次改动补充必要测试;
5. 完成后运行指定的验证命令(lint / typecheck / test / build);
6. 提交时使用约定式提交,例如 fix(AUTH-03): ...;
7. 如果发现与任务无关的问题,记录为 Finding,不要顺手修复;
8. 最后汇报:改了哪些文件、验证结果、Commit Hash、Findings。

B:Independent Reviewer 的 Prompt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
你是 Independent Reviewer。

不要修改任何代码,只做 Review。

输入:
- Original Requirement(原始需求)
- Current Code(当前代码)
- Git Diff(本次提交的 Diff)
- Test Results(测试结果)

审查维度:
1. Requirement Coverage:逐条核对需求是否真正完成;
2. Scope:是否越界修改了无关模块;
3. Regression:是否影响既有功能;
4. Error Handling / Concurrency / Security;
5. Test Quality:测试是否真正覆盖需求。

输出固定为:

STATUS: PASS 或 FAIL

并给出 P0 / P1 / P2 / P3 分级问题清单。

注意:不要把 A 的解释、A 的自我评价、A 的架构说明粘贴给 B——那是 B 产生 Anchoring Bias 的主要来源。


附录 B:落地检查清单

把整套方法压缩成一份可勾选的检查清单,实施前对照一遍:

  • 任务清单是否已拆分到足够小(一个 Task 一个提交)?
  • 每个 Task 是否有明确的 Requirement,而不是一句”优化一下”?
  • A 是否只实施当前 Task,并把无关问题记录为 Finding?
  • C 是否贯穿每个 Task(lint / typecheck / test / build),而不是只在最后跑一次?
  • 是否做到一 Task 一 Commit,提交信息带 Task 编号?
  • B 是否只 Review 稳定 Commit,而不是动态工作目录?
  • B 是否拿到了 Original Requirement,而不是 A 的自我评价?
  • B 是否输出了结构化 PASS / FAIL 与 P0 ~ P3 问题清单?
  • B 是否全程没有修改代码?
  • FAIL 后是否走”A 修复 → C 验证 → 新 Commit → B 重新 Review”闭环?
  • DONE 是否同时满足 B PASS 和 C PASS?
  • 每个 Task 是否有状态记录(TODO → IMPLEMENTING → … → DONE)?

附录 C:什么时候不需要 A + B + C

这套工作流有明确的开销:三个角色的上下文、多轮验证与 Review 循环,都会消耗时间和 Token。以下场景引入它会得不偿失:

  • 原型探索 / 需求还不明确:还在”试方案”阶段,先让单个 Agent 快速验证可行性,而不是过早套流程;
  • 一次性小改动:改一个配置、修一行 bug,A + C 两步就够,B 的独立审查收益有限;
  • 纯文档 / 纯配置变更:没有可验证的代码行为,C 的确定性验证无从谈起;
  • 时间极紧的一次性任务:如果改动影响面小、可快速回滚,简化为 A + C 即可。

判断标准很简单:

只有当”错误发现得越晚代价越高、且任务规模足够大”时,A + B + C 的收益才大于开销。

技术债治理、安全修复、系统重构正是典型的”错误代价高、规模大”场景,因此最值得使用这套工作流。


结语

当一个项目已经拥有完整的整改方案和任务清单以后,真正需要优化的就不再只是 Prompt。

更值得设计的是:

整个 AI Coding Workflow。

单 Agent 模式关注的是:

1
怎么让 AI 一次写对?

A + B + C 模式关注的是:

1
2
3
4
5
6
7
8
即使 AI 没有一次写对,
系统能不能发现?

发现之后能不能阻止?

阻止之后能不能修复?

修复之后能不能重新验证?

这才是真正适合大型整改项目的思路。

最终我们得到的不是一个”更会写代码的 Codex”。

而是一套:

1
2
3
4
5
6
可实施
可验证
可审查
可追踪
可回滚
可持续推进

的 AI 软件工程系统。

对于已经完成方案设计、当前主要任务是全面实施落地的项目来说,A + B + C 往往比单纯追求更长的 Prompt、更大的 Context 或更多并行 Agent 更有价值。

因为高质量的软件工程,从来不应该依赖:

“希望这次 AI 没犯错。”

而应该依赖:

即使它犯错,系统也能把错误挡在最终代码之外。

This post is licensed under CC BY 4.0 by the author.