# user-system review 修复收口（2026-05-28）

## 结论
本轮已完成 review 报告相关最高优先级前端/E2E blocker 修复，并完成后端、前端、E2E 三层验证。

当前状态：
- 最高优先级 blocker：已修复
- Go 全量测试：通过
- 前端全量测试：通过（82 files, 522 tests）
- Playwright CDP 全链路 E2E：通过

## 本轮修复项

### 1. 会话恢复 / refresh 竞态
- 问题：`AuthProvider` 初始恢复会话与 HTTP client 401 重试路径会并发触发 `/auth/refresh`，在 refresh token 轮换模型下导致 `401`。
- 修复：前端改为共享 single-flight refresh。
- 涉及文件：
  - `frontend/admin/src/lib/http/client.ts`
  - `frontend/admin/src/services/auth.ts`
  - `frontend/admin/src/services/auth.test.ts`

### 2. 用户列表响应结构漂移
- 问题：后端 `/users` 返回 `{ users, total, limit, offset }`，前端只按 `items` 读取，导致页面空表。
- 修复：增加 users 列表 normalize，兼容 `items/users` 和 `page_size/limit/offset`。
- 涉及文件：
  - `frontend/admin/src/services/users.ts`
  - `frontend/admin/src/services/users.test.ts`

### 3. Webhooks 列表响应结构漂移
- 问题：Webhooks 页加载时报 `Cannot read properties of undefined (reading 'map')`。
- 修复：兼容 `data/items/webhooks` 多种列表包裹形状。
- 涉及文件：
  - `frontend/admin/src/services/webhooks.ts`
  - `frontend/admin/src/services/webhooks.test.ts`

### 4. Social accounts 响应结构漂移
- 问题：ProfileSecurityPage 报 `socialAccounts.map is not a function`。
- 修复：兼容 `array/items/accounts/social_accounts` 形状。
- 涉及文件：
  - `frontend/admin/src/services/social-accounts.ts`
  - `frontend/admin/src/services/social-accounts.test.ts`

### 5. Playwright CDP E2E harness 漂移
- 修复点包括：
  - refresh token 断言从可读 cookie 改为 HttpOnly cookie / session presence 真相
  - `创建用员` 文案 typo
  - responsive 场景后 viewport 未恢复
  - drawer 选择器 strict mode 冲突
  - delete confirm 由 modal 漂移为 popconfirm
  - 菜单分组/路由漂移：设备、审计日志、Webhooks、profile/security
  - 多处页面断言从宽文本改为更稳定选择器
- 涉及文件：
  - `frontend/admin/scripts/run-playwright-cdp-e2e.mjs`
  - `frontend/admin/scripts/run-playwright-auth-e2e.sh`

### 6. E2E 限流误伤
- 问题：测试流量触发 API rate limit，导致后续场景误报。
- 修复：为 E2E backend 增加 `DISABLE_RATE_LIMIT=1` 开关，仅用于测试启动脚本。
- 涉及文件：
  - `internal/api/middleware/ratelimit.go`
  - `frontend/admin/scripts/run-playwright-auth-e2e.sh`

## 验证结果

### 后端
- 命令：`go test ./...`
- 结果：通过

### 前端
- 命令：`npm test -- --runInBand`
- 结果：通过
- 统计：`82 passed`, `522 passed`

### E2E
- 命令：`npm run e2e:full`
- 结果：通过
- 结论：`Playwright CDP E2E completed successfully`

## 闭环判断

### 实现闭环
已完成。本轮识别出的真实 blocker 均已修复。

### 证据闭环
已完成。Go 全量测试、前端全量测试、CDP E2E 全部通过。

### 文档真相闭环
已完成。本文件记录了问题、修复、验证与当前结论。

### 防复发闭环
已部分完成：
- 已为 users/webhooks/social-accounts 响应结构漂移补 service-level normalize + tests
- 已把 refresh 单飞与 E2E harness 漂移修复固化
- 后续建议：把 E2E 页面导航/断言进一步抽象为页面对象或稳定 helper，减少文案/菜单变动带来的连锁断言漂移
