# 推送页重构 Batch 0 + Batch 1

**日期**: 2026-06-02

## 变更摘要

- **B0（后端热修复）**：修复推送历史无法落库终态、rsync 统计未写入、重试误判成功、`max_retries` 默认值。
- **B1（前端 Critical）**：合并进度 UI、修复全选/预览/WS 字段映射、取消状态、表单校验与重入保护。

## 动机

推送页存在 S1 级缺陷（`sync_log_repo.update` 缺失导致历史永远 `running`）及多处前后端契约不一致；按设计文档分批先交付 B0+B1。

## 涉及文件

- `server/infrastructure/database/sync_log_repo.py`
- `server/application/services/sync_engine_v2.py`
- `server/background/retry_runner.py`
- `server/domain/models/__init__.py`
- `frontend/src/pages/PushPage.vue`
- `docs/design/plans/2026-06-02-push-refactor.md`

## 迁移 / 重启

- 需重启 `nexus` Supervisor 进程以加载后端改动。
- 前端需重新 `npm run build` 并部署 `web/app/`。

## 验证方式

```bash
ruff check server/infrastructure/database/sync_log_repo.py server/application/services/sync_engine_v2.py server/background/retry_runner.py
cd frontend && npm run build-only
```

- 推送多台服务器：进度列表应出现「同步中」→ 成功/失败，失败行显示 `error_message`。
- 推送历史新记录 `status` 应为 `success`/`failed`，非长期 `running`。
- 预览对话框显示文件数与传输大小。

## 后续批次

- B2：移除冗余 fallback、M8 `get_by_ids`、M9 临时目录清理
- B3：历史表列与 `PushItem` 类型对齐
- B4/B5：体验与 composable 拆分
