要做什么
「AI Agent Task Board」是一个教学向的 MVP 项目——一个极简的任务管理看板,支持创建、查看、修改状态、删除任务。技术栈是 FastAPI + SQLite + 原生 HTML/CSS/JS,零构建工具。
但这个项目真正的目的不是做一个看板,而是演练多 Agent 协作的工作流:PM Agent 出需求与开发、DEV Agent 写代码、QA Agent 验证,每个阶段之间由人类确认门控,文档作为 Agent 间的通信媒介。
整体流程:三角色四阶段
整个项目按以下分工推进:
PM Agent → DEV Agent → QA Agent → 人类验收
(文档产出) (代码实现) (测试验证) (阶段门控)
PM Agent 产出四份文档:PRD(用户故事 + 验收标准)、data_model(字段定义 + 状态流转规则)、api_contract(5 个端点的完整请求/响应 Schema + 错误码)、dev_plan(阶段划分 + 门禁规则)。这四份文档就是后续所有 Agent 的"合同",Agent 只读文档路径,不传全文。
DEV Agent 按文档实现后端 5 个 API 端点(POST/GET /tasks、GET/PUT/DELETE /tasks/{id})和前端页面。
QA Agent 负责真实验证——不是看代码说"应该能跑",而是实际启动服务、发 curl 请求、比对返回结果与契约是否一致。
每个阶段结束后硬暂停,人类确认后才进入下一阶段。这条规则直接写进了 dev_plan.md。
关键环节与踩的坑
1. 第一次 DEV 因任务过大而失败
第一轮 DEV Agent 被要求"读取 4 份文档 + 创建项目结构 + 实现后端 + 实现前端 + 写依赖文件 + 启动验证",单次任务太重,输出 token 耗尽,代码没写完就截断了。
教训:子 Agent 任务必须拆小。 第二轮把范围缩到"只做后端 5 个端点 + 真实验证",单文件 backend/main.py 搞定,23 个验证用例全部通过。
2. Windows 下 curl 中文编码陷阱
验证 POST /tasks 时,含中文的请求体经 git-bash 内联 curl 传输后被损坏,FastAPI 解析失败返回 422。最初误以为是代码问题,排查后发现是 shell 编码问题。
解决:改用 UTF-8 文件传请求体:
|
|
3. Swagger 缺失 Request Body 的根因定位
QA 阶段发现 POST /tasks 在 Swagger UI 中没有 Request Body 输入区,Try-it-out 发出空 body 返回 422。
根因很典型:路由函数签名只声明了裸 Request 对象,没有 Pydantic 模型参数。 FastAPI 只在路由参数里声明了 Pydantic 模型或 Body() 时才会生成 OpenAPI requestBody。
|
|
api_contract.md 明确要求接收 CreateTaskRequest(含 title/description 字段),但代码里既没有定义这个 Pydantic 模型,也没有在签名中声明。行为层没问题(手动解析能拿到正确数据),文档层却完全断链。
修复方向:定义 CreateTaskRequest 模型,将签名为 payload: CreateTaskRequest,Swagger 即可自动生成请求体区域。
4. 子 Agent 自述不可信,必须独立验证
第一轮 DEV Agent 汇报"全部 12 项测试通过",但那是它自己跑的测试。实际接手后发现项目路径不对(D:/multi-agent-project 而非 D:/ai-agent-task-board),且代码结构过度工程化。
规则:子 Agent 的总结只是参考,主 Agent 必须独立验证文件是否存在、服务是否可启动、HTTP 请求是否真实返回正确结果。
最终产出
后端单文件 backend/main.py 实现 5 个端点,23 个验证用例全部通过(含完整 CRUD 流程、非法状态流转拦截、边界条件)。关键验证结果:
- 创建(201) → 列表(200, 倒序) → 单个(200) → 改状态(200) → 删除(204) → 再查(404) ✅
done→todo、done→in_progress、in_progress→todo非法流转均返回 409 ✅- 空白标题/不存在的 id/重复删除等边界全部按契约返回对应错误码 ✅
收获
最有价值的不是那个能跑的后端,而是多角色接力 + 文档即合同 + 阶段门控这套工作法的实际验证。三个核心原则:
- 任务拆小:子 Agent 单次任务不超过一个可独立验证的单元,否则输出预算耗尽前做不完
- 文档即通信:Agent 之间只传文档路径,不传全文;文档就是合同,代码必须严格对齐
- 独立验证:子 Agent 的自述不可信,主 Agent 必须亲自启动服务、发真实请求、比对结果
这套流程在后续类似项目中可以直接复用。