KoiMoe Diary

把多 Agent 开发整理成一条会回头的路

4 days ago 8 min read 48 Views 0 Likes 0 Comments

上一篇写多 Agent 协作时,我还只是把 plan、task 和 review 放进一个比较安静的文件状态机里。那时问题还集中在“计划写完以后谁来审”“task 完成以后放到哪里”这些事情上。

后来项目继续往前走,测试、联调、回归、缺陷修复都慢慢加入进来。流程也不再只是 plan -> task 这么短的一段路,而变成了一条会绕回来、会留下证据、也会提醒人不要太快把事情说成完成的路。

这篇就整理一下现在这套生命周期。它仍然很朴素:目录表示阶段,文件标记表示状态,review 标记表示结论。只是这一次,它不只服务于开发,也服务于测试和修复闭环。

先说整体形状

现在文档体系大概分成五块:

development-plans   # 要做什么,为什么做
  development
  ready
  complete

development-tasks   # 怎么做,做了什么
  development
  complete

test-cases          # 怎么验证
  development
  ready
  complete

tests               # 验证结果、缺陷、回归和总结
  execution-results
  defects
  summaries

final-reviews       # 阶段性质量门禁

我越来越觉得,Agent 协作里最重要的不是让每个 Agent 都变聪明,而是让它们少猜一点。

文件在哪里,就代表它现在处于哪个阶段。文件末尾有什么标记,就代表它能不能被下一个 Agent 处理。review 文件有没有写完、结论是什么,也都用统一标记表达。这样一来,人和 Agent 都不用在一堆文档里凭感觉判断。

Plan:先把要做的事说清楚

Plan 是开发前的设计文档。它负责回答:为什么要做、做什么、不做什么、风险在哪里、完成后怎么验证。

development-plans/development
  - 正在规划
  - 等待 plan review
  - 等待修复 plan review

development-plans/ready
  - plan review 已通过
  - 等待开发

development-plans/complete
  - 对应 task 已完成
  - task review 已通过

plan 文件的状态标记也很直接:

<!-- PLAN_STATUS: READY_FOR_REVIEW -->
<!-- PLAN_STATUS: READY_FOR_DEVELOPMENT -->
<!-- PLAN_STATUS: DEVELOPMENT_COMPLETED -->

对开发 Agent 来说,它不需要翻所有计划,只需要看 development-plans/ready。那里就是“已经被审过,可以开始做”的入口。

Task:把实现过程留下来

Task 是真正开发时的执行记录。它不是单独漂在外面的 todo,而是从 ready plan 出发,记录实现做了什么、改了哪些文件、怎么验证。

development-tasks/development
  - 正在开发
  - 等待 task review
  - 等待修复 task review

development-tasks/complete
  - task review 已通过
  - 开发完成归档

task 的状态比 plan 更短:

<!-- TASK_STATUS: READY_FOR_REVIEW -->
<!-- TASK_STATUS: REVIEW_APPROVED -->

当 task review 通过后,task 进入 complete,对应的 plan 也会从 ready 移到 complete。这样一件开发工作才算真正从计划走到实现。

Review:不要把“写完了”和“通过了”混在一起

review 文件现在都使用双标记:

<!-- REVIEW_STATUS: READY_FOR_RESOLUTION -->
<!-- REVIEW_RESULT: APPROVED | APPROVED_WITH_NOTES | CHANGES_REQUESTED -->

REVIEW_STATUS 只表示 reviewer 写完了,resolution agent 可以读取。REVIEW_RESULT 才是结论。

这两个标记拆开以后,很多误会会自然消失。review 文件存在,不代表 review 已经完成;review 完成,也不代表它通过了。只有两件事都清楚,后续的 resolution 才能继续。

Test Case:先审测试设计,再执行

测试用例也有自己的生命周期:

test-cases/development
  - 测试用例编写中
  - 等待测试用例 review
  - 等待修复测试用例 review

test-cases/ready
  - 测试用例 review 通过
  - 等待执行

test-cases/complete
  - 该用例所需的 API / Browser / Regression 验证都完成

这里有一个很容易误解的点:单个 API 执行结果通过,并不一定代表测试用例可以归档。

如果一个测试用例要求 API 和 Browser 都验证,那么 API 通过以后,它仍然应该留在 test-cases/ready。只有它需要的范围都完成,并且没有相关 defect、没有待处理 plan,才进入 test-cases/complete

Test Result:从 run 级归档改成文件级 resolution

这是最近最大的变化。

一开始我把测试执行结果按 run 管理。每次执行创建一个 runs/<run-id>,等整个 run 全部通过以后再移动到 complete。这个规则看起来整齐,但实践里很快变得笨重。

一个 run 里可能有几十上百个结果:有的已经 PASS 并且三方 review 通过,有的还缺 Claude review,有的结果本身是 BLOCKED,有的虽然 PASS 但 review 要求补证据。它们全混在一个目录里时,run 就像一张越堆越满的桌面。

所以现在改成文件级 resolution:

tests/execution-results/api/runs/<run-id>/...
tests/execution-results/api/planned/<run-id>/...
tests/execution-results/api/complete/<run-id>/...

tests/execution-results/browser/runs/<run-id>/...
tests/execution-results/browser/planned/<run-id>/...
tests/execution-results/browser/complete/<run-id>/...

tests/execution-results/regression/runs/<run-id>/...
tests/execution-results/regression/planned/<run-id>/...
tests/execution-results/regression/complete/<run-id>/...

