# TODO — 项目审查问题跟踪
## 🔴 严重
- [x] **发现模块时钟同步缺陷** — `src/discovery.rs:37,58`:`register` 存的是发送者的 `hb.timestamp`,`cleanup` 用的是接收者本地 `now_ms`。两个节点时钟偏差 >10s 会导致误清除或僵尸节点。修复:存接收者收到心跳时的本地时间。
- [x] **`PubSubManager.pubs` 死代码** — `src/comms.rs:39,225,269`:`pubs` HashMap 初始化后从未填充,非 `"self"` 的 publisher 永远报错。要么实现外部 publisher 连接,要么删除 `pubs` 和相关回退路径。
- [x] **FFI `pubsub_new` 失败时 registry 已消费** — `src/ffi.rs:407`:`Box::from_raw(registry)` 在 `PubSubManager::new` 调用前就接管了所有权,失败时 registry 已释放但调用方不知道。改成成功后再消费。
## 🟡 中等
- [x] **`try_recv_raw` 实际阻塞 100ms** — `src/comms.rs:126`:SUB socket 设了 `set_rcvtimeo(100)`,每次调用最多阻塞 100ms。改为 `set_rcvtimeo(0)`。
- [x] **发现后台线程无优雅退出机制** — `src/discovery.rs:99,124`:两个 `thread::spawn` 裸 `loop`。添加 `ServiceRegistry.shutdown()` + `AtomicBool`。
- [x] **`load_config_typed` 多余的字符串往返** — `src/config.rs:61-63`:`toml::to_string` → `toml::from_str`,而 `reload_dynamic` 用的是 `try_into`。统一为 `try_into`。
- [x] **心跳序列化/发送失败静默吞掉** — `src/discovery.rs:114-118`:错误被完全忽略。改为 `warn!` 日志。
- [x] **`init_logging` 可被多次调用导致 panic** — `src/lib.rs:14-19`:`tracing_subscriber::init` 第二次调用会 panic。添加 `std::sync::Once`。
## 🟢 轻微
- [x] **测试覆盖率极低** — 已从 2 个测试增加到 14 个(config 解析 6、discovery 3、time_sync 4、ffi 1)。
- [x] **速率限制 `last_publish` / `last_sub_poll` 无限增长** — 添加 `trim_stale_rate_entries`,当 map >64 条目时清理 60s 前的记录。
- [x] **`StaticBase` 缺少输入合法性校验** — `PubSubManager::new` 中验证所有 publisher 值必须为 `"self"`。
- [ ] **注册表移除节点后 SUB socket 未断开** — ZMQ 自动重连会持续占资源。需要跟踪 sub→target 映射并在 cleanup 时断开。(留待后续)
## 🔴 审查中额外发现
- [x] **`TimeSynchronizer::now_corrected_ms` 偏移符号反了** — `src/time_sync.rs:62-67`:`offset = local - master`,修正时间应是 `local - offset` 才能得到 master 时间,原代码在 offset>=0 时加 offset、offset<0 时减 abs,导致修正后离 master 更远。改为 `now.saturating_add_signed(-offset)`。
## ✅ 已解决
- [x] **冗余依赖 `tokio`** — 已从 Cargo.toml 删除
- [x] **冗余依赖 `time`** — 已从 Cargo.toml 删除