本文参考《用 AI 复活停更开源项目是一个务实的选择》中的 Knife4j Next 维护经验,抽象成一套与具体模型、IDE 和开源项目无关的仓库维护方法。
Coding Agent 最容易展示的是“根据一句话生成很多代码”,但真实维护的难点通常不在代码量,而在它是否理解同一个问题、有没有越界、怎样证明改动有效,以及下次换会话后状态是否还在。
与其问 Agent 能不能接管仓库,不如先建立一条更小的闭环:一个边界明确的问题,由一个 Agent 完成最小改动,并留下可复查证据。
先选适合的仓库和任务
适合交给 Agent 推进的任务通常具有:
- 真实用户或维护者提出的明确问题;
- 能稳定复现的失败;
- 清晰的模块边界;
- 可以运行的测试、构建或静态检查;
- 改错后能够快速回滚;
- 完成条件可以写成列表。
例如:
- 修复一个有复现步骤的 bug;
- 补上缺失的边界测试;
- 更新与代码不一致的文档;
- 将手工发布检查脚本化;
- 迁移一个有官方升级指南的依赖;
- 清理一段确定没有调用方的代码。
不适合直接自治推进的任务包括:产品要不要转型、架构要不要重写、体验怎样才“更现代”、权限核心链路的大改,以及没有测试和回滚手段的数据迁移。
Agent 可以帮助调研开放问题,但在约束收敛前不应直接改仓库。
把维护者脑中的规则写进仓库
每次对话都重新解释规则,既浪费上下文,也容易漏项。至少应有下面这些持久文件:
| 文件 | 内容 |
|---|---|
README.md | 项目用途、快速开始、主要入口 |
CONTRIBUTING.md | 分支、提交、测试和 PR 约定 |
AGENTS.md 或同类说明 | Agent 的范围、禁止项和验证命令 |
docs/architecture.md | 模块职责、依赖方向、重要不变量 |
docs/releasing.md | 版本、构件、发布和回滚步骤 |
scripts/test-*.sh | 可重复执行的验证入口 |
规则应尽量可操作。例如“保持高质量”无法验证;下面这些可以:
- 不修改
legacy-v2/,除非 Issue 明确要求; - bug 修复必须先添加失败测试;
- 数据库 schema 修改需要兼容上一版本应用;
- 前端变更运行
npm test和视觉回归; - 未经人工批准不得推送 tag、发布包或修改生产配置。
这些规则同样帮助新加入的人类维护者,并不是只为 AI 准备。
Issue 是任务契约,不是一句标题
一个可交付 Issue 至少包含:
背景:为什么要做
当前行为:现在发生什么
期望行为:改完应发生什么
复现步骤:命令、输入和证据
范围:允许修改的模块
非目标:这次明确不处理什么
完成条件:测试、文档、兼容性
风险:权限、数据、性能、发布
“优化登录体验”不是可执行任务。“连续三次 OAuth 回调后 session 丢失;补回归测试,不修改 token 格式”才是。
如果无法稳定复现,任务状态应是 blocked 或 investigation,而不是让 Agent 先写一个看起来合理的空值判断。
状态放在 Issue 和 PR,不放在聊天里
聊天上下文会结束,仓库状态不会。可以使用一个简单状态机:
triage
→ ready
→ in-progress
→ review
→ done
任何阶段 → blocked
ready:目标、范围和验收条件齐全;in-progress:已有负责人和工作分支;review:本地验证完成,PR 和 CI 等待审查;blocked:缺少复现、权限、环境或产品决策;done:合并、发布和文档状态都满足定义。
Agent 每次结束前把结论写回 Issue 或 PR:做了什么、验证结果、剩余风险和下一步。不要让“为什么这样改”只存在于某段不可检索的会话中。
默认一个 Agent 端到端
为每个阶段配置“产品 Agent、架构 Agent、开发 Agent、测试 Agent”看起来完整,但会引入上下文压缩和责任转移。多数中小任务更适合一个 Agent 从复现走到 PR:
- 读取 Issue 和仓库规则;
- 在未修改基线上复现;
- 找到最小原因;
- 添加失败测试或其他证据;
- 实现最小修复;
- 运行受影响范围和全局必要检查;
- 检查 diff 是否越界;
- 创建 PR,记录验证与风险;
- 等待 CI 和人工审查;
- 把最终结果写回 Issue。
只有当探索会撑爆主上下文、工作可以真正独立,或高风险改动需要独立第二意见时,才拆分并行 Agent。多 Agent 是容量和独立审查工具,不是必须凑齐的组织架构。
Bug 必须先复现
没有复现证据时,Agent 很容易生成“防御性修复”:增加 try-catch、空值回退或重试,表面不报错,却把真实原因藏起来。
推荐证据顺序:
未修改基线:失败
最小测试或复现脚本:稳定失败
实施修复:同一证据通过
相关回归:全部通过
如果生产条件无法本地复现,也应留下日志、trace、输入样本、版本组合和已经排除的假设。信息不足时停止,比提交一个没有约束的补丁更负责。
给不同改动定义验证矩阵
| 改动类型 | 最低验证 |
|---|---|
| Java 业务逻辑 | 单元测试、模块测试、编译 |
| API 契约 | schema/contract test、兼容检查 |
| 数据库迁移 | 前后版本兼容、回滚或前滚演练 |
| 前端交互 | 单测、构建、关键流程浏览器验证 |
| CI/CD | 配置校验、最小真实运行、权限检查 |
| 文档 | 链接、命令、示例可执行性 |
| 依赖升级 | 变更日志、漏洞、全量测试、产物对比 |
“CI 绿了”只有在 CI 覆盖完成条件时才有意义。验证命令应放进仓库脚本,避免每个 Agent 自己猜一套。
为高风险动作保留人工门槛
Agent 可以自主完成低风险、可回滚、可验证的仓库内修改。下面这些动作通常需要明确审批:
- 删除或不可逆迁移数据;
- 修改认证、授权和密钥管理;
- 增加付费资源或扩大基础设施;
- 推送正式 tag、发布包和生产部署;
- 修改公共 API 或兼容承诺;
- 关闭安全问题或用户数据事件;
- 大范围重构和依赖替换。
审批点要写在流程中,而不是等 Agent 做到一半再临时阻止。
发布完成条件也要可验证
合并 PR 不一定等于发布完成。按项目类型检查:
- tag 是否存在且指向预期 commit;
- CI workflow 是否成功;
- 包、镜像或二进制能否从公开仓库获取;
- checksum、签名和 SBOM 是否生成;
- release notes 是否对应实际改动;
- 文档站版本是否更新;
- 升级和回滚说明是否可用;
- Issue 与里程碑是否关闭。
把这些条件做成 verify-release 脚本后,Agent 才能客观回答“发完了吗”。
评估 Agent 的指标
不要只统计生成代码行数。更有意义的是:
- 首次提交就通过验证的比例;
- 因范围扩大被退回的比例;
- bug 是否有回归测试;
- PR 从 ready 到 merge 的时间;
- 人工审查发现的高风险问题;
- 合并后回滚和线上回归次数;
- 因信息不足正确停止的次数。
“正确地 blocked”也是好结果。它说明系统没有用猜测伪装进展。
最小仓库检查清单
- 项目目标、非目标和模块边界写在仓库;
- Issue 包含复现、范围和完成条件;
- 状态以 Issue/PR 为准,而不是聊天记录;
- bug 在修复前有失败证据;
- 每类改动有固定验证入口;
- 默认一个 Agent 端到端,必要时才拆分;
- 高风险动作需要人工审批;
- 发布完成条件可以脚本检查;
- Agent 的结论、风险和阻塞项写回长期记录。