记录一次关于「主管式多仓库开发」的完整设计讨论,供接手者使用。
**状态是设计稿,尚未实现** —— 文档头部已明确标注。
## 为什么写这篇
用户提出:以后由 HomeAgent 作开发主管,人只与主管对接;主管通过一个
commondev 插件管理多平台凭据、项目/分支台账、临时工作目录,并把「拉起
编码 agent → 改 → 自审 → 复审 → 复核 → 提 PR」串起来。
## 已核实的事实(均有可复现命令,见文档 §10 自检清单)
- 本机有 Gitea 1.24.2;TrueAgent 自身 remote 为 gitcode + github
- 插件凭据现状:`config_<plugin>` 明文、`config.db` 权限 644
- **拉起 agent 的三条路**(关键):
- `pi -p` ✓ cwd = 进程 cwd(已实测读出 marker)
- `dsh headless` 逻辑同 CLI,本机凭据失效
- `a2a_query`/`acp_query` ✗ **参数里没有 cwd**,且只对**已在运行**的
agent 生效 —— A2A/ACP 是长驻 agent 模型,与「按任务拉起」不匹配
- 端口 14010/14011 由 pi-web-sessiond 监听,**不是** general pi 的能力
- 内核 `spawn_child` 与本题无关(它是工作式轻量子,参数只有 task/max_turns)
- `core.agent.workdir` 是**全局单值**且只是 cmd_run 的 fallback ——
前序讨论中「给专属 agent 配它」的说法是错的
## 核心设计主张
1. **复核必须两步:正向 + 变异**。用户原话「我定义过单元测试后,插件复核即可」
隐含了「GREEN = 改对了」这个不成立的假设 —— 插件只能跑预先写下的判据,
判据没覆盖的 bug 照样打勾。自动化不会发现假绿,只会让假绿跑得更快更可信。
文档引用了本仓当日实证(协议判据 M5 首轮未报红)作为依据。
2. **主管复审审的是「判据够不够」,不是逐行读 diff** —— 否则主管会变成
更贵的高级码农。
3. **权限模型要让「必须有主管复审」成为机制而非礼貌**:执行侧凭据只能 push
`feat/*`、不能 push main;主管侧才能合 PR。
4. **落地顺序**:第 0 刀先修「能拉起 agent」(当前成功率存疑,与 QQ 会话中
agent 自身遭遇的 403/503 同源),再谈单平台单项目跑通一条真实链路;
测试模板库放最后(它最容易写,也最容易变成摆设)。
文档还列了 5 个需用户拍板的未决问题(独立仓库 vs worktree、主管自己的模型
可用性、判据落地形态、并行任务间依赖、责任边界)。
26 KiB
CommonDev:主管式多仓库开发流水线(设计 · 未实现)
状态:设计稿,尚未实现。 本文只描述目标机制、已核实的事实、未决问题与建议的 落地顺序。接手者请从 §9 开始,并按 §10 的自检清单逐条验证本文的每一项事实陈述。
标记约定(沿用本仓惯例):
- [已核] = 本文写作时已在本机实测/源码核对确认,附证据
- [待定] = 需要决策,本文给出建议但未拍板
- [风险] = 已知会让整套机制失效的点
撰写时间:2026-10-13。事实基线:TrueAgent 工作区
/home/program/TrueAgent, 生产实例/home/newqqagent(homed PID 2966649 guard / 2966664 agent)。
1. 背景:这套机制要解决什么
1.1 用户的原话(原样引用,避免转述走样)
「其实我想的是以后你就是开发主管,我以后只跟你对接,然后你有一个 commondev 插件, 包含在远程 git 仓库全套操作支持添加多个账号搜索账号仓库等一系列能力)然后有项目列表 每个项目有独立的一系列(分支,对应分支分配给的 agent,分支进行的工作与验收与否) 然后具体实现是通过临时目录(插件数据目录下)有 program/hash-name 目录,每个目录下是 独立仓库的独立分支,每次修改包含(更新,bugfix 等)都是拉取仓库,拉出分支,修改, agent 自审,你复审,你调用插件提 pr 合入(注意审核这部分是插件提供一组让你定义单元 测试的工具,你定义过单元测试后,对应 agent 完成修改后你直接让插件进行复核即可) 插件中包含压力测试,接口测试,编译测试等的多个测试模板。」
关于多账号,用户后续澄清:
「我说的多账号是指插件持有多个 git 平台的访问凭据」
关于 agent 如何进目录,用户后续澄清:
「是 homeagent 负责把仓库拉下来,开出分支,然后在目录中拉起 agent 注入提示词, 这好像需要进一步完善优化 a2a/acp 或者直接调 cli」
1.2 角色模型 [已定]
| 角色 | 是谁 | 职责 |
|---|---|---|
| 人(用户) | 老板 | 只与「开发主管」对接,不直接指挥执行 agent |
| 开发主管 | 长期驻留的 HomeAgent 主 agent | 拆任务、定义判据、复审、决定合入 |
| 执行 agent | 按任务拉起的编码 agent(pi / dsh) | 在某棵工作树里干活 |
| commondev 插件 | 新增 Go 插件 | 仓库/凭据/分支/PR/测试执行,全部机械化操作 |
1.3 为什么这件事值得做
现状是「在项目文件夹里开 agent」,导致同项目的多个 agent 无法各占分支并行。 用户要的是:一个项目可同时有多条分支在被不同 agent 推进,而合入点由主管把控。
2. 目标机制(用户描述 + 本文补全)
项目列表(每项目一条)
└─ 分支列表(每分支:名字 / 分配给哪个 agent / 工作内容 / 验收状态 / base_sha)
└─ 临时工作目录(插件数据目录下 program/<hash>-<name>/)
└─ 独立仓库的独立分支(clone 或 worktree)
└─ 拉起 agent(注入提示词,cwd = 该目录)
└─ agent 自审 → 主管复审 → 插件复核 → 提 PR → 合入
插件应提供的能力面(用户列举):
- 远程 git 仓库全套操作(clone / fetch / branch / commit / push / PR / merge)
- 多平台凭据(GitHub / GitCode / Gitea …)[已按用户澄清修正:多凭据,非多 agent 账号]
- 账号/仓库搜索
- 项目列表与分支状态台账
- 判据定义与复核(主管定义单元测试 → 插件在 agent 改完后执行)
- 测试模板:压力 / 接口 / 编译
3. 已核实的事实(接手者可直接依赖)
3.1 仓库与平台
| 事实 | 证据 |
|---|---|
TrueAgent 自身 remote 为 gitcode + origin(github) |
git remote -v |
本机有 Gitea 1.24.2 在 192.168.2.106:3000 |
curl /api/v1/version → {"version":"1.24.2"} |
| 本机无 git 库依赖(go.mod 无 go-git/git2go) | 插件现只能用 os/exec 调 git |
~/.git-credentials 存在 |
ls ~/.git-credentials |
3.2 凭据现状 [风险]
| 事实 | 证据 |
|---|---|
插件配置存于 config_<plugin> 表,key→TEXT,可存 JSON |
config_qq.group_tool_allowlists 即 JSON |
| 凭据明文存储 | config_vikunja.token = tk_2b7ecac1... |
config.db 权限 644(全局可读) |
ls -l /home/newqqagent/config.db |
[风险] commondev 的凭据是能 push 用户仓库的凭据,与现有 token 不同量级。 按现有 644 明文惯例存,等于把仓库写权限暴露给同机任何可读文件的东西 (本容器跑着数十个子进程插件、浏览器、MCP 服务)。详见 §7.1。
3.3 插件开发基建(可复用的现成东西)
| 事实 | 证据/位置 |
|---|---|
已有 plugindev 示例插件,含 plugindev_status/init/build/sdk/projects |
third_party/homeagent-sdk/example/plugindev/ |
| 插件数据目录 API | sdk.Settings().DataDir()(internal/sdk/settings_impl.go:24) |
hmapdev 工具链已装 |
/usr/local/bin/hmapdev |
SDK 无 HTTP/exec 能力面,但插件是编译型 Go,可自行 os/exec |
internal/sdk/plugin.go 方法清单 |
commondev 可从
plugindev长出来,不必从零起。
3.4 「把 agent 拉进目录」——三条路的真实能力 [已核,关键]
| 路径 | 能否指定 cwd | 结论 |
|---|---|---|
pi -p(无头) |
✅ cwd = 进程 cwd | 实测:在 proj-b 下运行,正确读出 marker.txt = BBB |
dsh headless |
✅ 逻辑同 CLI(cwd 继承) | 实测被凭据挡下(非 cwd 问题) |
a2a_query / acp_query |
❌ 参数里没有 cwd | 见下 |
a2a_query / acp_query 的确切形状(已读源码):
a2a_query参数:agent_url/query/session_id/timeout—— 无 cwdacp_query参数:server_url/prompt/session_id/timeout—— 无 cwd- pi-acp 扩展的
session/newpayload:{"request": {"text": text}}—— 无 cwd (/root/.pi/agent/extensions/pi-acp/index.ts:127)
它们只能把文本发给「已在运行的」 agent,而该 agent 的工作目录是启动时固定的。
这是用户所说「需要进一步完善优化」的准确位置。
A2A/ACP 是长期驻留 agent 的模型(peer-to-peer,一个 agent 一个进程一个目录); 而本需求是按任务拉起(一次性、每任务一个目录)。两者模型不匹配。
- 若走 A2A/ACP:必须扩建协议增加
cwd(改动扩展 + 可能改动 ACP 实现)- 若走 CLI:
pi -p天然贴合(进程 cwd 即工作目录),零协议改动本文倾向 CLI 路线 [待定],理由见 §6.1。
3.5 端口占用:A2A/ACP 不是通用能力 [已核]
127.0.0.1:14010(A2A)与 14011(ACP)由 PID 819 pi-web-sessiond 监听,
不是 general pi 的能力。普通 pi -p 启动时只打印:
[pi-a2a] A2A server not listening on 127.0.0.1:14010 (EADDRINUSE)
pi --help 里没有 --serve 之类参数——服务由 ~/.pi/agent/extensions/pi-a2a|pi-acp
两个扩展提供,且扩展内有「子进程不继承监听端口」的守卫。
3.6 拉起 agent 当前不工作 [风险 · 最高优先级]
实测三条拉起尝试全部失败:
| 尝试 | 错误 |
|---|---|
pi -p --provider llmsproxy --model AUTO |
成功(同目录测试通过),但另一轮撞 model "claude-opus-5" is not allowed for this key(403) |
dsh headless |
AUTH: Authentication Fails, Your api key: ****d63d is invalid |
且与 QQ 会话中 agent 自身遭遇的失败同源(/home/newqqagent/memory/context.json
第 23–28 条):
[23] 403: model "claude-opus-5" is not allowed for this key
[24] 503: all 6 auto providers failed
[26][27][28] 503: all 6 auto providers failed(codebuddy_kimi / vela_deepseek …)
[风险]这是整套设计的致命前提。 主管模式、worktree 隔离、PR 流水线、变异复核—— 每一环都要求「能成功拉起一个 agent 并让它在指定目录干活」,而这一步当前成功率 无法保证。在解决它之前,不应继续构建上层机制。
注意:失败集中在
llmsproxy/AUTO与justworker/claude-opus-5。而本机大量其他 agent 调用(子代理、go test、端到端验证)当日是成功的 ⇒ 可用 provider/model 组合 需要被枚举出来,而不是继续用AUTO去赌。
3.7 内核侧 spawn_child 与本题无关 [已核]
spawn_child 是内核自有的工作式轻量子(goroutine),参数只有 task 与 max_turns
(internal/agent/core/spawn.go:49),不是拉起外部编码 agent。
用户已明确:本需求是「homeagent 拉起本机的编码 agent(pi 和 dsh)」,与此无关。
3.8 值得保留的历史结论(前序 git worktree 讨论)
在 QQ 会话(message_id 1685590448)中,agent 给出的 git worktree 方案,本文复核:
| agent 的说法 | 复核结果 |
|---|---|
| worktree 隔离有效、互不污染主仓 | ✅ 实测通过 |
| 「同一分支不能被两棵 worktree 同时挂,git 会直接拒绝」 | ✅ 实测 fatal: 'feat/a' is already used by worktree at '...' |
| worktree 共用对象库、很轻 | ✅ |
「给专属 agent 配 core.agent.workdir」 |
❌ 错。见下 |
core.agent.workdir 的两处错误理解(internal/config/registry.go:863):
- 它是
Type: "string"的全局单值,不是 per-agent 配置 ⇒ 配了影响所有 agent - 它只是
cmd_run的 fallback,agent 显式传workdir时被覆盖(internal/plugins/cmd/plugin.go:149)
教训:worktree 方案本身没错,但「怎么把某个 agent 绑到某棵树」当时没有机制, 只有「在任务描述里写明」这种提示词层面的软约定。这正是 §3.4 的问题。
4. 设计:目标架构
4.1 commondev 插件的工具面(建议)
# 凭据与平台
commondev_account_add 添加一个平台凭据(kind: github|gitea|gitcode)
commondev_account_list 列出已配凭据(**不返回 secret 本身**)
commondev_account_test 验证某凭据可用(调平台 API 而非只看字符串非空)
commondev_repo_search 按关键字搜账号下/平台上的仓库
# 项目台账
commondev_project_add 登记一个项目(本地名 → 远程 URL + 平台 + 默认分支)
commondev_project_list 项目与分支总览(含每分支的 agent / 工作内容 / 验收状态 / base_sha)
commondev_branch_open 开一条分支工作线(分配 agent、写工作内容、记录 base_sha)
commondev_branch_status 单条分支的详细状态(含临时目录路径、最近提交、测试结果)
commondev_branch_close 收尾清理(merge 后或废弃时)
# 工作目录
commondev_workdir_prepare 准备/复用临时工作目录(mirror 派生,见 §4.3)
commondev_workdir_clean 清理临时目录(含凭据残留检查,见 §7.2)
# 判据与复核
commondev_test_define **主管**定义一条判据(落地成可执行脚本 + 期望)
commondev_test_run 执行判据集合(正向)
commondev_test_mutate 执行**变异验证**(反向,见 §4.5)★ 必须有
commondev_review_submit agent 完成后提交复核(正向 + 变异一起跑)
# 提 PR
commondev_pr_open 提 PR(含 conflict 预检,见 §4.4)
commondev_pr_status 查 PR 状态
commondev_pr_merge 合入(**仅主管授权的凭据可调**)
4.2 项目/分支台账(建议 schema)
projects
id, name, remote_url, platform, default_branch, mirror_path, created_at
branches
id, project_id, name, agent_name, work_desc,
base_sha, # ★ 用户原描述中缺失,必须补(理由见下)
head_sha, status, # status: open|review|merged|abandoned
worktree_path, created_at, closed_at
criteria # 主管定义的判据
id, project_id, branch_id, name, kind, # kind: unit|interface|stress|build
script, expect, definition_hash, created_at
review_runs
id, branch_id, criteria_id, phase, # phase: forward|mutate
result, evidence, started_at, finished_at
为什么必须加 base_sha(用户原描述没有):
没有它,插件无法判断「两个 PR 改了同一文件时第二个该不该 rebase、能不能自动合」,
出问题也无法重放。建议在 commondev_pr_open 前做 conflict 预检。
4.3 临时工作目录:用 mirror 派生,不要每个任务全量 clone
用户描述「每次修改都是拉取仓库」。直接 clone 的问题:Go 这类仓库一份全量历史可达 数百 MB,并行十个就不合适。
建议([待定],需接手者评估):
<插件数据目录>/program/
mirrors/<platform>-<repo>.git/ # git clone --mirror,每个项目一份,定期 fetch
work/<hash>-<name>/ # 每个任务一份,由 mirror 派生
派生方式二选一(都要实测磁盘与耗时):
git clone --reference <mirror> <mirror> <workdir>(--dissociate可选)git worktree add(注意 §3.8:同分支不可双挂——这反而是好事,能防两个 agent 抢同一分支)
注意:用户原话是「每个目录下是独立仓库的独立分支」。若严格按「独立仓库」, worktree 就不适用(它是同仓库多工作区)。这是需要与用户确认的选择(§8.1)。
4.4 目录命名
用户描述 program/hash-name。建议:
hash用项目名 + 分支名的短哈希,保证可重算(便于清理孤儿目录)- 目录内记录一份
_commondev.json(项目/分支/agent/base_sha/凭据指纹),便于事后审计 - 不要把凭据写进目录(见 §7.2)
4.5 ★ 复核必须是两步:正向 + 变异(本文最重要的设计主张)
用户原话:
「我定义过单元测试后,对应 agent 完成修改后你直接让插件进行复核即可」
这里的隐含假设是「插件 GREEN = 改对了」。该假设不成立。
插件只能跑主管预先写下的判据。若判据没覆盖那条 bug,插件照样打勾。 自动化不会发现假绿,只会让假绿跑得更快、更可信。
本仓当日的实证:2026-10-13 下午新写的协议一致性判据组,变异测试中
M5 未报红——把 json:"phase" 改成 json:"phaseX",判据仍全绿,
因为它只查了前缀。是变异测试把它咬出来的(该轮修复的最终判据已改为匹配完整 tag)。
因此插件的复核必须包含两个阶段:
| 阶段 | 做什么 | 不通过的后果 |
|---|---|---|
| 正向(forward) | 跑主管定义的判据 → 期望通过 | 实现有 bug,驳回 |
| 反向(mutate)★ | 自动改坏被测代码(按主管给的变异规则或自动生成)→ 期望判据报红 | 判据太松,驳回 |
没有反向阶段,就是在给「测试通过」这个信号不断充值信用,直到它骗一次大的。
变异规则由主管随判据一起定义(commondev_test_define 可迭代幂等),存入 criteria 表。
注意本仓纪律:判据类写「某标识符是否出现在函数体」时必须先剔除注释再匹配(曾因注释含
offsetParent 导致假绿)。
4.6 三层审查的分工(建议明确,避免主管被 diff 淹没)
用户描述三层:agent 自审 → 主管复审 → 插件复核。
建议定义清楚「主管复审」审什么,否则主管会变成更贵的高级码农:
| 层 | 审什么 | 不审什么 |
|---|---|---|
| agent 自审 | 代码正确性、风格、实现细节 | — |
| 主管复审 | 这次的改动,判据够不够:引入了哪些新失败方式?判据覆盖了吗?变异咬得住吗? | 逐行读 diff |
| 插件复核 | 机械执行正向 + 变异 | 语义判断 |
5. 与现有系统的关系
| 现有物 | 关系 |
|---|---|
plugindev 示例插件 |
commondev 的起点(可复用其 hmapdev 调用、workspace 管理) |
plugindev 的 projects 工具 |
可参考其「列工程 + 构建产物」的形态 |
core.agent.workdir |
全局单值 fallback,不要把它当 per-agent 机制用(§3.8) |
spawn_child |
内核工作式轻量子,与本需求无关(§3.7) |
a2a / acp 插件 |
现无 cwd,需扩建或绕过(§3.4) |
| Gitea 1.24.2(本机) | 建议作为第一刀的唯一平台(见 §6.2) |
tracker(changeset/回滚) |
已有的文件系统变更追踪,与 git 分支台账无关,勿混 |
6. 关键决策建议(未拍板,供接手者与用户确认)
6.1 拉起 agent:走 CLI,不走 A2A/ACP [本文建议]
| 方案 | 优点 | 缺点 |
|---|---|---|
pi -p(CLI) |
进程 cwd 即工作目录(已实测);一次性进程,天然按任务隔离;零协议改动 | 每次冷启动(可接受);需要自己管进程与超时 |
dsh headless |
同上 | 本机凭据失效,需先修 |
| 扩建 A2A | 复用现有插件 | 要改扩展 + payload;ACP 的 session 模型本就假设长驻,加 cwd 是违背其设计意图 |
| 扩建 ACP | 同上 | 同上 |
建议:第一刀用 pi -p。它同时满足「指定目录」与「一次性拉起」两个硬需求,
且不需要动任何协议。A2A/ACP 留给「需要与常驻 agent 对话」的场景。
6.2 第一刀只做一个平台、一个项目、一个任务
理由:这套机制有至少四个独立的失败面(凭据 / 拉起 / 判据 / 合入), 一次全上会无法归因。先用 Gitea(本机就有,API 可控)跑通一条真实链路:
登记项目 → mirror → 开分支 → 拉起 pi -p(cwd=工作目录)
→ agent 改 → 主管定义判据 → 插件跑「正向 + 变异」
→ 提 PR → 主管合入
这一刀的目的不是功能完整,是证明「假绿检测」这一环真的能工作。
6.3 权限模型:让「必须有主管复审」成为机制而非礼貌 [建议]
若执行 agent 所用的凭据能 push 主干,则「主管复审」只是流程约定——想绕过随时能绕过。
建议(依赖 Gitea 分支保护):
- 执行侧凭据:只能 push
feat/*,不能 pushmain,不能合 PR - 主管侧凭据:能合 PR
- 这样「用户只与主管对接」在用户不在场时也成立
6.4 落地顺序
| 刀次 | 内容 | 证明什么 |
|---|---|---|
| 0 | 修「能拉起 agent」(§3.6) | 前提是否成立 |
| 1 | 单平台单项目:mirror → 分支 → 拉起 → 判据+变异 → PR | 机制成立,假绿可检测 |
| 2 | 接 Gitea 分支保护 + 执行/主管双凭据 | 复审是机制不是礼貌 |
| 3 | 多项目 + 并行 + conflict 预检 | 可扩展 |
| 4 | 测试模板库(压力/接口/编译) | ⚠️ 放最后 |
第 4 刀为什么放最后:它最容易写,也最容易变成摆设。先让「变异能咬住」 这一环成立,模板才有意义。
7. 安全设计(必读)
7.1 凭据存放 [风险]
现状(§3.2):config_<plugin> 明文、config.db 644。
commondev 的凭据是能 push 用户所有仓库的凭据,性质完全不同。
建议:
- 不放
config.db。放独立文件(如<插件数据目录>/credentials.json),权限0600, 启动时校验权限,不对就拒绝启动(本仓纪律:响亮失败,不静默降级) - 优先 SSH key 而非 PAT:key 可按平台单独生成/吊销,不随账号密码轮换失效
- 每平台用独立、最小授权的凭据(GitHub fine-grained PAT 支持单仓授权), 不要一个 token 通吃
- 接
git push时走 credential helper / 环境变量注入,不要写进 git config 文件
7.2 临时目录的凭据残留 [风险]
任务跑完删目录后,clone 里可能仍留着 token(remote URL 带 token 是常见做法,
git remote -v 就能读出来)。
规矩:clone 出来的 remote URL 不带凭据;push 时临时注入
(Gitea/GitHub 均支持 http.extraheader 或 GIT_ASKPASS 一次性注入)。
这样临时目录删掉就是真删掉。
建议 commondev_workdir_clean 内置一道残留检查(扫 remote URL / config / 已知凭据指纹)。
7.3 插件自身不是沙箱
本仓已知:插件是编译型 Go 子进程,能做 os/exec、读写文件。commondev 持有高价值凭据,
它自己的权限边界需要单独评估(用户在主机的进程隔离、文件权限是否足够)。
本文不展开,但接手者应至少确认:commondev 的数据目录权限、以及宿主对插件进程的隔离手段。
8. 未决问题(需用户拍板)
8.1 「独立仓库」还是「worktree」?
用户原话是「每个目录下是独立仓库的独立分支」。
- 独立 clone:隔离彻底、删除干净、无「同分支双挂」冲突 —— 更贴合用户描述
- worktree:省磁盘与网络,但不能叫「独立仓库」
本文建议:mirror + 派生(§4.3),本质仍满足「独立仓库」语义(每目录一份 checkout), 但需要用户确认这符合预期。
8.2 主管(主 agent)自己的模型可用性
主管也要调 LLM(拆任务、定义判据、复审)。若主管所用模型正是 §3.6 里失效的那些, 整套机制同样停摆。需要为「主管」单独确认一个稳定可用的 provider/model。
8.3 判据由谁写、写在哪
用户说「你(主管)定义单元测试」。但判据的落地形态未定:
- 写进被测仓库(成为仓库的一部分,随 PR 一起走)?
- 还是留在 commondev 台账里(
criteria表)?
两种各有取舍:前者可被仓库自身复用,后者与实现解耦但要维护两处。 建议:留在台账,但把生成的脚本落盘到工作目录内执行,并在 PR 描述里附判据摘要。
8.4 冲突与依赖
若并行任务之间有依赖(A 改接口、B 用接口),worktree/独立 clone 会放大问题: 两棵树互不可见,A 的改动 B 编译不过。
用户需要明确:并行的是「互不相干的模块」还是「一个功能的几个部分」?
- 前者 → 本设计正合适
- 后者 → 会集中在 merge 时爆发,建议先拆分边界(谁拥有哪些文件)再谈并行
8.5 责任边界
用户说「以后只跟主管对接」。那么当判据打勾、PR 合了、线上仍出问题时,责任如何划分? 这决定判据里必须包含什么:若主管负责,则光有单元测试不够, 需要纳入可观测性/回归判据(真跑一遍看真事件流,而非只看测试绿)。
9. 接手者请从这里开始
第一步(必做):验证前提是否成立
写一个最小探针,回答一个问题:「能否稳定拉起一个 agent 并让它读到指定目录?」
要求:
- 在临时目录放 marker 文件,拉起
pi -p,要求输出 marker 内容 - 跑 20 次,统计成功率(不要只跑一次成功就下结论)
- 记录每次使用的 provider/model,据此枚举可用组合
- 若成功率低,先解决 §3.6,不要继续上层设计
第二步:只做 §6.2 的第一刀
用 Gitea。链路:mirror → 分支 → 拉起 → 判据 + 变异 → PR。 重点验证「变异能咬住判据」——故意写一个太松的判据,确认变异阶段能把它驳回。
第三步:把本篇文档的每一条事实重新核对
本文的 [已核] 项都有命令可复现,见 §10。若发现与本文不符,先更新本文再动手。
10. 自检清单(逐条可复现)
接手者应能执行以下命令并得到与本文一致的结论:
# §3.1 平台
git -C /home/program/TrueAgent remote -v
curl -s http://192.168.2.106:3000/api/v1/version # 期望 {"version":"1.24.2"}
# §3.2 凭据现状(注意:不要打印完整 token)
ls -l /home/newqqagent/config.db # 期望 644
sqlite3 /home/newqqagent/config.db "select key from config_vikunja;" # 含 token
# §3.4 拉起 agent 的 cwd 行为
mkdir -p /tmp/probe-a && echo AAA > /tmp/probe-a/marker.txt
cd /tmp/probe-a && pi -p --provider <可用provider> --model <可用model> \
"执行 pwd 和 cat marker.txt,只输出这两行原始内容"
# 期望输出 /tmp/probe-a 与 AAA
# §3.4 a2a/acp 无 cwd
grep -n "agent_url\|query\|session_id" \
/home/program/TrueAgent/third_party/homeagent-sdk/example/a2a/plugin.go
grep -n "cwd" /root/.pi/agent/extensions/pi-acp/index.ts # 期望无结果
# §3.5 端口归属
ss -tlnp | grep -E "14010|14011" # 期望 pid=819 pi-web-sessiond
# §3.8 core.agent.workdir 是全局单值
grep -n "core.agent.workdir" /home/program/TrueAgent/internal/config/registry.go
# 期望 Type: "string"
# §3.7 spawn_child 参数
grep -n "max_turns\|task" /home/program/TrueAgent/internal/agent/core/spawn.go | head
# §4.5 变异能咬住判据的现成范例
cd /home/program/TrueAgent
go test -count=1 -run TestStageFrameFieldsMatchServer ./internal/plugins/webui/
grep -n "phase,omitempty" cmd/waiter/state.go # 判据匹配的是完整 tag
11. 给接手者的三条提醒
-
不要把「测试通过」当作「改对了」。本文 §4.5 的变异验证不是可选项, 它是这套机制唯一能防住假绿的手段。本仓当天因此浪费过一整轮排查。
-
不要用提示词层面的软约定替代机制。前序 worktree 讨论里 「在任务描述里写明工作目录」就是这一类——它靠模型自觉,没有任何保证。§3.8 已记录该教训。
-
前提不成立时,不要继续设计上层。§3.6 的「拉起 agent 不工作」如果没解决, 后续所有设计都是纸面的。先让它能跑,再让它跑得好。