# ERR-20260501-002 — worktree `.env` 的 `CONTAINER_PREFIX` 抄成 `ffoa-wt-dingtalk` 导致 dev.sh up 撞名失败

## 现象
在 `approval-form-polish` worktree 跑 `bash scripts/dev/dev.sh up`：

```
Container ffoa-wt-dingtalk-postgres Creating
Container ffoa-wt-dingtalk-redis Error response from daemon: Conflict.
The container name "/ffoa-wt-dingtalk-redis" is already in use by container "..."
```

worktree 期望端口（.env）：postgres=4002 / redis=4003 / backend=4001。
**实际跑着的容器**：
- `ffoa-wt-dingtalk-postgres`（host port 3102，dingtalk worktree 的）
- `ffws-wt-redis-4003`（host port 4003，自己的）
- 没有 postgres 在 4002

## 根因
`.env` 和 `backend/.env` 都写着 `CONTAINER_PREFIX=ffoa-wt-dingtalk`——这是 dingtalk worktree 的 prefix。本 worktree（slot 40）应当用自己的 prefix（如 `ffoa-wt-approval-form-polish` 或 `ffws-wt-40`），结果 dev.sh 试图按 dingtalk 的命名重建容器，撞上已经存在的 dingtalk 容器。

setup-worktree.sh 在 slot 分配时注入了正确的端口（4001/4002/4003），但 `CONTAINER_PREFIX` 那一行可能没改，或者被人手工拷过 dingtalk 的 .env 覆盖。结果端口和容器名不一致。

## 影响
- backend 起不来（连不上 postgres 4002）
- frontend 起不来（依赖 backend）
- 任何 L2 / MCP / 业务流验证都被卡死
- 只能改 .env 或新开 worktree

## 修复（一次性）
1. 选一个不冲突的 prefix，例如 `ffoa-wt-approval-form-polish` 或 `ffws-wt-40`
2. 改 `.env` 和 `backend/.env`：`CONTAINER_PREFIX=<新值>`
3. 重新 `bash scripts/dev/dev.sh up`，会按新 prefix 拉一组干净容器
4. `cd backend && npm run prisma:generate && npm run db:push && npm run db:seed`
5. `npm run start:dev`

## 该如何避免
- setup-worktree.sh 应当在 slot 分配阶段同步覆写 `CONTAINER_PREFIX`，不能只改端口
- 或者 .env 模板里就不要有 prefix 默认值，由 setup 时强制注入
- 检查现有 setup-worktree.sh 是否有这个 bug；如果有，修一下，别再坑下一个 worktree

## 适用范围
所有共享单台 Docker daemon 的 worktree 多开场景。任何 worktree 启动卡在"容器命名冲突"的，先看 `CONTAINER_PREFIX` 是否独立。

## 后记（2026-05-01 同日发现的二号坑）

修完 CONTAINER_PREFIX 后，dev.sh 还是失败因为端口已被 `ffws-wt-pg-4002` / `ffws-wt-redis-4003` 占用——这两个容器是 setup-worktree.sh 起的（命名格式 `ffws-wt-<role>-<port>`），**和 dev.sh + docker-compose 的 `${CONTAINER_PREFIX}-postgres` 命名约定完全不同**。

**worktree 里同时存在两套互斥的 docker 启动方式**：
1. setup-worktree.sh 起的 `ffws-wt-pg-<port>` 系列（slot-based）
2. dev.sh / docker-compose 起的 `${CONTAINER_PREFIX}-postgres` 系列（prefix-based）

如果 setup-worktree.sh 已经起过 1，就**不要再跑 dev.sh up**——直接 `npm run start:dev`，应用层会按 `.env` 的端口连到现有容器。

附加坑：Next.js 16 dev cold compile 在 worktree 里会跑 20+ 分钟仍未 ready（CPU 99%），HTTP 端口监听但不响应。可能跟 `.next/build` 缓存目录被多进程争抢有关；本次未深究，环境工作打到此处终止留给下个 session 处理。