单个 execution result 文件在三方 review 完成后,就可以立刻分流:

  • PASS + 三方 review 通过:result 文件和三份 review 一起进入 complete
  • FAIL / BLOCKED / PARTIAL_PASS:进入 planned,作为后续 plan/task 的证据。
  • PASS 但任一 review 是 CHANGES_REQUESTED:也不能算通过,进入 planned
  • 缺少任一 review:继续留在 runs

这样 run 不再是“全部完成才能动”的大箱子,而只是一次执行批次。真正流转的单元,是每一个测试结果文件。

为什么失败结果 review 通过,也不等于测试通过

这里还有一个细小但很重要的判断。

如果某个结果是 FAILBLOCKEDPARTIAL_PASS,三方 review 都通过了,这只说明一件事:这个失败、阻塞或部分通过的记录是可信的。

它不代表测试通过。

所以这种文件不会进入 complete,而是进入 planned。后续会生成新的 test result fix plan,再经过 plan review、task 修复、task review,最后重新执行测试或回归测试。

Defect:问题不要长期停在 test 里

测试发现的问题会进入 defect 流程:

tests/defects/open
  - 问题已确认或需要处理
  - 尚未进入 plan

tests/defects/planned
  - 已经转成 development plan
  - 等待或正在修复

tests/defects/closed
  - 对应 plan/task 完成
  - regression 通过

defect 不负责实现修复。它更像一张证据卡片:问题是什么、来自哪个测试、影响是什么、建议怎么验证。

真正的修复仍然回到 plan/task。等 task 完成并通过 review,再通过 regression 把 defect 关掉。测试流程就这样绕回来了。

Regression:让修复回到证据里

当 test-fix task 完成以后,不能只说“代码已经改了”。还要重新验证它真的解决了原来的问题。

test result review
  -> test-fix plan
  -> plan review
  -> task development
  -> task review
  -> regression execution
  -> regression result review
  -> defect closed

这就是我说的“会回头的路”。流程不是一直向前冲,而是在修复之后回到测试证据里,确认原来的洞真的被补上了。

每次 resolution 都新建 plan

最近我还加了一条看似啰嗦、实际很必要的规则:test result review resolution 每次都必须新建 plan。

因为同一天、同一个 run,可能会经历很多次 resolution。如果一直写进同一个 2026-06-04-browser-initial-run-test-result-fix-plan.md,上下文会越堆越乱,也很难知道某一轮 resolution 到底处理了什么。

现在命名会带上时间和问题组:

2026-06-05-1430-api-auth-evidence-test-result-fix-plan.md
2026-06-05-1430-browser-initial-run-route-evidence-test-result-fix-plan.md

旧 plan 可以被引用,但默认不再被直接改写。这样每一轮 resolution 都像一张新的照片,记录当时看到的问题,而不是把很多时刻揉成一团。

为什么后来回到 Windows 客户端

中间我也尝试过用命令行脚本批量启动 Claude Code、Cline 和 Cursor。它能跑,但慢慢变得不太适合这个阶段。

因为现在流程依赖的已经不只是“执行一个命令”:它需要权限确认、插件能力、浏览器证据、文件移动、review 读取、计划生成,还需要在不确定时停下来让人确认。Windows 客户端在这些地方更自然。

所以现在标准方式又回到了客户端:打开对应 workflow prompt,复制给目标 Agent,让它在自己的上下文里执行。脚本被归档,只保留为历史参考。

监控面板:让状态从文件里浮出来

这套流程虽然靠文件系统运转,但人不应该每天只靠手翻目录生活。

所以项目里还有一个本地的 License Refactor Workflow Dashboard。它会扫描当前文档状态,把 plan、task、test case 和 test result 分成几类展示出来:

  • 已完成
  • 等待解决
  • 等待评审
  • 待处理评审结论

它的作用不是替代生命周期,也不是替代 Agent。它更像一盏台灯,把文件状态机里散落的状态照出来。

比如某个 plan 缺 Claude、Cline、Cursor review,面板会直接显示。某些 test result 已经进入 complete,某些还等 resolution,也可以通过面板看到。这样人不用一直问“现在到底卡在哪里”,而是可以先看一眼整体,再决定把哪段 prompt 交给哪个 Agent。

现在这条路长什么样

plan development
  -> plan review
  -> plan ready
  -> task development
  -> task review
  -> task complete
  -> plan complete

complete plan/task
  -> test case generation
  -> test case review
  -> test case ready
  -> api / browser execution
  -> result review
  -> file-level resolution

clean PASS
  -> execution-results/.../complete

needs fix / needs decision / non-pass
  -> execution-results/.../planned
  -> new test-fix plan
  -> task fix
  -> regression
  -> defect closed

它看起来比最初复杂了很多,但复杂的部分并不是为了炫技。它只是把真实开发里本来就存在的事情显式写出来:计划、开发、测试、失败、修复、回归、关闭。

结尾

我现在越来越相信,和 Agent 一起开发时,文档不是附属品,而是协作本身。

如果文档没有生命周期,Agent 会迷路,人也会迷路。已经完成的东西会被重新处理;失败的结果会被误认为通过;review 写完和 review 通过会混在一起;测试发现的问题会停在原地,没人知道它什么时候应该进入开发。

把这些都放进目录和标记里以后,事情会慢下来一点,但也会稳下来一点。

每个文件都知道自己在哪里。每个 Agent 都知道自己该看什么。每次失败都能回到 plan/task,再回到 regression。面板负责把这些状态照出来,而人只需要在关键地方做判断。

这条路不短,但它终于是能回头、能检查、也能继续走下去的路。

莉莉姆

Written by

莉莉姆

恋と萌えの小さな場所
Comment

Comments

No comments yet.

Leave a comment
Use an image URL softly tucked into the comment.