---
date: 2026-05-18
type: error
tags: [prisma, seed, organization, agent-pool, slot-reuse, ffai-onboarding]
---

# `prisma migrate reset` 后所有 API 返 400「organizationId required」—— db:seed 不种 organizations

## 现象

slot DB 做完 [ERR-20260518-002](ERR-20260518-002-prisma-migrate-dev-drift-pollution.md)
的 reset + migrate dev + db:seed + init:itadmin 流程后，前端能登录，但是所有需要
组织上下文的 API 全部 400：

```
POST /api/v1/agent/sessions → 400 "organizationId required"
POST /api/v1/agent/messages → 400 "sessionId and prompt are required"
（连环：sessions 失败 → 前端没拿到 sessionId → messages 也跟着 400）
```

前端送 Send 按钮也"没反应"——其实请求发出去了，全被 400 拒。

## 根因

**`corp_hr.organizations` 表是空的**：

```sql
SELECT count(*) FROM corp_hr.organizations;
-- 0
```

`db:seed` 只种字典 / 角色 / 权限 / 岗位（platform_master + platform_iam），**不种 organizations**。
`init:itadmin` 只建 itadmin 用户 + 分配全局 Administrator 角色（`organizationId=null`）。**整个标准启动清单里没有任何步骤会建 organization**。

前端 OrganizationContext 启动时：
1. 调 `GET /api/v1/organizations` 拿用户可访问的 org 列表
2. 返回 `{items: []}` 空
3. 没法 select org → apiClient 拦截器找不到 currentOrg → **`X-Organization-Id` header 永远不发**
4. 后端 `resolveActor()` 走 fallback 链：explicit param → header → JWT.currentOrganizationId → JWT.organizationRoles 第一个 key，全部为 null → 400

## 解法

reset DB / 新 slot 启动后必须 **额外建一个 organization** 才能用，加到 ERR-20260518-001
的"slot 复用清场标准动作"末尾：

```bash
docker exec -e PGPASSWORD=dev_password ffws-wt-pg-${POSTGRES_PORT} \
  psql -h localhost -U ffoa_dev -d ${DB_NAME} \
  -c "INSERT INTO corp_hr.organizations
        (id, code, name, display_name, settings, financial_config, compliance_config,
         status, is_active, \"order\", metadata, created_at, updated_at)
      VALUES
        (gen_random_uuid(), 'FF', 'Faraday Future', 'Faraday Future',
         '{}'::jsonb, '{}'::jsonb, '{}'::jsonb,
         'ACTIVE', true, 1, '{}'::jsonb, now(), now());"
```

之后前端硬刷新 → OrganizationContext 自动选到这条 → 一切正常。

## 工程化保险

**应该往 `db:seed` 加一条 organization seed**（最少一条 dev org，类似 prod 用别的方式建）。
原因：

1. CLAUDE.md「本地启动约定」里列出的 6 步流程隐式假设 organizations 已建
2. 任何团队成员 / AI / CI 跑 `npm run db:seed` 都期望"种完了能直接登录用"
3. 当前需要靠 SQL INSERT 走人工后门，跨 worktree / 跨 slot 都会再次踩

提议加到 `backend/prisma/seed.ts` 的 platform_iam 段（在 itadmin 之前），或独立
`scripts/backend/init/init-default-organization.ts`，跟 `init:itadmin` 同步幂等。

## 教训

1. **「reset → migrate → seed → init:itadmin」流程不等于「可用」**：还差最后一步建 org
2. **诊断方向**：前端"送按钮没反应"先看 backend log；如果 backend 收到了 POST 全 400，
   是 actor/org 解析问题，不是前端 bug
3. **空 organizations 表 = X-Organization-Id 永远不注入**，因为 OrganizationContext
   有"必须 select 一个 org 才发请求"的隐式契约
4. **跟 [ERR-20260518-001](ERR-20260518-001-slot-reclaim-drift.md) 的关系**：那条说了 schema + extension + npm 漂移；
   这条补「数据层漂移」—— seed 不全。slot 复用清场要做完**三件事**：schema reset / 依赖
   reinstall / 业务 seed（含 organization）

## 关联

- [ERR-20260518-001](ERR-20260518-001-slot-reclaim-drift.md)：slot 复用清场标准动作（schema + ext + npm）
- [ERR-20260518-002](ERR-20260518-002-prisma-migrate-dev-drift-pollution.md)：migrate dev 漂移污染
- [ERR-20260518-003](ERR-20260518-003-react-onclick-default-param.md)：本次发现路径的副产物（onClick={onSend} 也是同一对话里修的）
- CLAUDE.md「本地启动约定」：当前 6 步流程未含 organization seed
