# 审计 — Servers 搜索手动触发与 null 修复

## 范围（文件清单）

| 文件 | 变更 |
|------|------|
| `frontend/src/composables/useServerSearchHistory.ts` | 仅加载历史、不恢复 last；record null 安全 |
| `frontend/src/composables/useServerPagination.ts` | search null 安全 trim |
| `frontend/src/pages/ServersPage.vue` | searchDraft + 回车/下拉/清空才搜索 |
| `server/utils/validation_errors_zh.py` | 422 剥离不可序列化 ctx |

## Step 3 规则扫描

| H | 规则 | 结论 |
|---|------|------|
| H1 | 进页不自动过滤 | PASS — refresh 重置 search |
| H2 | 无静默吞错 | PASS — record/load 失败非阻塞 |
| H3 | 422 可 JSON 序列化 | PASS — ctx 不写入响应 |

## Closure

| H | 判定 | 依据 |
|---|------|------|
| H1 | PASS | loadHistoryOnly 不写 search |
| H2 | PASS | try/catch 保留 |
| H3 | PASS | translate_validation_errors |

## DoD

- [x] npm run type-check
- [x] changelog 2026-06-11-servers-search-manual-trigger.md
- [x] 进页全量列表；手动搜索才请求

## 验证

Servers 页进入 → 无搜索 chip；下拉选历史或回车 → 过滤；清空 → 全量。
