---
date: 2026-05-10
tags: [agent-pool, testing, isolation, git-worktree]
severity: low
---

# agent-pool run-tests.sh 跟真池共用 `pool/slot-N` 分支命名空间，真池存在时测试无法启动

## 现象

在真 agent-pool 已初始化的开发机上（即 `<repo-parent>/<repo>-wt/.agent-pool/slot-1..N` 真实存在并各自 checked-out 在 `pool/slot-N` park 分支），跑 `bash scripts/dev/agent-pool/tests/run-tests.sh` 在 `[T1] pool-init --minimal --size 2` 阶段直接挂掉：

```
fatal: 'pool/slot-2' is already used by worktree at '/home/chentao/Code/ffworkspace-wt/.agent-pool/slot-2'
✗ pool-init 失败
```

`git worktree add` 不允许同一个分支被两个 worktree 同时持有 → 测试用的临时池跟真池争同一个 `pool/slot-2` ref → fatal。

## 根因

run-tests.sh 用 mktemp 隔离了**池根目录**（`FFOA_AGENT_POOL_ROOT`），但 **park 分支命名**仍然写死在 `pool-init.sh` 内部（`pool/slot-N`），跟真池完全相同。

只要真池任何一个 slot 处于 park 分支（即 free / 刚 release），测试 pool-init 就会撞同名 worktree。这在真池**第一次跑**就发生（slot-1 通常立刻就在 `pool/slot-1`）。

历史上能跑过是因为开发机没建过真池；今天首次出现是因为真池已建并 release 全部 slot 后跑测试。

## 给未来 AI 的判断口诀

跑 `agent-pool/tests/run-tests.sh` 前先看 `git worktree list | grep ffworkspace-wt/.agent-pool` —— 有真池就别跑全套测试。要么先 `pool-destroy.sh`（破坏性），要么走单元式手工测试逐个函数验证。

## 修复方向（未实施，独立 follow-up）

让 park 分支前缀可参数化：

```bash
# pool-init.sh / agent-release.sh / run-tests.sh 共用：
PARK_PREFIX="${FFOA_PARK_BRANCH_PREFIX:-pool/slot-}"
PARK_BRANCH="${PARK_PREFIX}${slot}"
```

run-tests.sh 头部 `export FFOA_PARK_BRANCH_PREFIX="test-pool/slot-"` 即可跟真池完全隔离；run-tests.sh 内部对 park 分支名的硬编码校验同步替换。

改动面：3 个脚本 + 测试断言。属于测试基础设施改进，跟 sweep orphan 修复正交，独立 issue 跟踪。

## 影响

- 当前 sweep orphan PR 无法跑全套 11 case 测试 → 改用单元式手工验证 `ap_lock_is_orphan` 的 6 个判定分支
- 不阻断 sweep orphan 修复，但测试覆盖完整性下降一档
