# Changelog — BUG Batch 5：心跳 TTL / 远程写 ETag（2026-06-04）

## 摘要

将 Agent 心跳 Redis TTL 调整为 flush 间隔的 1.5 倍，并补全远程写/chmod/压缩/解压后的 browse ETag 失效。

## 动机

- 注释要求 TTL 大于 10min flush，但 `REDIS_KEY_EXPIRE` 与 `FLUSH_INTERVAL` 同为 600s，停 Agent 后 key 可能先过期。
- Batch 4 仅覆盖 file-ops/upload/clipboard，写文件与 chmod 等仍会导致目录列表 304 陈旧。

## 变更

| 文件 | 说明 |
|------|------|
| `server/api/agent.py` | `REDIS_KEY_EXPIRE = int(FLUSH_INTERVAL * 1.5)` |
| `server/background/heartbeat_flush.py` | 移除重复 TTL 常量，注释指向 agent |
| `server/application/services/files_browse_service.py` | `invalidate_browse_parents()` |
| `server/api/sync_v2.py` | write/chmod/compress/decompress 后失效父目录缓存 |
| `server/background/self_monitor.py` | debug 日志增加 `ws_sync_clients` |
| `tests/test_agent_heartbeat_ttl.py` | TTL > flush 断言 |
| `tests/test_files_browse_etag.py` | `invalidate_browse_parents` 单测 |

## 迁移 / 重启

- 需重启 `nexus`。
- 无 DB 迁移；已有 Redis key 在下次心跳时刷新 TTL。

## 验证

```bash
ruff check server/api/agent.py server/api/sync_v2.py
pytest tests/test_agent_heartbeat_ttl.py tests/test_files_browse_etag.py tests/ -q
```

## 关联

- Batch 4：`docs/changelog/2026-06-04-bug-batch4-push-etag-heartbeat.md`
