06. AI Agent 与 Harness:Repo Instructions、Skills 与团队工作流
mingzaily / Codex / 2026-03-29
上一篇《05. AI Agent 与 Harness:Agent Harness、Graph 与退款 Agent》讲的是:如果自己开发一个退款 agent,agent harness 该怎么落。
但对大多数团队来说,眼前更现实的任务并不是马上造一套业务 agent 系统,而是先把 Codex、Claude Code 这类现成 agent 用稳。
这时候真正需要补的,往往不是另一种 harness,而是仓库里的这些东西:
- repo instructions
- skills
- MCP 使用约定
- 验证命令
- 交付格式
- review / CI workflow
放到一个典型的后端团队里,这件事会变得很具体:
- Web 框架用
gin - 数据层用
gorm - 缓存用
redis - 已经有链路追踪
- 也能通过 MCP 查日志、查 traces、查数据库
问题也会跟着收敛成一句话:
在这种团队里,怎么把默认工作方式写成 agent 也能稳定遵守的仓库规则?
结论
- 对使用现成 coding agent 的团队来说,重点通常是
repo instructions + skills + 验证流程 - 它不是一份孤立的
AGENTS.md - 它是“规范 + skill + MCP 使用协议 + 固定验证命令 + 交付格式 + CI gate”的组合
- 它的目标不是替代工程师,而是让 agent 更快进入团队的真实工作方式
- 如果
agent harness解决的是“系统怎么运行”,那这套仓库约定解决的是“在这个仓库里,事情应该怎么做”
repo instructions + skills + 验证流程 = 把团队默认工作方式显式化,让 agent 可以稳定照着做。
团队上下文要写清楚
很多团队装了 MCP、写了几句提示词,就以为自己已经在做 harness。
但如果 agent 连“这个仓库到底怎么工作”都不知道,它其实还是进不了团队的真实语境。
所以第一步不是堆工具,而是把上下文写明白。
像一个 gin + gorm + redis 的 Go 团队,至少要把这些共识显式化:
- 项目目录结构
- HTTP 层怎么组织
- service / repository 怎么分层
gorm查询和事务怎么写rediskey 命名、TTL 和失效策略怎么定- trace 和日志字段怎么打
- 什么命令算基本验证
- 什么结果才算 done
这些东西如果只存在于资深同事脑子里,agent 是用不稳的。
这套仓库约定的五层结构
放到这种团队里,一版最小可用的仓库规则,通常至少要补下面五层。
1. AGENTS.md 作为总入口
AGENTS.md 最重要的作用,不是堆很多原则,而是给 agent 一个稳定入口。
它至少应该回答:
- 这个仓库是干什么的
- 主要目录在哪里
- 常见任务怎么切入
- 哪些规范绝对不能碰
- 改完之后最低限度要验证什么
比如一个 Go 后端团队的 AGENTS.md,至少应该能长成这样:
## Stack
- HTTP: gin
- DB access: gorm
- Cache: redis
- Observability: tracing + structured logs
## Architecture
- handler 保持薄,业务逻辑放 service
- repository 负责数据库访问
- 外部调用必须带 context
## Conventions
- gin handler 只做参数解析、响应返回、调用 service
- gorm 事务必须放在 service 层统一管理
- redis key 使用 app:domain:biz:id 格式
- 写缓存时必须说明 TTL 和失效策略
- 新增外部调用必须补 span 和关键日志字段
## Required Verification
- go test ./...
- golangci-lint run
- 变更缓存逻辑时,说明 key / TTL / invalidation
- 变更 DB schema 时,说明 migration 和兼容性风险
这类信息越清楚,agent 越不容易乱猜。
2. 用 skill 把高频任务拆开
AGENTS.md 只能做总入口。
高频任务如果都堆在里面,很快就会变成一大坨。
所以第二层通常应该是 skill。
对这个团队来说,优先级最高的通常是这几类 skill:
新增 gin endpoint修改 gorm model / query / transaction处理 redis cache 变更排查 trace / log 问题定位线上接口超时
为什么要拆?
因为这些任务往往都有稳定套路。
比如“新增 gin endpoint”这个 skill,就可以直接写清楚:
- 先找已有同类 handler
- 参数校验放哪里
- service 接口怎么定义
- repository 怎么落
- trace / log 哪些字段必须补
- 最后要跑哪些命令
这样 agent 做的就不是“自由发挥”,而是按团队的稳定手法做事。
3. MCP 不只是装上去,还要有使用协议
很多团队现在已经会装:
dbhub MCPGitHub MCPfetch MCP- 日志 MCP
- tracing MCP
但真正决定效果的,往往不是“有没有装”,而是:
agent 知不知道什么时候该用、先用哪个、查完之后怎么落回代码修改。
这种团队里,MCP 的使用协议最好直接写清楚:
日志 MCP
适合用来:
- 查报错日志
- 查某个请求 ID 的关键字段
- 验证新增日志是否符合团队格式
tracing MCP
适合用来:
- 查接口耗时链路
- 看某个 span 是卡在 DB、缓存还是外部调用
- 先确认问题在哪一层,再决定改 handler、service 还是 repository
dbhub MCP
适合用来:
- 查表结构
- 查字段含义
- 看某条数据状态
- 验证数据库副作用是否真的发生
GitHub / fetch MCP
适合用来:
- 查相关 issue / PR
- 拉外部 API 文档
- 对照历史实现方式
也就是说:
MCP server 提供的是工具入口,repo instructions 和 skills 定义的是工具使用方法。
对这个团队来说,done definition 要写得很具体
如果 repo instructions 里只有“请注意规范”“请先思考再动手”,通常是不够的。
它要能明确回答:
什么才算完成。
比如这个团队里,至少可以把 done 写成下面这种硬标准:
改 gin 接口
- handler / service / repository 分层符合约定
- 错误码和响应结构符合现有风格
- 新接口有 trace 和关键日志字段
- 跑过相关
go test
改 gorm 查询或事务
- 查询路径清楚
- 没有把事务散落到 handler
- 解释清楚索引 / N+1 / 锁风险
- 如果涉及 migration,要说明兼容性
改 redis 逻辑
- key 命名符合规则
- TTL 明确
- invalidation 策略明确
- 说明 cache miss / hit / consistency 风险
改 tracing / logging
- 说明新增了哪些 span / log 字段
- 说明这些字段能帮助排查什么问题
- 必要时给出 trace 或 log 的查询方式
你会发现,这套 repo instructions / 验证流程 一旦把 done 写具体,agent 的行为质量会直接稳定很多。
这种团队里,落地顺序通常是什么
如果从零开始搭,顺序通常是这样的:
第一层:先补总入口
AGENTS.md- 项目结构
- 常用命令
- done definition
第二层:再补高频 skill
- 新增接口
- 改事务
- 改缓存
- 查 trace / log
第三层:把 MCP 用法写成协议
- 什么问题先看 trace
- 什么问题再看日志
- 什么问题需要看数据库状态
- 改完之后要不要回查 trace / log / DB
第四层:固定验证命令
比如:
go test ./...golangci-lint runmake test-unitmake test-integration
如果是某些高风险模块,还可以要求:
- 必跑
./scripts/replay_refund_cases.sh - 必须输出结构化验证报告
第五层:把结果报告结构化
最终交付最好至少交代:
- 改了哪些文件
- 跑了哪些命令
- 有没有数据库影响
- 有没有缓存影响
- 有没有 trace / log 影响
- 还剩什么风险
这一步很重要,因为它会把“我改好了”这种模糊说法,变成真正能 review 的交付物。
一个真实任务会怎么走
假设现在有一个任务:
新增退款申请接口,并要求补 trace、日志和缓存失效逻辑。
在仓库规则比较完整的团队里,路径通常会是:
- agent 先读
AGENTS.md - 再加载“新增 gin endpoint”和“处理 redis cache”两个 skill
- 如果是线上问题回溯,再通过 tracing MCP 和日志 MCP 先定位现状
- 按团队分层约定改 handler / service / repository
- 补 trace、补结构化日志、补缓存失效
- 跑固定命令
- 按固定格式交付结果
这时就能看出来,这套仓库约定做的并不是“让模型更聪明”,而是:
让它更像一个刚加入团队、但已经拿到完整 onboarding 和 SOP 的工程师。
这套仓库约定不该做什么
这件事同样重要。
repo instructions 和 skills 很容易越写越重,最后变成:
- 什么都往
AGENTS.md里塞 - 什么都靠提示词约束
- 装一堆 MCP 但没有使用协议
- 把业务规则和系统实现逻辑也混进去
更清楚的分法是:
repo instructions / skills / 验证流程- 规定这个仓库里怎么工作
agent harness- 规定系统怎么运行
所以像下面这些东西:
- 自动退款的业务规则
- 风控分支
- Post-condition Validator
- 人工审批路由
这些更应该落进 agent harness,而不是只写在仓库提示词里。
几句话总结
- 对使用现成 coding agent 的团队来说,关键不是再发明一个新名词,而是把 repo instructions、skills、MCP 使用约定、验证命令和交付格式写清楚。
- 对
gin + gorm + redis团队来说,最重要的是把默认做事方式显式写出来。 - MCP server 提供的是工具入口,repo instructions 和 skills 定义的是使用方法。
- 这套仓库约定最怕空泛,done definition 越具体,agent 越容易稳定。
- 它解决的不是“系统怎么运行”,而是“在这个仓库里,事情应该怎么做”。