# BUG 专项逐行走读 — Batch 4（2026-06-04）

**标准**: `docs/project/line-walk-audit-standard.md` · 八类仅列 **BUG**

## 范围（5 文件，全文 Read）

| 文件 | N | Read |
|------|---|------|
| `server/api/sync_v2.py` | file-ops / browse / files | 125–280, 73–90 |
| `server/api/files.py` | 78 | GET browse + ETag |
| `server/background/heartbeat_flush.py` | 97 | 1–97 |
| `frontend/src/composables/push/usePushProgress.ts` | 289 | 全流程 |
| `server/api/schemas.py` | SyncFiles | batch_id |

---

## Step 3 规则扫描（BUG 相关）

| 文件 | 命中 |
|------|------|
| sync_v2.py | file-ops 后 ETag、batch_id |
| files.py | 304 缓存与变更一致性 |
| heartbeat_flush.py | 每 key 一 session、孤儿 key |
| usePushProgress.ts | WS 与 POST 时序 |
| schemas.py | batch_id 校验 |

---

## Closure 表（BUG）

| 文件 | 行号 | 判定 | 严重度 | 理由 |
|------|------|------|--------|------|
| usePushProgress.ts | 184-194 | **FINDING** | P1 | POST 阻塞至推送结束才连 WS，进度事件全部丢失 |
| sync_v2.py | 125-182 | **FINDING** | P2 | 远程 file-ops 后未 `invalidate_browse_cache`，304 陈旧目录 |
| heartbeat_flush.py | 57-89 | **FINDING** | P2 | 每服务器独立 session/commit；已删服务器仍计 flushed |
| files.py | 39-77 | SAFE | — | 只读 browse；失效由 mutation 侧负责 |
| sync_v2.py | 73-90 | SAFE | — | 同步 API 本身无 ETag |

---

## FINDING 列表

### BUG-06-04-08 · P1 · usePushProgress.ts

**现象**：`/sync/files` 在服务端同步执行完毕才返回，客户端却在返回后才连接 `/ws/sync`，实时 `sync_progress` 全部错过；界面长期 pending 直至 300s 超时。

**修复**：客户端预生成 `batch_id` → 等待 WS `onopen` → POST 携带 `batch_id`；响应 `results` 作兜底合并。

### BUG-06-04-09 · P2 · sync_v2 file-ops

**现象**：删除/重命名/mkdir/剪贴板后 GET browse 仍可能 304。

**修复**：`invalidate_browse_cache(server_id, parent_dir)`。

### BUG-06-04-10 · P2 · heartbeat_flush.py

**现象**：2000 台时 2000 次 commit；已删服务器 UPDATE 0 行仍计入 flushed。

**修复**：单 session 批量 UPDATE + `rowcount` 统计。

---

## Step 7 统计

```
usePushProgress.ts        1 FINDING（已修）
sync_v2.py                1 FINDING（已修）
heartbeat_flush.py        1 FINDING（已修）
files.py                    0
```

## Step 8 DoD

- [x] 5 文件覆盖
- [x] Closure 全表
- [x] 3 项已修 + pytest

## 验证

```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 --tb=no
cd frontend && npm run type-check
```

Changelog: `docs/changelog/2026-06-04-bug-batch4-push-etag-heartbeat.md`

## 下一批（BUG）

- `server/api/sync_v2.py` 上传/远程写文件路径
- `server/background/self_monitor.py`
- Agent 心跳与 Redis TTL 一致性抽测
