# Changelog — BUG Batch 4：推送进度 WS / 浏览缓存 / 心跳 flush（2026-06-04）

## 摘要

修复推送页 WebSocket 进度永远收不到、远程文件操作后目录 ETag 304 陈旧、以及心跳 flush 每服务器单独事务的三处问题。

## 动机

- `POST /sync/files` 阻塞到推送结束，原前端在 POST 返回后才连 `/ws/sync`，所有 `sync_progress` 已发完。
- `file-ops` / 剪贴板变更远程目录后未失效服务端 browse ETag 缓存。
- `heartbeat_flush` 对每台服务器 `commit()` 一次，且对已删除服务器的空 UPDATE 仍计入成功。

## 变更

| 文件 | 说明 |
|------|------|
| `server/api/schemas.py` | `SyncFiles.batch_id`（12 位 hex，可选） |
| `server/application/services/sync_engine_v2.py` | 接受客户端 `batch_id` |
| `server/api/sync_v2.py` | 透传 `batch_id`；file-ops/clipboard 后 `invalidate_browse_cache` |
| `server/background/heartbeat_flush.py` | 单 session 批量提交；`rowcount` 统计 |
| `frontend/src/composables/push/usePushProgress.ts` | 先连 WS 再 POST；HTTP `results` 兜底 |
| `tests/test_sync_batch_id.py` | batch_id 校验单测 |
| `docs/reports/audit-bug-line-walk-2026-06-04-batch4.md` | BUG Batch 4 报告 |

## 迁移 / 重启

- 需重启 `nexus`；前端需重新 `vite build` 后部署 `web/app/`。
- 无 DB 迁移。

## 验证

```bash
ruff check server/api/sync_v2.py server/background/heartbeat_flush.py server/api/schemas.py
pytest tests/test_sync_batch_id.py tests/ -q
cd frontend && npm run type-check
```

## 关联

- Batch 3：`docs/changelog/2026-06-04-bug-batch3-retry-sync-stats.md`
